首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于openssl和PyCrypto的PyCrypto加密

基于openssl和PyCrypto的PyCrypto加密
EN

Stack Overflow用户
提问于 2014-11-10 01:47:41
回答 1查看 3.1K关注 0票数 6

想知道通过openssl将AES_128_CTR加密转换为PyCrypto的正确方法。

首先,我对openssl进行了如下加密:

代码语言:javascript
复制
openssl enc -aes-128-ctr -in input.mp4 -out output.openssl.mp4 -K 7842f0a1ebc38f44e3e0c81943f68582 -iv d01f40dfc8ec8cd9

然后,我尝试通过PyCrypto做同样的事情:

代码语言:javascript
复制
from Crypto.Cipher import AES
from Crypto.Util import Counter
key = '7842f0a1ebc38f44e3e0c81943f68582'
iv = 'd01f40dfc8ec8cd9'

ctr_e = Counter.new(128, initial_value=int(iv, 16))
encryptor = AES.new(key.decode('hex'), AES.MODE_CTR, counter=ctr_e)

with open('output.pycrypto.mp4', 'wb') as fout:
    with open('input.mp4', 'rb') as fin:
        fout.write(encryptor.encrypt(fin.read()))

我想他们应该是相似的,但事实并非如此:

代码语言:javascript
复制
diff output.openssl.mp4 output.pycrypto.mp4
Binary files output.openssl.mp4 and output.pycrypto.mp4 differ
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-11 21:43:05

OpenSSL的行为符合预期(幸运的是,在命令行中缺少对此事实的文档),并使用给定的IV作为大端计数器的最左边字节。换句话说,给定的字节是16字节计数器中最重要的部分。问题中的代码使用IV作为初始计数器值,即它被解释为计数器中最不重要的部分。

现在,我花了一些时间来修复Python代码,因为我必须处理的Counter类有两个问题:

  • 如果使用8字节的前缀,计数器的大小应该是64位,而不是128位;这是一种设计特性,但是如果为计数器保留的位数很小,则可能会导致溢出(不过,当前设置为64位可以)
  • 默认的初始计数器值设置为1,而CTR模式总是从0开始计数;这很可能是计数器设计中的一个错误。

因此,没有进一步的担心:

代码语言:javascript
复制
from Crypto.Cipher import AES
from Crypto.Util import Counter

key = '7842f0a1ebc38f44e3e0c81943f68582'.decode('hex')
iv = 'd01f40dfc8ec8cd9'.decode('hex')

ctr_e = Counter.new(64, prefix=iv, initial_value=0)
encryptor = AES.new(key, AES.MODE_CTR, counter=ctr_e)

with open('output.pycrypto.mp4', 'wb') as fout:
    with open('input.mp4', 'rb') as fin:
        fout.write(encryptor.encrypt(fin.read()))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26835539

复制
相关文章

相似问题

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