Python:在 AES 中使用相同的 IV 进行加密和解密

标签 python encryption aes initialization-vector

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

准确地说,我不确定在哪里存储随机生成的 IV:在我的脚本中,数据将被加密,然后保存到文件中,然后程序将终止。在下一次 session 期间,必须解密之前保存的数据。如果我对 IV 的理解是正确的,我必须使用与加密相同的 IV 进行解密(但每个加密过程都使用另一个随机 IV)。 因此,我必须将 IV 存储在某个地方 - 有些人建议将其添加到加密数据之前,但如果我做对了,这在我的情况下不起作用,因为我需要 IV 为了能够解密它。

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

最佳答案

IV本身不是敏感数据;它只是用于扰乱第一个密文 block 的状态,并且扰乱无法从 IV 本身恢复( key 添加了“ secret ”因子)。

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

您当然可以“前置”/“附加”到密文,这样您只需存储单个数据 block - 但您只需在解密之前将其分开,因为这是 API 所期望的.

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

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

就 IV 的使用方式而言,有很多可能的方案。请参阅此处关于区 block 链的维基百科文章,以方便的图片展示当 IV 真正单独存储时如何在各种链接模式中使用。

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

关于Python:在 AES 中使用相同的 IV 进行加密和解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38746213/

相关文章:

node.js - 在 Node.js 中使用 Crypto 加密未给出预期结果

python - 如何删除矩阵单元格与其值相同的邻居

python - 如何在不解压缩内容的情况下查看 .tar.gz 存档中特定文件的内容?

python - Pandas系列在Python中按月份索引排序(时间序列不同)

c# - 如何将公共(public) .pem dsa key 导入 C# 代码?

java - 用于 java 的 AES CS2Padding

iphone - 在 IOS 中实现 AES256 加密

python - 带有需要 dask 计算关键字参数的函数的自定义 dask 图

ios - 在 iOS 中加密/解密存储在 SQLite 数据库中的数据需要指导

java - AES 生成的 key 的默认大小是多少?