Tomcat解密aes与Java Main应用程序不同

时间:2012-08-12 19:04:56

标签: java encryption aes

我有一个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 Application的结果

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

感谢。

1 个答案:

答案 0 :(得分:2)

根据您发布的代码:

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来执行相同的操作。