0

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

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

1 回答 1

0

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

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

于 2013-04-24T12:27:38.853 回答