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.
你可以發佈你的加密代碼生成IV的地方嗎? IV需要與加密和解密相同 – 2013-04-23 14:17:04
它似乎並不像您將IV一起存儲在密文中,所以您可以在解密過程中閱讀和使用它。 – CodesInChaos 2013-04-23 15:40:33
@ Zim-ZamO'Pootertoot,是的,你所說的是正確的。我正在使用不同的IV來加密JHIlf4iXM53tgsKHQEv1dlsUTeLr5GP3LfSNGlWENkg =。如果我使用相同的IV,它工作正常。感謝您的回答。如果你可以發佈這個答案,我會接受。 – tejas 2013-04-24 05:18:32