利用openssl和PyCryp进行AES_128加密

2024-10-03 02:43:53 发布

您现在位置:Python中文网/ 问答频道 /正文

想知道如何正确地将openssl的AES_128加密转换为PyCrypto。在

首先,我使用openssl进行加密,如下所示:

openssl enc -aes-128-ctr -in input.mp4 -out output.openssl.mp4 -K 7842f0a1ebc38f44e3e0c81943f68582 -iv d01f40dfc8ec8cd9

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

^{pr2}$

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

diff output.openssl.mp4 output.pycrypto.mp4
Binary files output.openssl.mp4 and output.pycrypto.mp4 differ

Tags: ininputoutputout事情aesmp4enc
1条回答
网友
1楼 · 发布于 2024-10-03 02:43:53

OpenSSL的行为与预期一致(幸运的是,命令行中缺少关于这个事实的文档),并将给定的IV用作big-endian计数器的最左边的字节。换言之,给定的字节是16字节计数器中最重要的部分。问题中的代码使用IV作为初始计数器值,即它被解释为计数器的最低有效部分。在

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

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

所以不用再费事了:

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()))

相关问题 更多 >