0

我用 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。

我知道我在将字符串转换为字节数组时可能做错了,反之亦然,但我就是想不出正确的方法。请帮忙!

4

1 回答 1

2

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

于 2013-09-11T03:40:07.537 回答