Библиотека шифрования PyCrypto против скорости дешифрования - PullRequest
0 голосов
/ 25 апреля 2018

Я использую шифратор и дешифратор Pycrypto с алгоритмом симметричного ключа AES 256. Моя часть шифрования отнимает гораздо больше времени по сравнению со временем расшифровки. Есть ли для этого веская причина?

Я пробовал 16 МБ файла:

Время шифрования = 3,31 с
Время расшифровки = 0,18 с

Может ли кто-нибудь помочь мне объяснить причину этого?

Логика шифрования выглядит следующим образом:

def encrypt_file(key, infile, chunksize=64 * 1024):
    """ Encrypts a file using AES (CBC mode) with the
        given key.

        key:
            The encryption key - a string that must be
            either 16, 24 or 32 bytes long. Longer keys
            are more secure.

        infile:
            input file

        chunksize:
            Sets the size of the chunk which the function
            uses to read and encrypt the file. Larger chunk
            sizes can be faster for some files and machines.
            chunksize must be divisible by 16.
    """
    iv = os.urandom(16)
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    infile.seek(0, os.SEEK_END)
    filesize = infile.tell()
    infile.seek(0, os.SEEK_SET)

    encrypted = b'';
    encrypted += struct.pack('<Q', filesize)
    encrypted += iv

    while True:
        chunk = infile.read(chunksize)
        if len(chunk) == 0:
            break
        elif len(chunk) % 16 != 0:
            chunk += b' ' * (16 - len(chunk) % 16)
        encrypted += encryptor.encrypt(chunk)

    return encrypted

И логика расшифровки выглядит следующим образом:

def decrypt_file(key, infile, out_filename, chunksize=24*1024):
    """ Decrypts a file using AES (CBC mode) with the
        given key.
    """
    if key == '':
        with open(out_filename, 'wb') as outfile:
            for line in infile:
                outfile.write(line)
        return outfile.name

    origsize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0]
    iv = infile.read(16)
    decryptor = AES.new(key, AES.MODE_CBC, iv)

    # for line in infile:
    #     print(line)
    with open(out_filename, 'wb+') as outfile:
        while True:
            chunk = infile.read(chunksize)
            if len(chunk) == 0:
                break
            outfile.write(decryptor.decrypt(chunk))
        outfile.truncate(origsize)

        return outfile.name
...