2 回答

TA贡献1804条经验 获得超8个赞
您的加密数据是一个字节序列。如果需要将其编码为字符串,则应使用 base64 或用于编码任意字节数组的类似编码。假装您的任意字节数组是有效的字符串编码会给您带来麻烦,即使您使用ISO_8859_1
.

TA贡献2039条经验 获得超7个赞
你的错误在这里:
encryptedStr = new String(encrBytes);
strToBeEncoded.getBytes();
这些方法使用平台默认字符集,并且当您从byte[]toString和 back转换时,在一般情况下byte[]是有损的。如果平台默认字符集是"ISO_8859_1".
我将所有 11 个这样的调用更改为:
encryptedStr = new String(encrBytes, StandardCharsets.ISO_8859_1);
strToBeEncoded.getBytes(StandardCharsets.ISO_8859_1);
(我没有改变CHARSET)。我现在得到的输出是:
initVector 长度 -> 16
输入长度 -> 48
AkhilRanjanBiharabcdefghijklmnopMovedtoChennai18
奖励警告 1:加密使用硬编码,"AES/CBC/NoPadding"但解密是动态的(当然也应该使用"AES/CBC/NoPadding")。
奖励警告2:机会是低,但它是完全可能的,"::"里面出现encrBytes,搞砸了你的str.split("::");。一种解决方案是搜索最后一次出现的"::"并且仅在其上进行拆分。
添加回答
举报