使用openssl和PyCrypto进行AES_128_CTR加密

关德立

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

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

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

然后,我尝试通过PyCrypto进行相同的操作:

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

我认为它们应该相似,但事实并非如此:

diff output.openssl.mp4 output.pycrypto.mp4
Binary files output.openssl.mp4 and output.pycrypto.mp4 differ
马尔滕·博德威斯

OpenSSL的行为符合预期(幸运的是,命令行缺少此事实的文档),并将给定的IV用作大字节序计数器的最左字节。换句话说,给定的字节是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()))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Visual Studio和Openssl的AES 256 CTR加密/解密

使用 AES-256 加密,如 OpenSSL 和 PyCrypto

使用OpenSSL进行AES_128_CBC加密/解密

使用 Node.js AES CTR 加密并使用 PyCrypto 解密

Java和openssl C不同的AES CTR加密结果

使用AES-128-CTR加密在PHP(openssl_encrypt)与Node.js(crypto)上给出了不同的结果

使用openssl C进行AES(AES-IGE-128,AES-IGE-192,AES-IGE-256)加密/解密

Ruby OpenSSL AES-128-CTR

使用OpenSSL / AES进行网络加密的说明

Pycrypto AES GCM加密和Java解密

OpenSSL加密AES 128位CBC

当分别使用nodejs和c进行AES-128-cbc加密时,使用相同的密钥和IV,但结果不同

使用CryptoJS和PHP进行AES加密

使用Go和PHP进行AES加密

使用PyCrypto AES 256加密和解密

使用PyCrypto AES 256加密和解密

AES CTR OpenSSL命令行与EVP_aes_128_ctr C代码不匹配

使用 aes 128 加密文件

Java使用AES 256和128对称密钥加密

使用带有128位密钥的AES和PBKDF2的Java密码体系结构进行文件加密

Pycrypto:在ECB模式下使用AES进行“双重加密”不会产生纯文本

无法使用pycrypto AES对具有特殊字符的字符串进行加密

在C ++中使用OpenSSL使用AES128加密字符串时出错

在 CFB 模式下使用三重 DES 加密时 openssl 命令和 pycrypto 的不同输出

PHP AES-128-CTR 的输出与 GoLang 和 NodeJs 不同

如何使用AES-NI指令和GCC实现AES128加密/解密

Go中的AES-CTR加密和CryptoJS中的解密

AES-256-CTR加密的节点JS和Java的解密

Jmeter 使用 CBC 加密 AES 128