BadPaddingException:数据必须以零开头

时间:2013-09-11 03:20:31

标签: java string encryption bytearray public-key-encryption

我使用RSA实现了数据加密/解密。如果我只是在本地加密/解密,它就可以工作,但是如果我发送加密数据,我会得到BadPaddingException:数据必须从零开始。

为了通过网络发送我的数据,我需要在客户端将它从字节数组更改为字符串(我在标头中发送),然后检索它并将其更改回服务器端的字节数组

这是我的本地加密/解密代码(我使用私钥加密,公钥解密):

// Encryption:
String message = "HELLO";
Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.ENCRYPT_MODE, privateKey);  // privateKey has type java.security.PrivateKey
byte [] encryptedBytes = rsa.doFinal(message.getBytes());

// Decryption:
rsa.init(Cipher.DECRYPT_MODE, publicKey); // type of publicKey: java.security.PublicKey
byte [] ciphertext = rsa.doFinal(encryptedBytes);

String decryptedString = new String(ciphertext, "UTF-8");

DecryptedString和消息是一样的,一切正常。

然后我在客户端使用相同的代码仅用于加密,我使用以下命令将密文更改为String:

String encryptedString = new String(ciphertext, "UTF-8");

在服务器端我做:

String message = request.getHeader("Message"); 
byte [] msgBytes = message.getBytes("UTF-8");

Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.DECRYPT_MODE, publicKey);
byte [] decryptedMsg = rsa.doFinal(msgBytes);

String decryptedString = new String(decryptedMsg, "UTF-8");

这不起作用,我得到BadPaddingException。

我尝试过使用不同的密码实例,例如“RSA / ECB / PKCS1Padding”或“RSA / ECB / NoPadding”,但这没有帮助。我也尝试使用BASE64转换字符串,但后来我得到了一个不同的异常:IllegalBlockSizeException。

我知道将字符串转换为字节数组可能会错误,反之亦然,但我无法弄清楚这样做的正确方法。请帮忙!

1 个答案:

答案 0 :(得分:2)

您不能只将任意二进制数据(加密文本)转换为字符串。如果要将数据作为文本发送,则需要使用某种二进制 - >文本编码,如Base64。

相关问题