2013-09-11 113 views
0

我使用RSA实现了数据加密/解密。它工作,如果我只是在本地加密/解密,但是如果我发送我的加密数据,我得到BadPaddingException:数据必须从零开始。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 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

您可以包含异常堆栈跟踪吗? –

+0

您是否验证过您打算发送的字节与您尝试在客户端上解密的字节完全相同? –

+0

@agerrr,在另外一张纸条上,你应该用公钥加密并用私钥解密。否则,使用公钥的每个人都可以解密您的消息。 – gtrig

回答

2

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

相关问题