2
我想使用java對RSA公鑰加密DSA私鑰。但是,當我這樣做時,出現此錯誤:使用RSA公鑰加密DSA私鑰
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;
}
,我調用此函數與RSA公鑰加密DSA密鑰:
PrivateKey WSK = Crypto.generateDSAKey().getPrivate();
encWSK = encryptRSA(WSK.getEncoded(), RSAPublicKey);
或者他可以加密x值併發送未加密的域參數。 – 2013-05-13 21:19:45