【问题标题】:How to make Python Crypto AES faster如何使 Python Crypto AES 更快
【发布时间】:2015-12-02 23:06:02
【问题描述】:

我正在寻找一种非常快速的方法来加密和解密短文本 sn-ps。在我的用例中,安全性是次要的。具有恒定 IV 的轻度加密很好。我目前正在这样做:

BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s : s[:-ord(s[len(s)-1:])]

import base64
from Crypto.Cipher import AES

iv = '0123456789012345'
def encrypt(raw, key):
    raw = pad(raw)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    return base64.b64encode( cipher.encrypt( raw ) )

def decrypt(enc, key):
    enc = base64.b64decode(enc)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    return unpad(cipher.decrypt( enc ))

enc_text = encrypt('Hello World!','xyz1234567890abc')
print decrypt(enc_text, 'xyz1234567890abc')

我怎样才能加快速度?也许通过使用另一种 AES 模式(MODE_CBC?),或者是否有更快的填充功能,更快的十六进制转换输出方式?

【问题讨论】:

  • 为什么需要这么快?你能改成 C 或 Java 这样的编译语言吗?
  • 它必须是 Python。刚刚意识到,通过使用 binascii(仅 ASCII 即可),我可以将函数加速约 7%。就是这样。
  • pycrypto 在 C 中使用原生的 AES 实现并支持 AES-NI。那里没有什么比这更快的了。你想要多快?您可以寻找 TEA 的 C 实现的 python 包装器。
  • +1 用于茶。 XXTEA 正是我喜欢使用的,但是,这引导我到这里:stackoverflow.com/questions/34053117/…

标签: python encryption aes pycrypto


【解决方案1】:

计数器模式 (AES.MODE_CTR) 对于多块消息会更快,因为它可以并行处理加密和解密。 CBC 是串行加密的,因为每个分组密码操作的结果输出作为输入被馈送到 XOR 与加密之前的下一个块的明文。因为CTR 通过使用密钥加密每个(顺序)计数器值来生成密钥流,所以它不依赖任何先前块操作的输出并且可以并行执行任务。

此外,由于CTR 用作流密码,因此不需要消息填充,因此您可以节省进出操作的时间。

注意:不要重复使用计数器。您提到这里的机密性是次要问题,但是虽然在 CBC 模式下重复使用 IV 是“不好的”,但在 CTR 模式下重复使用计数器是世界末日不好。只是使用sequential counter (literally i++) combined with 64 bits of the ms since epoch start,你会没事的。 (请参阅 Stream ReuseMany Time Pad Attack 了解原因的好例子)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2013-08-16
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多