我用 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 和 message 是一样的,一切正常。
然后我在客户端使用相同的代码进行加密,另外我使用以下方法将密文更改为字符串:
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。
我知道我在将字符串转换为字节数组时可能做错了,反之亦然,但我就是想不出正确的方法。请帮忙!