【问题标题】:Pycrypto AES-CTR implementationPycrypto AES-CTR 实现
【发布时间】:2013-02-05 19:05:36
【问题描述】:

我是 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

【问题讨论】:

  • 欢迎 Re-pythonable。不要忘记将cryptographyencryption 中的至少一个标签添加到您的密码学相关问题中,否则它不会出现在许多雷达上:)
  • 我不知道Crypto.Utils 之前是否有这个名字或者它是一个类型,因为我能够导入的是Crypto.Util

标签: python encryption cryptography aes pycrypto


【解决方案1】:

在 NIST SP 800-38A 标准(F.5.1 节)中,CTR-AES128 加密操作的输入称为明文而不是输入块。 p>

如果你使用 plaintext (6bc1bee22e409f96e93d7e117393172a) 你会得到正确的结果,ciphertext 874d6191b620e3261bef6864990db6ce

【讨论】:

    【解决方案2】:

    我试过了。

    import Crypto.Cipher.AES
    import Crypto.Util.Counter
    
    import binascii
    
    key = b'\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
    iv = b'\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
    text = b'\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a'
    
    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")

    【讨论】:

    • 您好,您可以通过解释您的解决方案如何解决原始发帖人的问题来改进您的回答。
    【解决方案3】:

    除了使用 SquareRootOfTwentyThree 提到的适当的纯文本值之外,您还应该考虑代码中使用的数据类型。 PyCrypto documentation 建议键的数据类型为 bytes,而计数器的类型可以是 intbytes

    您需要使用适当的数据类型来获取 NIST SP 800-38A 中提到的密文。 Kameel 的代码有效,我也将代码包含在我的答案中。

    from Crypto.Cipher import AES
    import Crypto.Utils.Counter
    import binascii
    
    CTRkey     = b'\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
    iv         = b'\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
    plain_text = b'\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a'
    
    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"))
    
    
    
    

    【讨论】:

    • 如果你添加一个带有示例的代码 sn-p 那就太棒了。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2020-08-13
    • 2015-06-09
    相关资源
    最近更新 更多