如何使Python加密AES更快
我正在寻找一种非常快速的加密和解密短文本片段的方法。在我的用例中,安全性是次要的。使用恒定IV进行光加密是可以的。我目前正在这样做:如何使Python加密AES更快,python,encryption,aes,pycrypto,Python,Encryption,Aes,Pycrypto,我正在寻找一种非常快速的加密和解密短文本片段的方法。在我的用例中,安全性是次要的。使用恒定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'
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?),或者是否有更快的填充函数、更快的十六进制转换输出方式?计数器模式(AES.mode_CTR
)对于多块消息将更快,因为它可以并行进行加密和解密CBC
在加密时是串行的,因为在加密之前,每个分组密码操作的结果输出都作为输入,与下一个块的明文一起馈送到XOR
。由于CTR
通过使用密钥加密每个(顺序)计数器值来生成密钥流,因此它不依赖于任何先前块操作的输出,并且可以并行执行任务
此外,由于CTR
作为流密码进行操作,因此不需要进行消息填充,因此您可以节省进出操作的时间
注意:不要重复使用计数器。您提到保密性是第二个问题,但在CBC模式下重新使用IVs是“不好的”,而在CTR模式下重新使用计数器是世界末日不好的。只要使用a,您就可以了。(请参阅或以获取有关原因的示例)。试试为什么需要这么快?你能换成C或Java这样的编译语言吗?它必须是Python。刚刚意识到,通过使用binascii(仅限ASCII),我可以将函数的速度提高约7%。pycrypto在C中使用AES的本机实现,并支持AES-NI。没有比这更快的办法了。你要多快?您可以寻找TEA的C实现的python包装器。XXTEA正是我想要使用的,然而,这让我想到: