Если я зашифрую что-то с помощью 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'
fake_key
не является допустимым ключом AES (или вы использовали этот ключ?). Так что опубликуйте открытый текст, ключ, IV и, самое главное, зашифрованные тексты под Windows и MAC. При этом можно, по крайней мере, определить, какая система неправильно шифрует. - person user 9014097   schedule 08.07.2021w9oKTqKTtvBuRUVbhQP/qw==
. Это также правильный зашифрованный текст, созданный AES-128-CBC, см. здесь. - person user 9014097   schedule 09.07.2021w9oKTqKTtvBuRUVbhQP/qw==
, который вы получаете на Mac, правильный. 3. Либо ваш ключ/iv/открытый текст каким-то образом отличается на компьютере с Windows, либо что-то ужасно не так с OpenSSL на этом компьютере. 4. Ключи и IV являются строками, а не числами. Заключите их в кавычки, возможно, версия для Windows неправильно жонглирует типами. Подумайте об этом, если вы каким-то образом все еще используете 32-битную версию PHP, ей вообще не понравятся эти 16-значные числа. - person Sammitch   schedule 09.07.2021