我正在比较pycrypto和密码学在Python中的AES实现。io库。
from cryptography.hazmat.primitives.ciphers import Cipher, modes, algorithms
from cryptography.hazmat.backends import default_backend # http://cryptography.io
from Crypto.Cipher import AES # http://pycrypto.org
key = b'Sixteen byte key'
iv = b'Sixteen byte ivv'
cipher1 = AES.new(key, AES.MODE_CFB, iv)
cipher2 = Cipher(algorithms.AES(key), modes.CFB(iv), default_backend())
plaintext = b"Plaintext"
print(cipher1.encrypt(plaintext))
print(cipher1.decrypt(plaintext))
print(cipher2.encryptor().update(plaintext))
print(cipher2.decryptor().update(plaintext))
MWE打印:
b'xe4xb4xebxe3Six9apxee'
b'7xdax98xeex05xe4xa0xc7,'
b'xe4"xd4moxa3;xa9xe0'
b'xe4"xd4moxa3;xa9xe0'
为什么输出不同?
答案似乎是PyCrypto默认实现CFB-8,这是普通CFB的变体。https://github.com/digitalbazaar/forge/issues/100详细描述了这个问题
根据Alex Gaynor的回答,这里有一个更详细的描述:
根据标准,输入大小必须是段大小的一个倍数。大多数实现默认使用16字节(128位)段大小,并忽略此要求。PyCrypto默认使用8字节段,但你可以这样修改:
cipher1 = AES.new(key, AES.MODE_CFB, iv, segment_size=128)
生成与另一个库相同的加密数据。
请使用"CFB8"加密模式。pycrypto和cryptography输出将匹配。for ex.cipher2 = Cipher(algorithm . aes (key), modes.CFB8(iv), default_backend())