шифрование AES CBC

Я написал некоторый код, используя библиотеку pycrypt, и я должен делать что-то не так, но я не могу понять, что я делаю неправильно. Я могу (почти) расшифровать сообщения с неправильным вектором инициализации, хотя я верю, что следую их примерам.

from Crypto.Cipher import AES
import os
from string import ascii_letters

key, iv = os.urandom(32), os.urandom(16)
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = ascii_letters
plaintext += ' ' * (-len(plaintext) % 16)  # Padding
ciphertext = cipher.encrypt(plaintext)

cipher = AES.new(key, AES.MODE_CBC, os.urandom(16))
text = cipher.decrypt(ciphertext)
# text[16:] = b'qrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ            '

Теперь, за исключением первых 16 байт расшифрованного текста, у вас есть все правильно расшифрованное с совершенно случайным выбором IV. Может ли кто-нибудь помочь мне понять, где я ошибаюсь?


person Lars    schedule 10.11.2018    source источник


Ответы (1)


Это нормально для цепочки блоков шифра. При расшифровке CBC IV необходим только для восстановления первого блока открытого текста. Вычисление других блоков открытого текста на самом деле не требует IV. Вот диаграмма (источник: Викимедиа, пользователь WhiteTimberwolf, общественное достояние):

Диаграмма расшифровки CBC

person user2357112 supports Monica    schedule 10.11.2018
comment
Так что я думаю, я неправильно понял роль IV. Он нужен только для того, чтобы затруднить расшифровку путем добавления дополнительного перемешивания, но не для добавления какого-либо дополнительного элемента безопасности, кроме секретности ключа. Спасибо! - person Lars; 10.11.2018
comment
@Lars: IV действительно повышает безопасность; атаки, которые были бы возможны, если бы CBC не имел IV, невозможны из-за IV. Однако это не должно быть секретом, и тот факт, что большая часть открытого текста может быть восстановлена ​​без IV, не снижает безопасность системы. - person user2357112 supports Monica; 10.11.2018