我有一个 AES 加密的字节数组。当我在java应用程序中解密这个数组时,一切都很好。但在servlet容器中,解密错误。
这是我的字节数组
String [] str = new String[] {"41", "23", "67" ,"-124", "-56" ,"-35" ,"89", "-54" ,"-17" ,"-49" ,"-53", "-21" ,"125" ,"4", "98", "-13", "60" ,"-72", "12", "75" ,"-105" ,"-104", "107", "34", "1", "-109", "-19", "-102", "-72", "9" ,"26" ,"-39", "-60", "-15", "0" ,"112", "-5", "-86", "-7", "5" ,"75", "100" ,"94", "-47", "6", "-81", "-22", "82", "97" ,"114", "3", "-24", "-80", "67", "106", "-100" ,"-35", "-83", "54", "-95", "124", "-22", "-100", "-47" };
byte [] inv = new byte[str.length];
int count = 0;
for (String s : str) {
inv[count++] = Byte.valueOf(s);
}
Java应用程序的结果
Decrypted: 000000.016*kWh|000000.007*kWh|000000.015*kWh|000000.000*kWh
我的应用程序代码
byte[] keyBytes = "vikoAmrPass12345".getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key);
byte [] out = cipher.doFinal(inv);
System.out.println("Decrypted: " +new String(out));
我的适用于 servlet 容器的 Web 代码与上面的代码绝对相同。 但容器解密的结果是
'?f ??0??????b]5hJ?F*`U????.8??p@?]?u?~Nb??z?????{3??;?
这里出了什么问题?
在我的应用程序中,我得到了加密的字节数组
ServerSocket ss = new ServetSocket(port);
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
byte [] sizeBuffer = new byte[5];
in.read(sizeBuffer);
byte [] dataBuffer = new byte[Integer.valueOf(""+new String(sizeBuffer)];
in.read(dataBuffer);
加密数据存在于dataBuffer数组中。并在嵌入式设备中处理加密。
我的配置
Java 1.6 Tomcat 7.1谢谢。
最佳答案
根据您发布的代码:
byte[] keyBytes = "vikoAmrPass12345".getBytes();
这可能就是问题所在。如果您希望在多个位置获得相同的结果,则永远不应该使用平台默认编码。始终指定编码。
如果您这样做了,也可能您在传输加密数据的方式上遇到了问题。如果您要从中创建字符串,那么您几乎肯定应该使用 Base64,例如与 this library 。如果您使用的是:
// Bad! Do not use!
String encryptedText = new String(encryptedData);
那么这基本上会丢失信息,并且很可能是问题的原因。
编辑:好的,现在我们知道您的接收代码是:
ServerSocket ss = new ServetSocket(port);
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
byte [] sizeBuffer = new byte[5];
in.read(sizeBuffer);
byte [] dataBuffer = new byte[Integer.valueOf(""+new String(sizeBuffer)];
in.read(dataBuffer);
这里你至少遇到三个问题:
- 您的代码不可能处理超过 99999 字节的数据,并且不清楚您希望它如何处理少于 10000 字节的数据。
- 您再次假设默认字符编码在各个平台上是一致的
- 您的代码假设每次调用
read
时,都会读取确切数量的信息。很有可能不会,特别是对于网络流。您应该使用read
的返回值来查看实际已读取了多少内容。您要么需要循环,直到读取完所需的所有数据(或用完流中的数据),要么使用更高级别的 API 来执行相同的操作。
关于java - Tomcat 解密 aes 与 Java 主应用程序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11924988/