Почему возникает ошибка «Неверная длина IV (должна быть 16 байтов)» при использовании полностью скопированного IV в PyCrypto?

Как исправить код для успешного шифрования и дешифрования данных AES с использованием IV в Python?
  • 11 июня 2024 г. 22:01
Ответы на вопрос 2
Ошибка "Неверная длина IV (должна быть 16 байтов)" возникает из-за того, что в PyCrypto IV должна быть длиной в 16 байтов для AES шифрования.

Для успешного шифрования и дешифрования данных AES с использованием IV в Python, вам необходимо убедиться, что ваш IV имеет правильную длину. Если вы получили IV из шифртекста, вам нужно его расшифровать, а затем использовать результат в качестве IV.

Пример исправленного кода:

```python
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# Генерация случайного IV
iv = get_random_bytes(16)

# Генерация ключа
key = b'0123456789abcdef'

# Создание объекта шифра
cipher = AES.new(key, AES.MODE_CBC, iv)

# Шифрование данных
plaintext = b'Hello, World!'
ciphertext = cipher.encrypt(plaintext)

# Дешифрование данных
decipher = AES.new(key, AES.MODE_CBC, iv)
decrypted_text = decipher.decrypt(ciphertext)

print("Зашифрованный текст:", ciphertext)
print("Дешифрованный текст:", decrypted_text)
```

Этот код генерирует случайный IV длиной 16 байтов, а затем использует его для шифрования и дешифрования данных. Важно помнить, что IV должен быть случайным и уникальным для каждого сообщения, чтобы обеспечить безопасность шифрования.
Да здравствует костылестроение! 
Выкинул всякую ерунду, оставил возню с iv.
Копипастим строку числел с запятыми после IV (пофиг со скобками или без) и вставляем на запрос
enter iv :

from Crypto.Random import get_random_bytes
import struct


def StartEncrypt():
    # Генерация случайного IV (Initialization Vector)
    iv = get_random_bytes(16)
    print(len(iv))
    print(iv)
    # Вывод информации о результате шифрования
    print(f'IV: {struct.unpack("b"*len(iv), iv)}')
    

def StartDeCrypt():
    # IV, полученный при шифровании
    data = input("enter iv :")
    for item in ['(', ')']:
        data = data.replace(item,'')
    str_iv = tuple(map(int, data.split(',')))
    print(str_iv)
    iv = struct.pack('b'*len(str_iv), *str_iv)
    print(iv)
    print(len(iv))
    
StartEncrypt()
StartDeCrypt()

16
b'?\x06\x8f\xe9\xde!\xa0\xa8\x07\xfc\xb9\x1b\xb2X\x1e\x96'
IV: (63, 6, -113, -23, -34, 33, -96, -88, 7, -4, -71, 27, -78, 88, 30, -106)
enter iv :63, 6, -113, -23, -34, 33, -96, -88, 7, -4, -71, 27, -78, 88, 30, -106)
(63, 6, -113, -23, -34, 33, -96, -88, 7, -4, -71, 27, -78, 88, 30, -106)
b'?\x06\x8f\xe9\xde!\xa0\xa8\x07\xfc\xb9\x1b\xb2X\x1e\x96'
16
Похожие вопросы