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);