首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pycrypto AES-CTR实现

Pycrypto AES-CTR实现
EN

Stack Overflow用户
提问于 2013-02-05 19:05:36
回答 3查看 4.1K关注 0票数 3

我对python和pycrypto很陌生。我正在尝试实现AES-CTR。为了检查我的程序是否正确加密,我尝试使用来自NISTSP800-38A标准的测试序列(F.5节)。但我没有得到正确的结果。我做错了什么?

代码语言:javascript
复制
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"))

结果:

代码语言:javascript
复制
0008007df81ad564b9aadd6b883fef16

但预期结果(密文)是:

代码语言:javascript
复制
874d6191b620e3261bef6864990db6ce
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-06 22:20:27

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

如果使用明文(6bc1bee22e409f96e93d7e117393172a),则得到正确的结果,即密文874d6191b620e3261bef6864990db6ce

票数 3
EN

Stack Overflow用户

发布于 2018-11-15 08:48:43

我试过这个。

代码语言:javascript
复制
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"))

得到的结果

代码语言:javascript
复制
874d6191b620e3261bef6864990db6ce

使用二进制数据为我工作,str.encode(“十六进制”)是不推荐的

票数 1
EN

Stack Overflow用户

发布于 2020-01-24 13:16:16

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

您需要使用适当的数据类型来获得NIST SP 800-38A中提到的密码文本。Kameel的代码工作,我也包括在我的答案中的代码。

代码语言:javascript
复制
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"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14714968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档