在AES算法中更改IV时解密失败

时间:2013-04-23 09:58:11

标签: java aes encryption

我的网络服务收到了一些编码值。现在我必须解码这个编码的字符串并获取它的字节。

现在我使用这个字节数组作为我的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.

1 个答案:

答案 0 :(得分:0)

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

您还应该为每个密文使用不同的IV,例如,使用例如一个柜台或SecureRandom