使用AES-256和初始化向量进行加密

pho*_*594 10 java encryption android aes

我有一个关于在AES加密中使用初始化向量的问题.我正在引用以下文章/帖子来为我的程序构建加密:

[1] Java 256位AES密码加密
[2] http://gmailassistant.sourceforge.net/src/org/freeshell/zs/common/Encryptor.java.html

我最初是从第一个链接开始关注erickson的解决方案,但据我所知,我的实现不支持PBKDF2WithHmacSHA1.所以,我转向第二个链接,以了解我自己的迭代SHA-256哈希创建.

我的问题在于如何创建IV.一个实现([1])使用Cypher类中的方法来导出IV,而另一个([2])使用散列的第二个16字节作为IV.很简单,为什么差异从安全的角度来看哪个更好?我对IV的推导和使用感到困惑(我理解它们的用途,而不是更微妙的差异),所以任何澄清也是非常受欢迎的.

我注意到第二个链接使用AES-128而不是AES-256,这对我来说,我必须要使用SHA-512才能使用这种方法.这似乎是一个不幸的要求,因为用户的密码必须长16个字符才能确保远程安全哈希并且这个应用程序的目的地是手机.

可根据要求提供来源,但仍未完整.

先感谢您.

eri*_*son 28

不应仅从密码生成IV.

即使使用相同的密钥和明文重新使用IV的点,也将产生不同的密文.如果仅通过密码确定性地生成IV,则每次都会得到相同的密文.在引用的示例中,随机选择了salt,因此即使使用相同的密码也会生成新密钥.

只需使用随机数生成器来选择IV.这就是密码在内部的作用.


我想强调你必须将IV(如果使用第一种方法)或盐(如果使用第二种方法)与密文一起存储.如果一切都来自密码,您将无法获得良好的安全性; 你需要在每条消息中都有一些随机性.

  • 好的,这更有意义.还有一个问题:如果Cypher在内部使用随机数发生器,我该如何解密?据我了解,同样的IV需要用于加密和解密.他们只是使用密钥作为生成器的种子来获得相同的每个密钥IV还是还有更多的东西? (2认同)
  • @phobos51594 - 您必须将 IV 与密文一起存储。一种将 IV 视为密文的第一个块的方法,因此您可以将其存储为密码实际输出的前缀。管他呢。它不需要保密;只需将它与其余的密文一起存储。 (2认同)
  • 忽略之前的评论,我刚看到你的编辑.这更有意义.因此,模式将采用以下方式:哈希密码,使用Cypher生成IV或安全随机功能,使用hash-IV-salt加密,存储先前值,使用存储值解密,丢弃IV,庆祝,重复. (2认同)