BadPaddingException:执行会话密钥的RSA加密时,数据必须以零开头

时间:2013-12-15 18:08:03

标签: java encryption

我有这部分RSA解密代码:

// Turn the encoded key into a real RSA private key.
// Private keys are encoded in PKCS#8.
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

// Create a cipher using that key to initialize it
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

// Read in the encrypted bytes of the session key
DataInputStream dis = new DataInputStream(new FileInputStream(fileInput));
byte[] encryptedKeyBytes = new byte[dis.readInt()];
dis.readFully(encryptedKeyBytes);

// Decrypt the session key bytes.
rsaCipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] rijndaelKeyBytes = rsaCipher.doFinal(encryptedKeyBytes);

// Transform the key bytes into an actual key.
SecretKey rijndaelKey = new SecretKeySpec(rijndaelKeyBytes, "Rijndael");

当我选择私钥文件时出现错误,我通过会话密钥对其进行加密,以对主文件进行非对称加密:

  

javax.crypto.BadPaddingException:数据必须以零开头

如何解决此错误?

1 个答案:

答案 0 :(得分:0)

你的问题表明存在一些误解:

  

当我选择私钥文件时出现错误,我通过会话密钥对其进行加密,以对主文件进行非对称加密:

因此,上述代码使用 RSA私钥解密会话密钥。然后,会话密钥可用于解密数据。因此,您需要使用新的随机会话密钥加密数据,然后使用 RSA公钥加密会话密钥

您通常不应为任何其他实体加密RSA私钥。 RSA私钥应该保密。您只需加密它们以便在密钥存储中进行备份或保护。