byte [] to String返回不同的String

时间:2015-11-10 06:59:21

标签: java android string encryption bytearray

对于给定的byte [],总是一样的,我想得到相应的String。 byte[] result始终具有相同的值。

但是返回的字符串永远不会相同,每次启动我的应用程序时结果都会改变。

byte[] results = cipher.doFinal(text.getBytes("UTF-8"));

String result = Base64.encodeBase64String(results);

我尝试了其他几种方法来获取我的字符串String result = new String(results, "UTF-8");Array,...但每次都保持不同。

密码加密后会发生这种情况。这是完整的代码:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5padding");
byte[] keyBuf= new byte[16];

byte[] b= key.getBytes("UTF-8");
int len= b.length;
if (len > keyBuf.length) len = keyBuf.length;

System.arraycopy(b, 0, keyBuf, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBuf, "AES256");


byte[] ivBuf= new byte[16];
            //IvParameterSpec ivSpec = new IvParameterSpec(ivBuf);
IvParameterSpec ivSpec=null; 

cipher.init(Cipher.ENCRYPT_MODE, keySpec);

byte[] results = cipher.doFinal(text.getBytes("UTF-8"));

String result = Base64.encodeBase64String(results);
return result;

如何确保字符串“结果”保持不变?

1 个答案:

答案 0 :(得分:3)

每次加密时都使用不同的IV - 因此每次加密时都会得到不同的密文。您的results字节数组每次都不同,因此base64表示形式不同。

如果您确实希望每次加密相同的输入时获得相同的结果,则每次都需要使用相同的IV ...但请注意,这会显着降低安全性。 (注意,目前你甚至没有对ivSpec做任何事情。你可能想把它作为第三个参数传递给Cipher.init ......但是你想要用它来初始化它IV,不只是使用null。)