2013-04-23 86 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