BadPaddingException : 数据必须从零开始

Posted

技术标签:

【中文标题】BadPaddingException : 数据必须从零开始【英文标题】:BadPaddingException : Data must start with zero 【发布时间】:2013-09-14 22:36:24 【问题描述】:

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

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

【问题讨论】:

能否包含异常堆栈跟踪? 您是否确认您打算发送的字节与您尝试在客户端解密的字节完全相同? @agerrr,另外说明,您应该使用公钥加密并使用私钥解密。否则,拥有您公钥的每个人都可以解密您的消息。 【参考方案1】:

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

【讨论】:

以上是关于BadPaddingException : 数据必须从零开始的主要内容,如果未能解决你的问题,请参考以下文章

加密/解密 - iphone 到 java - BadPaddingException:给定最终块未正确填充

为啥解密时会出现“BadPaddingException”?

关于javax.crypto.BadPaddingException: Blocktype错误的几种解决方法

javax.crypto.BadPaddingException:给定最终块没有正确填充Exception

RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

RSA解密时BadPaddingException解决方法