加速AES_CBC模式使用AES_ECB模式

问题描述

我想实现 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,您可以评估:

他们似乎有定期发布和一些贡献者。尽管如此,您仍然需要对您的企业设置进行评估。

与您的问题有关:

  • 您将每个块直接写入文件。这会严重影响性能。在这里你可以简单地add a buffer到文件output_file = open(en_name,'wb',buffering=1024*1024)
  • 过时的库很可能无法利用现代 CPU 的硬件加密指令。