Вопрос или проблема
вот моя функция на 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, необходимо убедиться, что используемые методы и данные соответствуют друг другу. Ниже приведены шаги, которые помогут вам устранить проблему, а также исправленный код.
Причины проблемы
-
Постановка отступов: Ваша функция расшифровки на Python должна быть в состоянии обрабатывать данные, зашифрованные с использованием
PKCS7
(илиPKCS5
), посколькуOpenSSL
в PHP по умолчанию используетPKCS7
для отступов. Ошибка "Data must be padded to 16 byte boundary" указывает на отсутствие корректного отступа. -
Совпадение ключа и вектора инициализации (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')
Проверка решения
-
Шифрование в PHP: Закодируйте строку с помощью функции
encrypt_decrypt
с параметром ‘encrypt’. Запишите результат. -
Расшифровка в Python: Используйте ваш функцию
decrypt
, передав ей зашифрованную строку, а также те жеsecret_key
иsecret_iv
.
Если все шаги выполнены корректно, то строка, расшифрованная в Python, должна совпадать со строкой, которая была зашифрована в PHP.
Заключение
Убедитесь, что используемые вами ключ и IV одинаковые в обоих языках, а также корректно обрабатывайте отступы. Следуя данным рекомендациям, вы сможете успешно расшифровать строки, зашифрованные в PHP, в вашей Python-программе.