Java 字节[]到字符串返回不同的字符串

Java 字节[]到字符串返回不同的字符串,java,android,string,encryption,bytearray,Java,Android,String,Encryption,Bytearray,对于给定的字节[],总是相同的,我想得到相应的字符串。字节[]结果始终具有相同的值 然而,返回的字符串从来都不一样,每次我启动我的应用程序,结果都会改变 byte[] results = cipher.doFinal(text.getBytes("UTF-8")); String result = Base64.encodeBase64String(results); 我尝试了几种其他方法来获取字符串,比如stringresult=newstring(结果,“UTF-8”),带有数组,。。。

对于给定的字节[],总是相同的,我想得到相应的字符串。
字节[]结果始终具有相同的值

然而,返回的字符串从来都不一样,每次我启动我的应用程序,结果都会改变

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

String result = Base64.encodeBase64String(results);
我尝试了几种其他方法来获取字符串,比如
stringresult=newstring(结果,“UTF-8”),带有
数组
,。。。但每次都不一样

这是在加密后发生的。以下是完整的代码:

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;

如何确保字符串“result”保持不变

每次加密时都使用不同的IV,因此每次加密时也会得到不同的密文。您的
结果
字节数组每次都不同,因此base64表示法不同


如果您真的希望每次加密相同的输入时得到相同的结果,那么每次都需要使用相同的IV。。。但请注意,这将大大降低安全性。(请注意,目前您甚至没有使用
ivSpec
执行任何操作。您可能希望将其作为第三个参数传递给
Cipher.init
…但您希望在使用IV初始化它之后执行此操作,而不仅仅是使用
null

字节数组每次都不同吗?不,精确地说,字节数组保持不变。什么是
Base64
?你有它的文档链接吗?为什么你不使用作为Android一部分的Base64类呢?(这里的问题不是base64转换-而是密码…)您给出的代码还有另一个问题-您要求的只是“AES”作为密码,而是创建AES256密钥。那不行-至少在我的机器上不行。创建一个带有“AES”的密钥是有效的——然后每次提供一个具有相同IV字节的IV规范,每次都会得到相同的结果。但是由于IvParameterSpec设置为null,那么每次都应该是相同的,对吗?同样使用日志,字节[]results.toString()似乎总是相同的。@Virthuss:不,因为a)您无论如何都没有使用它,b)我希望null表示“生成一个新的”。在
字节[]
上调用
toString()
也不表示其中的数据-如果这就是您一直依赖的结果,您应该问问自己您认为看到的是什么表示形式。试着将
结果中的每个字节都转储掉
…我如何确保IV保持不变?给它分配一个固定字节[]或null并将其添加为第三个参数并不会阻止最终结果的更改…@Virthuss:如果您发布了一个简短但完整的示例,那么我很容易测试该断言。我怀疑如果你用一个固定字节数组初始化它,你会得到同样的结果。。。但是,从您发布的内容到完整的程序来演示这一点需要一些时间。如果你编辑问题使之更容易,它将更容易帮助你。。。看,我认为更改的字符串来自Base64,但我检查byte[]值的方式似乎不是最好的,因为实际上每次都有一些不同。所以真正的问题是你提到的静脉注射和我使用它的糟糕方式。。。非常感谢!:)