@ByXesh

PyCrypto ValueError: Incorrect IV length (it must be 16 bytes long) даже при полном копировании iv?

Ничо не работает даже когда копирую IV
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad
import os
import random
import base64

def StartEncrypt():
    # Ключ шифрования 
    str_key = str(random.randrange(1000000000000000, 9999999999999999))
    key = str_key.encode("utf-8")

    # Генерация случайного IV (Initialization Vector)
    iv = get_random_bytes(16)
    a = iv
    print(len(a))
    print(len(iv))
    # Создание объекта шифра
    cipher = AES.new(key, AES.MODE_CBC, iv)

    # Данные для шифрования
    str_data = str(input("data for encrypt : "))
    data = str_data.encode("utf-8")

    # Шифрование данных
    ct_bytes = cipher.encrypt(pad(data, AES.block_size))

    # Кодирование результата в формат base64 для удобства хранения
    ct_base64 = base64.b64encode(ct_bytes).decode('utf-8')
    print(f'Encrypted data: {ct_base64}')

    # Вывод информации о результате шифрования
    print(f'Key: {key}')
    print(f'IV: {iv}')

def StartDeCrypt():
    # Ключ шифрования
    str_key = str(input("enter key :"))
    key = str_key.encode("utf-8")

    # IV, полученный при шифровании
    str_iv = str(input("enter iv :"))
    iv = str_iv.encode("utf-8")
    print(len(iv))
    # Декодирование данных из base64
    str_cd = str(input("enter encrypted data :"))
    ct_bytes = base64.b64decode(str_cd.encode("utf-8"))

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

    # Расшифровка данных
    pt_bytes = cipher.decrypt(ct_bytes)

    # Удаление лишних байтов, добавленных при padding
    pt_bytes = unpad(pt_bytes, AES.block_size)

    # Вывод расшифрованных данных
    print(pt_bytes.decode('utf-8'))
StartEncrypt()
StartDeCrypt()
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Да здравствует костылестроение!
Выкинул всякую ерунду, оставил возню с 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
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
SpectrumData Екатеринбург
от 150 000 до 200 000 ₽
Гринатом Москва
от 150 000 ₽
DIGITAL SECTOR Краснодар
от 150 000 до 250 000 ₽