我使用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。
我知道将字符串转换为字节数组可能会错误,反之亦然,但我无法弄清楚这样做的正确方法。请帮忙!
答案 0 :(得分:2)
您不能只将任意二进制数据(加密文本)转换为字符串。如果要将数据作为文本发送,则需要使用某种二进制 - >文本编码,如Base64。