Как я могу исправить ошибку расшифровки Python и PHP?

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

вот моя функция на php

<?function encrypt_decrypt($action, $string) {
    $output = false;
    $encrypt_method = "AES-256-CBC";
    $secret_key = '3752395n39572395m82219vc5b13';
    $secret_iv = '67b349vm13408vm2035983v6n2390';
    $key = hash('sha256', $secret_key);
    $iv = substr(hash('sha256', $secret_iv), 0, 16);
    if ($action == 'encrypt') {
        $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
        $output = base64_encode($output);
    } else if ($action == 'decrypt') {
        $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
    }
    return $output;
}

вот моя функция на python

def decrypt(encrypted_string, secret_key, secret_iv):
    # Хэширование ключа и IV
    key = hashlib.sha256(secret_key.encode()).digest()  # Создание бинарного ключа
    iv = hashlib.sha256(secret_iv.encode()).digest()[:16]  # Первые 16 байтов для IV
    # Декодирование закодированной строки Base64
    decoded_data = base64.b64decode(encrypted_string)
    # Создание объекта шифра для расшифровки
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # Расшифровка вывода
    decrypted_padded = cipher.decrypt(decoded_data)
    # Удаление паддинга (паддинг PKCS7)
    decrypted = unpad(decrypted_padded, AES.block_size)
    return decrypted.decode('utf-8')

Когда я шифрую строку, используя php, и не могу расшифровать, используя python, получаю эту ошибку Расшифровка не удалась: данные должны быть дополнены до границы в 16 байт в режиме CBC. Как я могу решить эту проблему? Я хочу шифровать с помощью php и расшифровывать с помощью python.

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

Чтобы исправить ошибку расшифровки, возникающую при попытке расшифровать данные, зашифрованные с использованием PHP в Python, необходимо убедиться, что используемые методы и данные соответствуют друг другу. Ниже приведены шаги, которые помогут вам устранить проблему, а также исправленный код.

Причины проблемы

  1. Постановка отступов: Ваша функция расшифровки на Python должна быть в состоянии обрабатывать данные, зашифрованные с использованием PKCS7 (или PKCS5), поскольку OpenSSL в PHP по умолчанию использует PKCS7 для отступов. Ошибка "Data must be padded to 16 byte boundary" указывает на отсутствие корректного отступа.

  2. Совпадение ключа и вектора инициализации (IV): Убедитесь, что ключ и IV в обоих языках генерируются одинаково.

Исправленный код

PHP функция (без изменений):

function encrypt_decrypt($action, $string) {
    $output = false;
    $encrypt_method = "AES-256-CBC";
    $secret_key = '3752395n39572395m82219vc5b13';
    $secret_iv = '67b349vm13408vm2035983v6n2390';
    $key = hash('sha256', $secret_key);
    $iv = substr(hash('sha256', $secret_iv), 0, 16);
    if ($action == 'encrypt') {
        $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
        $output = base64_encode($output);
    } else if ($action == 'decrypt') {
        $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
    }
    return $output;
}

Python функция (с исправлениями):

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

def decrypt(encrypted_string, secret_key, secret_iv):
    # Генерация ключа и IV
    key = hashlib.sha256(secret_key.encode()).digest()  # Создание бинарного ключа
    iv = hashlib.sha256(secret_iv.encode()).digest()[:16]  # Первые 16 байт для IV
    # Декодирование строки, закодированной в Base64
    decoded_data = base64.b64decode(encrypted_string)
    # Создание объекта шифрования для расшифровки
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # Расшифровка
    decrypted_padded = cipher.decrypt(decoded_data)
    # Удаление отступов (PKCS7)
    decrypted = unpad(decrypted_padded, AES.block_size)
    return decrypted.decode('utf-8')

Проверка решения

  1. Шифрование в PHP: Закодируйте строку с помощью функции encrypt_decrypt с параметром ‘encrypt’. Запишите результат.

  2. Расшифровка в Python: Используйте ваш функцию decrypt, передав ей зашифрованную строку, а также те же secret_key и secret_iv.

Если все шаги выполнены корректно, то строка, расшифрованная в Python, должна совпадать со строкой, которая была зашифрована в PHP.

Заключение

Убедитесь, что используемые вами ключ и IV одинаковые в обоих языках, а также корректно обрабатывайте отступы. Следуя данным рекомендациям, вы сможете успешно расшифровать строки, зашифрованные в PHP, в вашей Python-программе.

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

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