openssl_error_string() для PHP, не работающего в среде разработки Windows

Если я зашифрую что-то с помощью openssl_encrypt в своей среде разработки MAC OSX, я не смогу расшифровать это в своей среде разработки Windows.

  • Моя среда разработки Mac использует MAMP для OSX с PHP 7.4.2.
  • В моей среде разработки Windows используется MAMP для Windows с PHP 7.4.2.

Несколько заметок:

  • Если я зашифрую с помощью openssl_encrypt в Windows, я также смогу расшифровать его в Windows.
  • Если я зашифрую его на Mac, я не смогу расшифровать его в Windows, но я могу расшифровать его на Mac без проблем.
  • Ошибка, которую я получаю в Windows, - error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt.

Я прочитал это сообщение: Как устранить ошибку EVP_DecryptFInal_ex: ошибка расшифровки при расшифровке файла

И из этой статьи я предполагаю, что использую несовместимые версии openssl_decrypt, но я не уверен, как это исправить, и если это вообще проблема.

Вот мой код:

<?php
/**
 *  First, this code works on both Mac and Windows
*/ 

$cipher = "AES-128-CBC";
$key = 1234567890123456;
$iv = 1234567890123456;
$plaintext = '1234';

$encrypted = openssl_encrypt($plaintext, $cipher, $key, 0, $iv);
if(false === $encrypted)
{
    echo openssl_error_string();
    die;
}
echo "Plain text: " . $plaintext . "<br>";
echo "Encrypted text: " . $encrypted . "<br><br>";
// on Mac $encrypted = w9oKTqKTtvBuRUVbhQP/qw==
// on Win $encrypted = 19MQn7slHAAdFYR1TJSZxQ==

$decrypted = openssl_decrypt($encrypted, $cipher, $key, 0, $iv);
$result = $decrypted === $plaintext;

echo "Text was encrypted and decrypted on the same system: ";
print $result ? 'It worked<br><br>' : 'It did not work<br><br>';
// output on both Windows and Mac - It worked

/**
 *  Code below does not work
*/ 

// This is the encrypted text the Mac produces
$text_encrypted_mac = 'w9oKTqKTtvBuRUVbhQP/qw==';

$decrypted = openssl_decrypt($text_encrypted_mac, $cipher, $key, 0, $iv);
$result = $decrypted === $plaintext;

echo "Start with text encrypted on Mac: ";
print $result ? 'It worked<br>' : 'It did not work<br>';
// output on Mac - 'It worked'
// output on Windows - 'It did not work'


// this is the encrypted text I get on Windows
$text_encrypted_win = '19MQn7slHAAdFYR1TJSZxQ==';

$decrypted = openssl_decrypt($text_encrypted_win, $cipher, $key, 0, $iv);
$result = $decrypted === $plaintext;

echo "Start with text encrypted on Windows: ";
print $result ? 'It worked<br>' : 'It did not work<br>';
// output on Mac - 'It did not work'
// output on Windows - 'It worked'


person glass duo    schedule 08.07.2021    source источник
comment
Пожалуйста, опубликуйте полные и действительные наборы тестовых данных. fake_key не является допустимым ключом AES (или вы использовали этот ключ?). Так что опубликуйте открытый текст, ключ, IV и, самое главное, зашифрованные тексты под Windows и MAC. При этом можно, по крайней мере, определить, какая система неправильно шифрует.   -  person user 9014097    schedule 08.07.2021
comment
Вопрос был обновлен, так что ключ теперь 16 бит. Спасибо за этот вклад. Это не изменило результатов. У меня все еще та же проблема.   -  person glass duo    schedule 09.07.2021
comment
На моем компьютере с Windows 10, а также на paiza online генерируется результат Mac, т.е. w9oKTqKTtvBuRUVbhQP/qw==. Это также правильный зашифрованный текст, созданный AES-128-CBC, см. здесь.   -  person user 9014097    schedule 09.07.2021
comment
@ user 9014097 - Кажется, моя Windows использует другую версию openssl, чем мой Mac, и отличается от вашей машины. Знаете ли вы что-нибудь о том, как изменить версию openssl, которую я использую?   -  person glass duo    schedule 09.07.2021
comment
1. Выходные данные AES не различаются между версиями или реализациями OpenSSL. 2. Зашифрованный текст w9oKTqKTtvBuRUVbhQP/qw==, который вы получаете на Mac, правильный. 3. Либо ваш ключ/iv/открытый текст каким-то образом отличается на компьютере с Windows, либо что-то ужасно не так с OpenSSL на этом компьютере. 4. Ключи и IV являются строками, а не числами. Заключите их в кавычки, возможно, версия для Windows неправильно жонглирует типами. Подумайте об этом, если вы каким-то образом все еще используете 32-битную версию PHP, ей вообще не понравятся эти 16-значные числа.   -  person Sammitch    schedule 09.07.2021
comment
@Sammitch - СПАСИБО!!!! Добавление кавычек к моим ключам и IV помогло. Очень ценю вашу помощь.   -  person glass duo    schedule 13.07.2021


Ответы (1)


@Sammitch дал мне правильный ответ на этот вопрос. Мне нужно было поместить мой ключ и IV в кавычки. Таким образом, правильный код для ключей и IV выглядит следующим образом:

$cipher = 'AES-128-CBC';
$key = '1234567890123456';
$iv = '1234567890123456';
$plaintext = '1234';
person glass duo    schedule 13.07.2021