Криптография. Длина выходного шифра AES Хазмата - PullRequest
2 голосов
/ 22 сентября 2019

В Python с использованием модуля Cryptography.Hazmat Для AES длина вывода шифрования не кратна 16;Я неправильно использую шифровальный шифр, и если да, то что не так?Длина вывода, которую я получаю, составляет 16 + len(input) (16, поскольку это длина IV).Вот код ниже:

from cryptography.hazmat.primitives.ciphers import Cipher
from cryptography.hazmat.primitives.ciphers.algorithms import AES
from cryptography.hazmat.primitives.ciphers.modes import CBC,OFB,CFB

class AES_Cipher:   
  def __init__(self,key):
    self.key = key

  def encrypt(self,plain_text):
    initialization_vector = urandom(16)
    cipher = Cipher(AES(self.key),OFB(initialization_vector),backend)
    encryption_engine = cipher.encryptor()
    return initialization_vector + encryption_engine.update(plain_text.encode("utf-8")) + encryption_engine.finalize()

  def decrypt(self,cipher_text):
    initialization_vector = cipher_text[:16]
    cipher = Cipher(AES(self.key),OFB(initialization_vector),backend)
    decryption_engine = cipher.decryptor()
    return (decryption_engine.update(cipher_text[16:]) + decryption_engine.finalize()).decode("utf-8")

Шифр ​​называется так:

from hashlib import sha3_256
aes_key = sha3_256(b"Strong Encryption Key").digest()
aes_engine = AES_Cipher(aes_key)
aes_engine.encrypt("Hello World")

И вот результат:

b'\xc4I\xf2\xe5\xf4\xaeX\x96\xa5\xfe\xbd+\xde\x8ca\xd5\xdb\xad\x97S\x01\x81C\x9e\xd5\xd8@'

Это всего 27 байтов, по сравнению с ожидаемыми 32 байтами.27 = 16 + лен («Привет, мир»).Почему длина не 32 байта?Какой код отсутствует?Еще одна вещь;расшифровка работает отлично.

1 Ответ

1 голос
/ 23 сентября 2019

Длина 27 байтов правильна для OFB -режима.

OFB-режим, используемый в Python-коде, превращает блочный шифр в потоковый шифр .Разница между блочным шифром и потоковым шифром описана более подробно здесь .В частности, длина ввода открытого текста может быть произвольной для потокового шифра, то есть, в отличие от блочного шифра, длина не должна быть целым кратным размеру блока, так что no Заполнение требуется.Сгенерированный зашифрованный текст имеет такую ​​же длину , что и открытый текст.

В данном примере открытый текст Hello World , а следовательно, и зашифрованный текст, имеет длину 11байт.Вместе с IV, длина которого составляет 16 байтов, общая длина составляет 27 байтов, что в точности соответствует вашему результату.

...