当我对长字符串使用(加密/解密)javax.crypto.Cipher类时,输出字符串中的某些字符无效。
//ecnryption
byte[] inputBytes = str.getBytes();
cypheredBytes = cipher.doFinal(inputString, 0, inputBytes, outputBytes, 0);
return new String(outputBytes, 0, cypheredBytes);
//decryption
byte[] inputBytes = str.getBytes();
cypheredBytes = cipher.doFinal (inputBytes, 0, inputBytes.length, outputBytes, 0);
return new String(outputBytes, 0, cypheredBytes);
答案 0 :(得分:1)
axtavt是正确的。问题是您无法将任意字节数组(cypheredBytes)转换为String。如果你真的需要它作为一个字符串(比如,通过线路发送),那么你需要把它变成像hex或Base 64这样的东西。你会在Commons Codecs中找到每个编解码器。
答案 1 :(得分:0)
我猜这是字符编码的问题。
以下转变可能不可逆:
String str = String(outputBytes, 0, cypheredBytes);
byte[] inputBytes = str.getBytes();
将加密邮件保留为byte[]
,而不是String
。
此外,以下行依赖于系统默认编码:
byte[] inputBytes = str.getBytes();
...
return new String(outputBytes, 0, cypheredBytes);
考虑显式编码规范:
byte[] inputBytes = str.getBytes("UTF-8");
...
return new String(outputBytes, 0, cypheredBytes, "UTF-8");