Шифрование и дешифрование AES-256-CFB в Python - PullRequest
0 голосов
/ 31 марта 2020

У меня есть код расшифровки aes-256-cfb в ruby следующим образом.

data_cipher = OpenSSL::Cipher::Cipher.new "aes-256-cfb".freeze
data_cipher.decrypt
data_cipher.key = encryption_key
data_cipher.update(decode64(str)) << data_cipher.final

Мне нужен python эквивалент этого кода выше. Моя проблема здесь в том, что где бы я ни находил python logi c для aes-256-cfb, он всегда включал вектор инициализации (IV). Но в приведенном выше Ruby logi c значение iv не установлено.

Я пытался использовать случайные значения iv, но это не дает мне тот же результат, что и код ruby.

Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 08 апреля 2020

Для AES-256-CFB всегда требуется iv для шифрования. Если значение iv не задано, скорее всего, оно будет равно нулю (что означает 16 0x00 байт, поскольку значение iv равно размеру блока, который составляет 128 бит). Другой вариант заключается в том, что iv генерируется случайным образом во время шифрования и инкапсулируется в сообщение. Это будет означать, что первые 16 байтов сообщения являются iv. Если вы не знаете, как работает алгоритм шифрования, вам, вероятно, придется попробовать это.

Однако, поскольку iv используется только для дешифрования первого блока в режиме CFB, если у вас достаточно длинное сообщение, дешифрование будет работать очень хорошо, даже если iv неверно (за исключением первого 128-битного сообщения).

Ниже приведен пример кода, как расшифровка работает в python. Вам нужно знать iv перед шифрованием. В приведенном ниже примере я инициализировал его нулевыми байтами.

Обратите внимание, что этот код обрабатывает только расшифровку необработанных байтов сообщения. Вам нужно позаботиться о кодировке самостоятельно.

from Crypto import Random
from Crypto.Cipher import AES

def decrypt(key, enc):
    iv = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    cipher = AES.new(key, AES.MODE_CFB, iv)
    return cipher.decrypt(enc)

Более подробная информация здесь (обратите внимание, что этот поток использует режим CB C, что немного отличается): Шифрование и дешифрование с использованием PyCrypto AES 256

...