问题描述
我想实现 AES_CBC 模式加密,使用来自 Crypto 包的 ECB 编码器。但是我的代码运行速度很慢(1MB 数据大约需要 1 秒,而使用 Crypto 包中的 AES_CBC 模式加密时仅为 0.02 秒)。下面是我的代码,有什么加速的推荐吗?
from Crypto.Cipher import AES
from Crypto.Util import Padding
from Crypto.Random import get_random_bytes
from Crypto.Util import strxor as XOR
import time
import os
from base64 import b64encode
block_size = 16
key = b'12345678abcdedgh'
#encrypt and decrypt a block data with AES_ECB from Crypto package
def encrypt_ecb(ecb,xored_block):
return ecb.encrypt(xored_block)
def decrypt_ecb(ecb,block):
return ecb.decrypt(block)
#name is filename to encrypt,en_name is file name where I write result to
def encrypt_cbc(name,en_name):
#read data
file = open(name,'rb')
data_byte = file.read()
#Padding
data_byte = Padding.pad(data_byte,block_size)
output_file = open(en_name,'wb')
ecb = AES.new(key,AES.MODE_ECB)
IV = get_random_bytes(16)
print('My IV is: ' + str(IV))
output_file.write(IV)
state = IV
output_data = []
start = time.time()
for i in range(0,len(data_byte),block_size):
block = data_byte[i:i+16]
y = encrypt_ecb(ecb,XOR.strxor(state,block,None))
# output_data.append(y)
output_file.write(y)
state = y
end = time.time()
print('Time to encrypt data: ' + str(end - start))
print('Done')
解决方法
不再维护加密包(pycrypto 最新版本 17.10.2013):https://pypi.org/project/pycrypto/#description
我强烈建议您不要使用过时的软件包来构建其他解决方案——尤其是在安全领域。 此外,我强烈建议您自己实现安全算法。即使您是加密专家,它们也没有经过审查等,而且很可能不太安全。 使用经常更新且有大量贡献者的库(最好是 SAP、Google、Facebook 等大型企业)。
对于 Python,您可以评估:
- 密码学:https://cryptography.io/
- PyCryptodome:https://www.pycryptodome.org/
他们似乎有定期发布和一些贡献者。尽管如此,您仍然需要对您的企业设置进行评估。
与您的问题有关:
- 您将每个块直接写入文件。这会严重影响性能。在这里你可以简单地add a buffer到文件
output_file = open(en_name,'wb',buffering=1024*1024)
- 过时的库很可能无法利用现代 CPU 的硬件加密指令。