当前位置: 首页 > 知识库问答 >
问题:

BadPaddingException:数据必须以零开头

毕魁
2023-03-14

我用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");

共有1个答案

越景天
2023-03-14

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

 类似资料:
  • 问题内容: 嘿,我不断出现错误: 索引(从零开始)必须大于或等于零且小于参数列表的大小。 我的代码: 问题答案: 你的第二个用途是一个占位符,但你只传递一个参数,所以你应该使用来代替。 更改此: 对此:

  • JSONException:JSONObject文本必须以字符6处的{开头。

  • 我有一个来自REST服务的JSON: 我正在使用java-json.jar来解析这个JSON,这是我试图传递到JSON字符串上方的简单片段: 但我得到了下面的例外: 首先,我假设这是因为JSON中的和字符,并尝试替换如下: 但即便如此,我也遇到了同样的例外。谁能指导我知道我做错了什么吗?

  • 我正在尝试解析一些json,这样我就可以得到json的不同部分。当我使用以下代码时 我得到了一个错误: 你知道为什么我会犯这个错误吗?我能够用在线json验证器验证json

  • 我正在JSBin上玩ReactJS框架。 我注意到,如果我的组件名称以小写字母开头,它就不起作用。 例如,以下内容不会呈现: 但只要我用替换它就会呈现。 我不能用小字母开始标签有什么原因吗?

  • 问题内容: 我有一个JSON文件,我正在尝试处理,但出现以下错误: 线程“主” org.json.JSONException中的异常:JSONObject文本必须在org.json.JSONObject的org.json.JSONTokener.syntaxError(JSONTokener.java:433)的1 [字符2行1]处以“ {”开头。(JSONObject.java:195)位于or