私はRSAと暗号化に不慣れで、RSAを使用してデータを暗号化および復号化する必要があります。キーペアを生成し、.key
XML形式のファイルに保存するJavaプログラムがあります(これは絶対に問題ありません。暗号化と復号化によってテストされました。 data)、次に.NETアプリケーションで使用したいので、暗号化と復号化に使用するキーをインポートしています。公開鍵はOKで、暗号化は問題なく実行されますが、秘密鍵のインポートは次の例外メッセージで失敗します
Bad data (CryptographicException.ThrowCryptogaphicException(Int32 hr))
これはエンコードされた公開鍵です。
<RSAKeyValue>
<Modulus>iFouk9viRs5dcvJCvDM1vXC4sBuSB9SPcdJhRyFLoNW/pka6MNAiu4cOksFRejiuM1ZswyJMy+ow
lmLflJ/XrfnUQxLwLp61oij4CrzHKl9jjHorqIA7uEQKY8RBiUjZ7kbO5nFaIWs1NWMVks8Srdhv
8pVd1sLKKUs66c/ndAk=</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
これはエンコードされた公開鍵です。
<RSAKeyValue>
<Modulus>iFouk9viRs5dcvJCvDM1vXC4sBuSB9SPcdJhRyFLoNW/pka6MNAiu4cOksFRejiuM1ZswyJMy+ow
lmLflJ/XrfnUQxLwLp61oij4CrzHKl9jjHorqIA7uEQKY8RBiUjZ7kbO5nFaIWs1NWMVks8Srdhv
8pVd1sLKKUs66c/ndAk=</Modulus>
<Exponent>AQAB</Exponent>
<P>AO9WnDNOt9Xewnoy8KTed56Z+3Nfto6J8wCXKzX3LhuuiKNUBe8qFoinrteQJq/9NAEXnNCafxDW
ThIkr9GtMxE=</P>
<Q>AJHYMk0bOEGZlQbaJk3VDovvOJuRt5NI3WtXWl1v5VUW6aQQO3rV3+3GSN6Xa3hTKXtCVVL26Awy
OkDykUPjQXk=</Q>
<DP>KIHsJfLowlXVbIE6oWzVqg49tKU6bJ2Ed1Eeix+uuhisH5iU+ImTDsXynaFUKu0b5CNu8w9y+hKL
XB7BcydxQQ==</DP>
<DQ>di267NIersF1idzhZvY62FdbBmx4VaeYi+93sPkH2wA7CI+CsxF1Z6XhzETkd9bjaRaiLx0VgTR+
Eby8y0bt+Q==</DQ>
<InverseQ>HYF8gahVyzsz0IotzKI2Oh53sJMZWVxsvzkhqGlDtY1THFGZE5j8kl/UK0+FSN6yOYxBIuKNZ7om
MgLQEMK1PQ==</InverseQ>
<D>DERQvGyjxsr6DUVOS7AvvYNOmklgseOlpA/RQJz2ONoCC+uBBLM07LoRzZImymAfC+9SiZukXRQM
mvr6MlzPAm04NWyZNzbjhLvmn1gmvDclDZ9X9bhYp8MBftPWU5PFBALOjVpD+mlbI2lTYCugf6pJ
MHEMe17mNJ0eWCerfAE=</D>
</RSAKeyValue>
秘密鍵の何が起こっているのか、何が悪いのかを理解するのを手伝ってください。
これは、問題を解決した後に正常に機能しているコードです:
private String getPublicKeyXml(RSAPublicKey pk) throws UnsupportedEncodingException {
StringBuilder builder = new StringBuilder();
builder.append("<RSAKeyValue>\n");
byte[] m = pk.getModulus().toByteArray();
byte[] mm = stripLeadingZeros(m);
write(builder, "Modulus", mm);
write(builder, "Exponent", pk.getPublicExponent());
builder.append("</RSAKeyValue>");
return builder.toString();
}
private String getPrivateKeyXml(PrivateKey pk) throws UnsupportedEncodingException {
RSAPrivateCrtKey privKey = (RSAPrivateCrtKey) pk;
BigInteger n = privKey.getModulus();
BigInteger e = privKey.getPublicExponent();
BigInteger d = privKey.getPrivateExponent();
BigInteger p = privKey.getPrimeP();
BigInteger q = privKey.getPrimeQ();
BigInteger dp = privKey.getPrimeExponentP();
BigInteger dq = privKey.getPrimeExponentQ();
BigInteger inverseQ = privKey.getCrtCoefficient();
StringBuilder builder = new StringBuilder();
builder.append("<RSAKeyValue>\n");
write(builder, "Modulus", stripLeadingZeros(n.toByteArray()));
write(builder, "Exponent", stripLeadingZeros(e.toByteArray()));
write(builder, "P", stripLeadingZeros(p.toByteArray()));
write(builder, "Q", stripLeadingZeros(q.toByteArray()));
write(builder, "DP", stripLeadingZeros(dp.toByteArray()));
write(builder, "DQ", stripLeadingZeros(dq.toByteArray()));
write(builder, "InverseQ", stripLeadingZeros(inverseQ.toByteArray()));
write(builder, "D", stripLeadingZeros(d.toByteArray()));
builder.append("</RSAKeyValue>");
return builder.toString();
}
private void write(StringBuilder builder, String tag, byte[] bigInt) throws UnsupportedEncodingException {
builder.append("\t<");
builder.append(tag);
builder.append(">");
builder.append(encode(bigInt).trim());
builder.append("</");
builder.append(tag);
builder.append(">\n");
}
private void write(StringBuilder builder, String tag, BigInteger bigInt) throws UnsupportedEncodingException {
builder.append("\t<");
builder.append(tag);
builder.append(">");
builder.append(encode(bigInt));
builder.append("</");
builder.append(tag);
builder.append(">\n");
}
private static String encode(BigInteger bigInt) throws UnsupportedEncodingException {
return new String(new sun.misc.BASE64Encoder().encode(bigInt.toByteArray()));
}
private static String encode(byte[] bigInt) throws UnsupportedEncodingException {
return new String(new sun.misc.BASE64Encoder().encode(bigInt));
}
private byte[] stripLeadingZeros(byte[] a) {
int lastZero = -1;
for (int i = 0; i < a.length; i++) {
if (a[i] == 0) {
lastZero = i;
} else {
break;
}
}
lastZero++;
byte[] result = new byte[a.length - lastZero];
System.arraycopy(a, lastZero, result, 0, result.length);
return result;
}