PyCryptodome 上下文如何为 AES 密码链接消息?

How PyCryptodome context chains messages for AES cipher?

TL;DR:PyCryptodome AES 上下文如何链接消息?

考虑这段代码:

from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
# Create AES-128-CBC context; pad message; encrypt x2.
cipher = AES.new(b'Sixteen byte key', AES.MODE_CBC, b'16-byte init.vec')
pt = pad(b'The quick brown fox jumped over the lazy dog', 16)
print(cipher.encrypt(pt).hex())  #  First output: 95c44b...
print(cipher.encrypt(pt).hex())  # Second output: dfa658...

如您所见,相同的操作与相同的初始化。矢量给出不同的结果。原因是重用了 AES 上下文(在本例中为 cipher)。

问题是,PyCryptodome 如何链接加密消息以获得不同的结果。换句话说,它如何被描述为一个抽象算法?如何在不使用内置链接的情况下获得第二个输出?

我已经查看了 PyCryptodome 文档甚至源代码,但没有找到答案。我认为它重新创建了 IV 或其他东西..

正如@Topaco 在评论中所述,PyCryptodome 使用 先前加密的最后一个块作为下一条消息的 IV 。可以用这段代码来演示:

from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES

cipher = AES.new(b'Sixteen byte key', AES.MODE_CBC, b'16-byte init.vec')
pt = pad(b'The quick brown fox jumped over the lazy dog', 16)
lb = cipher.encrypt(pt)[-16:]  # last block of ciphertext

# Reinitialize context - for demonstration purposes
cipher = AES.new(b'Sixteen byte key', AES.MODE_CBC, lb)

print(cipher.encrypt(pt).hex())  # Second output: dfa658...