Результаты работы аналогичного кода на PHP и Python не совпадают
Работаю над API-интеграцией с системой, написанной на PHP. Мне нужно, чтобы мой код на Python создавал точно такую же строку, как приведенный ниже PHP код. Однако я не смог получить совпадение результатов.
<?php
function encrypt_payload($payload, $test_id, $test_secret, $test_iv){
$cipher = "AES-128-CTR";
$iv_length = openssl_cipher_iv_length($cipher);
$options = 0;
$encryption_key = md5($test_id . $test_secret);
$encoded_payload = base64_encode($payload);
$encryption = base64_encode(openssl_encrypt($encoded_payload, $cipher, $encryption_key, $options, $test_iv));
return $encryption;
}
$payload = json_encode(["first_name" => "Ivan", "last_name" => "Ivanov"]);
$test_id = "1111";
$test_secret = "45321d6";
$test_iv = "BFB0503C7DA3C32B";
$encrypted = encrypt_payload($payload, $test_id, $test_secret, $test_iv);
echo "Encrypted: " . $encrypted;
?>
Одна из моих попыток реализации на python:
import json
import hashlib
import base64
from Crypto.Cipher import AES
def encrypt_payload(payload, test_id, test_secret, test_iv):
simple_string = base64.b64encode(payload.encode()).decode()
encryption_key = hashlib.md5(f"{test_id}{test_secret}".encode()).digest()
iv = test_iv.encode()
cipher = AES.new(encryption_key, AES.MODE_CTR, initial_value=iv, nonce=b"")
encrypted_payload = cipher.encrypt(simple_string.encode())
return base64.b64encode(encrypted_payload).decode()
test_id = "1111"
test_secret = "45321d6"
test_iv = "BFB0503C7DA3C32B"
payload_string = json.dumps({"first_name": "Ivan", "last_name": "Ivanov"}, separators=(",", ":"))
encrypted_payload = encrypt_payload(payload_string, test_id, test_secret, test_iv)
print("Encrypted:", encrypted_payload)
Результат работы кода на PHP:
Encrypted: Sk02eEJEbXhlSlNGMkxoME81aTVobURYTWR1WFNuYlNFV0NCd2M4Z0NqdGN0blkyeWFrUTB5LzJpWXdQUzI0ZVVXYUhRR0l6UEZ3PQ==
И на Python:
Encrypted: fcgjSXh98jzz9aoXZDYYbwa+knLwqodJUXOb6VQkBwg75SwWWIr3QogcQXLInDLVTZiYT4Lp3WQ=
Выглядит, будто PHP "под капотом" использует так же двойную конвертацию base64, однако, при добавлении её на Python результат так же не совпадает:
Encrypted: QukFb3ty/h/E3eMJbwtFMhiCnmPBt7FQUSi+zkoPDw8BuxI6WdfdQrcIYC7MxhSKTaKcfoLG5wmZgGbMUzPbR3TY4+xJN28NZoxTDQ==
Все варианты реализации которые, я пробовал (включая использование других библиотек) к идентичному результату так и не привели.