Я разработал алгоритм головоломки, который принимает значение каждого зашифрованного блока, указывающего на следующий зашифрованный блок. Я должен использовать для этого aes-ctr-128 по какой-то особой причине.
Я запускаю фиктивный тест, чтобы увидеть, насколько быстрым или медленным он может быть.
Вот что я сделал. Я тестировал как pycrypto, так и криптографию.
Сначала я создаю файл размером 16 МБ со случайными байтами.
Я пробовал двумя способами:
Метод 1. Загрузите файл в черный список с размером блока 128 бит.
Метод 2. Просто загрузите файл в строку.
Теперь я проверил общее время шифрования каждого 128-битного блока. И я проверил общее время шифрования всего файла.
Вот результат:
крипто:
для шифрования 128-битного блока один за другим: 61 824 aes-ctr-128 в секунду
для шифрования всего файла: 8 843 713 aes-ctr-128 в секунду
криптография
для шифрования 128-битного блока один за другим: 384 959 aes-ctr-128 в секунду
для шифрования всего файла: 113 417 922 aes-ctr-128 в секунду
Мне интересно, почему метод 1 и 2 дали мне результат с такой большой разницей? Предполагается, что эти два метода дают одинаковую скорость?
Вот мой тестовый код:
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
backend = default_backend()
from Crypto.Cipher import AES
from Crypto.Util import Counter
import random
import time
BLOCK_SIZE = 16
def read_block(fname):
block_list = []
blobfo = open(fname)
atEOF = False
while not atEOF:
blobdata = blobfo.read(BLOCK_SIZE)
block_list.append(blobdata)
if len(blobdata) < BLOCK_SIZE:
# we should stop after this...
atEOF = True
return block_list
print 'loading data'
block_list = read_block('mediumdata')
print 'loading finish'
print len(block_list), 'blocks'
print 'start encryption'
NUM_COUNTER_BITS = 128
# Here I just use a random key
key = os.urandom(16)
t1 = time.time()
for block in block_list:
ctr = Counter.new(NUM_COUNTER_BITS)
cipher = AES.new(key, AES.MODE_CTR, counter=ctr)
cipher.encrypt(block)
t2 = time.time()
print 'finish encryption'
print 'total time:', t2 - t1
print 'time for each aes:', (t2 - t1) / len(block_list)
print 'num of aes per sec:', len(block_list) / (t2 - t1)
print 'now try to encrypt whole file'
block = open('mediumdata').read()
print type(block)
print 'start encryption'
NUM_COUNTER_BITS = 128
key = os.urandom(16)
t1 = time.time()
ctr = Counter.new(NUM_COUNTER_BITS)
cipher = AES.new(key, AES.MODE_CTR, counter=ctr)
cipher.encrypt(block)
t2 = time.time()
print 'finish encryption'
print 'total time:', t2 - t1
print 'time for each aes:', (t2 - t1) / len(block_list)
print 'num of aes per sec:', len(block_list) / (t2 - t1)
print 'now try cryptography'
print 'start encryption'
t1 = time.time()
num = random.randint(1, 65530)
nonce = "".join(chr((num >> (i * 8)) & 0xFF) for i in range(16))
backend = default_backend()
cipher = Cipher(algorithms.AES(key), modes.CTR(nonce), backend=backend)
encryptor = cipher.encryptor()
for block in block_list:
ciphertext = encryptor.update(block)
encryptor.finalize()
t2 = time.time()
print 'finish encryption'
print 'total time:', t2 - t1
print 'time for each aes:', (t2 - t1) / len(block_list)
print 'num of aes per sec:', len(block_list) / (t2 - t1)
print 'try a whole file'
block = open('mediumdata').read()
print 'start encryption'
t1 = time.time()
num = random.randint(1, 65530)
nonce = "".join(chr((num >> (i * 8)) & 0xFF) for i in range(16))
backend = default_backend()
cipher = Cipher(algorithms.AES(key), modes.CTR(nonce), backend=backend)
encryptor = cipher.encryptor()
ciphertext = encryptor.update(block)# + encryptor.finalize()
encryptor.finalize()
t2 = time.time()
print 'finish encryption'
print 'total time:', t2 - t1
print 'time for each aes:', (t2 - t1) / len(block_list)
print 'num of aes per sec:', len(block_list) / (t2 - t1)
Я что-то пропустил здесь?
Есть ли способ сделать метод 1 быстрее?