3

Java を使用して DSA 秘密鍵を RSA 公開鍵で暗号化したいと考えています。ただし、そうすると、次のエラーが発生します。

javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes
  at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:337)
  at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382)

DSA および RSA キー サイズは、それぞれ 1024 および 2048 に設定されます。RSA を使用すると、RSA キーのサイズを超えるサイズのメッセージを暗号化できないことはわかっています。ただし、この場合、DSA キーのサイズは RSA キーのサイズよりも小さくなります。

問題は getEncode() 関数に関連していると思います。この関数の戻り値を確認したところ、結果のサイズが 335 バイトであることがわかりました。

この問題を解決する方法を知りたいですか? (RSAのキーサイズを増やしたくありません)。DSA キーのサイズを 1024 に設定しました。エンコード後の DSA キーのサイズが 335 バイトになるのはなぜですか?

DSA および RSA キー生成機能と RSA 暗号化機能は次のとおりです。

public static KeyPair generateDSAKey() {
    KeyPair pair = null;
    try {
        KeyPairGenerator keyGen = KeyPairGenerator
                .getInstance("DSA", "SUN");
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
        keyGen.initialize(1024, random);
        pair = keyGen.generateKeyPair();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return pair;
}
public static KeyPair generateRSAKey() {
    KeyPairGenerator kpg;
    KeyPair kp = null;
    try {
        kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(2048);
        kp = kpg.genKeyPair();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return kp;
}

public static byte[] encryptRSA(byte[] msg, PublicKey pubKey) {
    byte[] cipherData = null;
    try {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        cipherData = cipher.doFinal(msg);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return cipherData;
}

DSA キーを RSA 公開キーで暗号化するために、この関数を呼び出します。

PrivateKey WSK = Crypto.generateDSAKey().getPrivate();
encWSK = encryptRSA(WSK.getEncoded(), RSAPublicKey);
4

1 に答える 1

2

DSA 秘密鍵には、アルゴリズム パラメータとx値が含まれています。以下は、stdout に出力される秘密鍵の例です。

Sun DSA Private Key 
parameters:
    p:
    fd7f5381 1d751229 52df4a9c 2eece4e7 f611b752 3cef4400 c31e3f80 b6512669
    455d4022 51fb593d 8d58fabf c5f5ba30 f6cb9b55 6cd7813b 801d346f f26660b7
    6b9950a5 a49f9fe8 047b1022 c24fbba9 d7feb7c6 1bf83b57 e7c6a8a6 150f04fb
    83f6d3c5 1ec30235 54135a16 9132f675 f3ae2b61 d72aeff2 2203199d d14801c7
    q:
    9760508f 15230bcc b292b982 a2eb840b f0581cf5
    g:
    f7e1a085 d69b3dde cbbcab5c 36b857b9 7994afbb fa3aea82 f9574c0b 3d078267
    5159578e bad4594f e6710710 8180b449 167123e8 4c281613 b7cf0932 8cc8a6e1
    3c167a8b 547c8d28 e0a3ae1e 2bb3a675 916ea37f 0bfa2135 62f1fb62 7a01243b
    cca4f1be a8519089 a883dfe1 5ae59f06 928b665e 807b5525 64014c3b fecf492a

x:     1f853beb d6e30242 cd12bd28 e7055830 22ac43a8

xを単純に暗号化することもできますが、これは、受信者がアルゴリズム パラメータpq、およびgを既に知っていることを前提としています。

または、暗号化されたx値と暗号化されていないパラメーターを送信できます ( GregS に感謝します)。

于 2013-05-13T19:28:55.830 に答える