我是python和pycrypto的新手。我正在尝试实现AES-CTR。为了检查我的程序是否正确加密,我尝试使用NIST SP 800-38A标准的测试序列(第F.5节)。但我没有得到正确的结果。我做错了什么?
from Crypto.Cipher import AES
from Crypto.Utils import Counter
CTRkey="2b7e151628aed2a6abf7158809cf4f3c"
ctr=Counter.new(128, initial_value=int("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",16))
cipherCTR=AES.new(CTRkey, AES.MODE_CTR, counter=ctr)
print(cipherCTR.encrypt("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff".decode("hex")).encode("hex"))
结果:
0008007df81ad564b9aadd6b883fef16
但预期结果(密文)是:
874d6191b620e3261bef6864990db6ce
在NIST SP 800-38A标准(第F.5.1节)中,CTR-AAES128加密操作的输入称为明文,而不是输入块。
如果使用明文(6bc1bee22e409f96e93d7e117393172a
),则会得到正确的结果,即密文874d6191b620e3261bef6864990db6ce
。
我试过了。
import Crypto.Cipher.AES
import Crypto.Util.Counter
import binascii
key = b'x2bx7ex15x16x28xaexd2xa6xabxf7x15x88x09xcfx4fx3c'
iv = b'xf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff'
text = b'x6bxc1xbexe2x2ex40x9fx96xe9x3dx7ex11x73x93x17x2a'
ctr = Crypto.Util.Counter.new(128, initial_value=int(binascii.hexlify(iv), 16))
cipher = Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_CTR, counter=ctr)
print(cipher.encrypt(text).encode("hex"))
得到结果
874d6191b620e3261bef6864990db6ce
对我来说,使用二进制数据是可行的,不建议使用str.encode("hex")。
除了使用SquareRootOfTwentyThree提到的适当的纯文本值外,您还应该考虑代码中使用的数据类型。PyCrypto文档建议密钥的数据类型为字节,而计数器的类型可以为int或bytes。
您需要使用适当的数据类型来获得NIST SP 800-38A中提到的密文。Kameel的代码是有效的,我在回答中也包含了代码。
from Crypto.Cipher import AES
import Crypto.Utils.Counter
import binascii
CTRkey = b'x2bx7ex15x16x28xaexd2xa6xabxf7x15x88x09xcfx4fx3c'
iv = b'xf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff'
plain_text = b'x6bxc1xbexe2x2ex40x9fx96xe9x3dx7ex11x73x93x17x2a'
ctr = Crypto.UtilsCounter.new(128, initial_value=int(binascii.hexlify(iv), 16))
cipherCTR = AES.new(CTRkey, AES.MODE_CTR, counter=ctr)
print(cipherCTR.encrypt(plain_text).encode("hex"))