4

.NET 環境と互換性のある xml ベースの RSA キー ( private 、public ) を生成する方法。PHPでphpseclibモジュールを試しました。ただし、.NET には対応していません。Java で xml ベースの RSA キーを生成する方法を教えてください。実際、私は Linux ベースのシステムに取り組んでいます。これらのキーを使用して、暗号化と復号化の操作を実行します。お気に入り

<RSAKeyValue>
    <Modulus>4hjg1ibWXHIlH...ssmlBfMAListzrgk=</Modulus>
    <Exponent>AQAB</Exponent>
    <P>8QZCtrmJcr9uW7VRex+diH...jLHV5StmuBs1+vZZAQ==</P>
    <Q>8CUvJTv...yeDszMWNCQ==</Q>
    <DP>elh2Nv...cygE3657AQ==</DP>
    <DQ>MBUh5XC...+PfiMfX0EQ==</DQ>
    <InverseQ>oxvsj4WCbQ....LyjggXg==</InverseQ>
    <D>KrhmqzAVasx...uxQ5VGZmZ6yOAE=</D>
</RSAKeyValue>
4

2 に答える 2

7

Java ではそのままでこれをサポートしていませんが、それでもかなり簡単です。まず、JCA を使用して RSA キー ペアを生成しますKeyPairGenerator

次に、秘密鍵を適切なインターフェイス ( CRT パーツにアクセスできるように RSAPrivateCrtKey代わりに使用) にキャストし、Base64 エンコーディングに Apache Commons Codec を使用する必要があります。RSAPrivateKey

public static void main(String[] args) throws Exception {
    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
    KeyPair keyPair = keyPairGen.genKeyPair();
    RSAPrivateCrtKey privKey = (RSAPrivateCrtKey) keyPair.getPrivate();

    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", n);
    write(builder, "Exponent", e);
    write(builder, "P", p);
    write(builder, "Q", q);
    write(builder, "DP", dp);
    write(builder, "DQ", dq);
    write(builder, "InverseQ", inverseQ);
    write(builder, "D", d);
    builder.append("</RSAKeyValue>");

    System.out.println(builder.toString());
}

private static void write(StringBuilder builder, String tag, BigInteger bigInt) {
    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) {
    return new String(Base64.encodeInteger(bigInt), "ASCII");
}

StringBuilder必要に応じて適切な XML API を使用できますが、この場合は使用しない理由はありません。また、BigIntegerインスタンスを自由にインライン化してください。Java メソッドと XML 要素の間のマッピングをより明確にするために、これらを変数として宣言しました。

于 2012-09-20T14:37:07.353 に答える
0

誰かが逆の操作をしたい場合 - xml ファイルで RSAPrivateCrtKey を取得し、正の符号パラメータで BigInteger のインスタンスを作成することを忘れないでください。

new BigInteger(1, Base64.getDecoder().decode(encodedBigInteger));

潜在的な例外を回避します

java.security.SignatureException: Could not sign data
    at sun.security.rsa.RSASignature.engineSign(RSASignature.java:178)
    at java.security.Signature$Delegate.engineSign(Signature.java:1207)
    at java.security.Signature.sign(Signature.java:579)
    ... more
Caused by: javax.crypto.BadPaddingException: Message is larger than modulus
    at sun.security.rsa.RSACore.parseMsg(RSACore.java:214)
    at sun.security.rsa.RSACore.crtCrypt(RSACore.java:166)
    at sun.security.rsa.RSACore.rsa(RSACore.java:122)
    at sun.security.rsa.RSASignature.engineSign(RSASignature.java:175)
    ... 6 more
于 2019-01-10T11:22:28.847 に答える