【问题标题】:AES_128_CTR encryption by openssl and PyCryptoopenssl 和 PyCrypto 的 AES_128_CTR 加密
【发布时间】:2014-11-10 01:47:41
【问题描述】:

想知道通过 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

【问题讨论】:

    标签: python encryption openssl aes pycrypto


    【解决方案1】:

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

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

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

    那么,废话不多说:

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

    【讨论】:

    • 非常感谢您的描述,特别是提到了我在使用Counter 类时遇到的两个主要问题。
    • 其实我不是这个意思。 Counter 类一般有两个问题,而不是你对它的使用...我会用现在时...
    • 看到你的评论真是如释重负~
    • 忘记了安全建议... 重要提示:对同一密钥和多条消息(视频)使用静态随机数(代码中计数器的第一部分或全部部分)是不安全的到了极致。通常您应该使用唯一的密钥/IV 对,尤其是用于流密码和 CTR 等流模式。
    猜你喜欢
    • 2011-10-24
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多