Кодирование текста с использованием base64 и AES

Вопрос или проблема

Я пытаюсь декодировать данные, которые генерируются из этого кода на JavaScript:

    jeTV: (t, e, r) => {
        "use strict";
        r.d(e, {
            X: () => s
        });
        var n = r("wIp5")
          , i = r.n(n)
          , s = (r("4Whi"),
        function(t, e) {
            var r = i().lib.WordArray.random(12).toString(i().enc.Base64)
              , n = i().AES.encrypt(t, i().enc.Utf8.parse(e), {
                iv: i().enc.Utf8.parse(r)
            });
            return "".concat(r).concat(n.ciphertext.toString(i().enc.Base64))
        }
        )
    }

Мой код:

def decrypt(encrypted_data, key):
    # Извлекаем Base64 IV и шифротекст
    iv_base64 = encrypted_data[:16]  # Первые 16 символов (Base64-кодированный IV)
    ciphertext_base64 = encrypted_data[16:]  # Остальное - шифротекст

    # Используем строку Base64 напрямую как IV, без декодирования обратно в байты
    iv_bytes = iv_base64[:16].encode('utf-8')  # Получаем первые 16 символов закодированного IV

    # Декодируем шифротекст
    ciphertext = base64_decode(ciphertext_base64)

    # Создаем объект шифра AES для расшифровки
    cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv_bytes)

    # Расшифровываем и убираем дополнение из открытого текста
    plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)

    return plaintext.decode('utf-8')

Но я получил эту ошибку при запуске программы:

    plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D\venv\Lib\site-packages\Crypto\Util\Padding.py", line 95, in unpad
    raise ValueError("PKCS#7 padding is incorrect.")
ValueError: PKCS#7 padding is incorrect.

Я проверил ключ и Base64-декодированные IV/шифротекст, и они, похоже, соответствуют тому, что было сгенерировано во время шифрования. Я распечатал сырые расшифрованные байты, но не уверен, являются ли они двоичными данными или нет. Буду благодарен за любые идеи или предложения по решению этой проблемы.

Ответ или решение

Чтобы успешно декодировать данные, зашифрованные с использованием AES и Base64, необходимо удостовериться, что все компоненты — IV (вектор инициализации), шифротекст и ключ — корректно обрабатываются. Ошибка "PKCS#7 padding is incorrect." может возникнуть из-за неправильной обработки IV или шифротекста. Давайте разберем код и приведем корректное решение.

Шаг 1: Расшифровка шифрованных данных

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

Шаг 2: Выделение IV и шифротекста

Исходя из вашего кода, вам нужно правильно извлечь IV и шифротекст. IPv (вектор инициализации) представлен в виде Base64, который может быть длиной 16 символов. Шифротекст следует после него.

Шаг 3: Корректный код на Python

Вот переработанный код с учетом всех замечаний:

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

def decrypt(encrypted_data, key):
    # Извлечение Base64 закодированного IV и шифротекста
    iv_base64 = encrypted_data[:16]  # первая 16 символов - IV
    ciphertext_base64 = encrypted_data[16:]  # остальное - шифротекст

    # Декодируем Base64 строки
    iv_bytes = base64.b64decode(iv_base64)  # Декодируем IV
    ciphertext = base64.b64decode(ciphertext_base64)  # Декодируем шифротекст

    # Создаем объект шифрования AES для расшифровки
    cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv_bytes)

    # Расшифровка и удаление отступов
    try:
        plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
        return plaintext.decode('utf-8')
    except ValueError as e:
        print("Ошибка расшифровки:", str(e))
        return None

# Пример вызова функции
key = "ваш_секретный_ключ"  # Убедитесь, что длина ключа соответствует требованиям (16, 24, 32 байта)
encrypted_data = "ваши_зашифрованные_данные"  # Полученные закодированные данные
result = decrypt(encrypted_data, key)

if result:
    print("Расшифрованный текст:", result)

Замечания:

  1. Длина ключа: Убедитесь, что ваш ключ соответствует правилам AES (16, 24 или 32 байта).

  2. База64: Важно использовать base64.b64decode для декодирования как IV, так и шифротекста.

  3. Отступы: Обратите внимание на управление отступами. Для корректной работы алгоритма необходимо удаление отступов после расшифровки.

Проверьте корректность всех данных и почему ошибка возникает — это может быть связано с PIN-ингредией или с возможным вторичным шифрованием данных. Надеюсь, это поможет вам решить вашу проблему.

Оцените материал
Добавить комментарий

Капча загружается...