字符串的Java AES En / decryption

时间:2014-08-20 09:15:27

标签: java encryption initialization

我找到了一个有用的AES256实现来解密字符串,所有工作都很好,除了我必须存储初始化矢量(IV)以进行解码。

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
ivBytes = params.getParameterSpec(IvParameterSpec.class).getIV();

所有(安全)替代方法都可能没有CBC,因为有了CBC,我必须存储一个IV(在我的情况下,我必须共享IV,这实际上是不安全的)。 我在这个平台上读到了一篇文章,关于它可以在没有CBC的情况下编码,但由于字典攻击,这不是一个好主意。

那么,是否有任何替代方法可以使用aes256编码字符串(不存储其他数据,如IV或salt数组)?

1 个答案:

答案 0 :(得分:2)

IV背后的想法是为每次加密使用不同的新随机(具有相同的key)。

这对于确保密码模式(例如 CTR CBC )的安全性非常重要,如果没有IV,这些密码模式根本不安全。此外,当使用相同的key加密相同的message两次时,它将导致两个不同的密文(因为两个IV是不同的。)

简而言之,您应始终使用IV

通常你只是将它们添加到密文中,然后在加密之前将它们提取出来,这样你就不必单独存储它们。