You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java RSA场景下字节数组转字符串后如何还原原字节数组?

解决字节数组转String传输后无法还原的问题

嘿,你这是踩了Java字节数组转字符串的经典坑!咱们先搞清楚问题出在哪,再给你靠谱的解决办法。

问题根源:cipherText.toString()完全不对

Java里数组的toString()方法根本不是把字节内容转换成字符串——它返回的是类似[B@1234abcd的字符串,其中[B表示这是字节数组类型,@后面的是对象的哈希码,完全没有包含任何字节数组的实际内容。你传输这个字符串过去,自然还原不了原始的加密字节数组。

而且就算你不用toString(),直接写new String(cipherText)也不行——加密后的字节数组里有大量不可打印的控制字符,用普通字符编码(比如UTF-8)转换时,这些字符会被替换成乱码或者直接丢失,导致还原的字节数组和原始的完全不一致。

正确解决方案:用Base64编码传输

Base64是专门用来把二进制数据转换成可打印ASCII字符串的编码方式,它能100%保留原始字节信息,传输后可以完美还原。

服务端(加密+编码)代码修改:

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, clefPrivee);
byte[] cipherText = cipher.doFinal(msgEnOctets);
// 用Base64把字节数组转成可安全传输的字符串
String encodedCipherText = Base64.getEncoder().encodeToString(cipherText);
// 传输encodedCipherText即可

接收端(解码+解密)代码:

// 拿到传输过来的encodedCipherText字符串
byte[] decodedCipherText = Base64.getDecoder().decode(encodedCipherText);
// 解密还原原始数据
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, clefPublique); // 对应私钥加密,这里用公钥解密
byte[] originalBytes = cipher.doFinal(decodedCipherText);

为什么Base64可行?

Base64会把每3个字节转换成4个可打印的ASCII字符(A-Z、a-z、0-9、+、/,还有填充用的=),所有二进制数据都能被安全转换成字符串,不会出现字符丢失或乱码的情况,解码时又能精确还原成原始字节数组。

这样修改后,你就能顺利完成加密字节数组的传输和还原了!

内容的提问来源于stack exchange,提问作者hunk tomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:37:40