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
相关产品推荐
相关产品推荐

