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