2013-04-23 60 views
0

我已经通过我的web服务获得了一些编码值换款的IV。现在我必须解码这个编码的字符串并获取它的字节。解密失败对AES算法

现在我使用这个字节数组作为我的IV值,用AES算法解密一个值。但它并没有给我适当的输出而是抛出一些垃圾价值。

这是我的代码,

byte[] decoded = Base64.decodeBase64(((String) "MTIzNDU2Nzg5MTIzNDU2Nw==").getBytes()); 
    System.out.println(new String(decoded, "UTF-8") + "\n"); 

MTIzNDU2Nzg5MTIzNDU2Nw ==是从请求XML接收到的编码串。

现在解码将IV为被解密下一个数字,

String c = decrypt1("JHIlf4iXM53tgsKHQEv1dlsUTeLr5GP3LfSNGlWENkg=", decoded); 
    System.out.println(c); 

JHIlf4iXM53tgsKHQEv1dlsUTeLr5GP3LfSNGlWENkg =要被解密的数字。

 public static String decrypt1(Object data, byte[] ivBytes) throws InvalidKeyException, 
     InvalidAlgorithmParameterException, IllegalBlockSizeException, 
     BadPaddingException, UnsupportedEncodingException { 
      byte[] keyBytes = "keyPhrase".getBytes(); 
      Cipher cipher = null; 
      if (ivBytes.length<16) { 
       System.out.println("error" + ivBytes.length); 
       //ivBytes = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 100, 101, 102, 103}; 
      } 
     byte[] byteArr = null; 
     try { 
      SecretKey secretKey = new SecretKeySpec(keyBytes, "AES"); 
      cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(
       ivBytes)); 
      if (data instanceof String) { 
      byteArr = Base64.decodeBase64(((String) data).getBytes("UTF-8")); 
     } 
     byteArr = (cipher.doFinal(byteArr)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    //return byteArr; 
    return new String(byteArr); 
} 

注:

相反,如果我用这个IV,

byte[] ivBytes = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
      0, 0}; it works as expected. 
+0

你可以发布你的加密代码生成IV的地方吗? IV需要与加密和解密相同 – 2013-04-23 14:17:04

+0

它似乎并不像您将IV一起存储在密文中,所以您可以在解密过程中阅读和使用它。 – CodesInChaos 2013-04-23 15:40:33

+0

@ Zim-ZamO'Pootertoot,是的,你所说的是正确的。我正在使用不同的IV来加密JHIlf4iXM53tgsKHQEv1dlsUTeLr5GP3LfSNGlWENkg =。如果我使用相同的IV,它工作正常。感谢您的回答。如果你可以发布这个答案,我会接受。 – tejas 2013-04-24 05:18:32

回答

0

您需要使用加密和解密相同的初始化向量;可以以明文发送IV(即,它不是秘密)

还应该使用不同的IV为每个密文,用例如生成的一个计数器或与SecureRandom