Python:在AES

时间:2016-08-03 14:18:27

标签: python encryption aes initialization-vector

在加密AES中的数据时,我很难理解正确使用IV(初始化向量)。

确切地说,我不知道在哪里存储我随机生成的IV:在我的脚本中,数据将被加密,然后保存到文件中,然后程序将终止。在下一个会话期间,必须解密先前保存的数据。如果我对IV的理解是正确的,我必须使用相同的IV进行解密和加密(但是对于每个加密过程都使用另一个随机IV)。 因此,我必须将IV存储在某处 - 有些人建议将其添加到加密数据中,但如果我说得对,那么在我的情况下不会工作,因为我需要IV 按顺序能够解密它。

这是正确的还是我误解了什么?我想避免在一些未加密的纯文本设置文件或其他内容中保存加密/散列密钥和IV(即使是散列本身)。

1 个答案:

答案 0 :(得分:0)

IV本身不是敏感数据;它只是用于加扰第一个密文块的状态,并且加扰不能从IV本身恢复(密钥增加了“秘密”因子)。

对于“正确的”链接模式,IV与密文分开(您需要加密和解密的初始IV),并且必须单独存储并单独传递给加密库API。加密后你可以存储你想要的IV - 只是不要丢失它;)。

你当然可以“加载”/“附加”到密文,这样你只需要存储一个数据块 - 但是你必须在解密之前将它拆分掉,因为那是API所期望的。

执行IV的“不合适”方式(例如,如果您的加密库API没有本机IV支持,但支持链接)只是在加密之前将单个随机数据块添加到明文。在这种情况下,没有任何IV可以单独存储 - 您只需加密整个IV +消息二进制对 - 然后您只需在解密后删除第一个数据块。您添加的“随机数据”具有与实际IV相同的约束(不要重复使用相同密钥的相同随机数据等)。

这两种方法在API级别上在语义上是不同的,但是对实际加密的影响是相同的(不可预测地对第一块实际有效负载进行争用)。

就如何使用IV而言 - 有许多可能的方案。请参阅维基百科关于块链接的文章,以获得方便的图片,显示当IV实际存储时,如何在各种链接模式中使用IV。

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation