PHP расшифровывает данные (зашифрованные с помощью mcrypt) с помощью openssl

У меня есть база данных, полная данных, зашифрованных в 3DES (ECB), которая была зашифрована с помощью библиотеки php Mcrypt. Поскольку Mcrypt удален, мне нужно переключиться на OpenSSL, чтобы расшифровать его. Все данные будут перешифрованы с использованием xchacha20-poly1305-ietf.

Поэтому мне не нужны комментарии о том, что 3DES не является безопасным, а ECB плохим и т. Д., Мы знаем, поэтому мы пытаемся расшифровать, чтобы иметь лучший алгоритм шифрования.

Ниже приведен код, который использовался для шифрования с использованием mcrypt, и 1 строка, которую мы пытаемся использовать (openssl) для ее расшифровки. Это всегда возвращает ложь, и мы задаемся вопросом, почему.

Я начинаю подозревать, что проблема в библиотеке mcrypt, использующей 8-байтовый IV, в то время как открытый SSL говорит, что это должно быть 0 байт.

Буду признателен за любую помощь, чтобы найти способ расшифровки значений с помощью openssl.

Заранее спасибо.

Вот код:

$sEncryptionKey = 'aaaabbbbccccddddeeeeffff';
$sDataToEncrypt = 'Foo bar';

echo "Data to be Encrypted: $sDataToEncrypt\n";

$rMcrypt = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
$iIvSize = mcrypt_enc_get_iv_size($rMcrypt); //This gives 8 bytes

$sInitializationVector = mcrypt_create_iv($iIvSize, MCRYPT_RAND);
$iKeySize = mcrypt_enc_get_key_size($rMcrypt);

if ($iKeySize != strlen($sEncryptionKey)) {
throw new Exception ('Invalid key length: '.$iKeySize);
}

mcrypt_generic_init($rMcrypt, $sEncryptionKey, $sInitializationVector);
$sEncryptedString = base64_encode(mcrypt_generic($rMcrypt, $sDataToEncrypt));

echo "Data Encrypted: $sEncryptedString\n";
$sDecryptedString = trim(mdecrypt_generic($rMcrypt, base64_decode($sEncryptedString)));

echo "Data Decrypted: $sDecryptedString\n";
mcrypt_generic_deinit($rMcrypt);
mcrypt_module_close($rMcrypt);

$sDecryptedString2 = openssl_decrypt(base64_decode($sEncryptedString), 'des-ede3', $sEncryptionKey, 0, ''); //this returns false.
echo "Data Decrypted (open SSL): $sDecryptedString2\n";

$sDecryptedString2 = openssl_decrypt(base64_decode($sEncryptedString), 'des-ede3', $sEncryptionKey, 0, $sInitializationVector); //Warning: openssl_decrypt(): IV passed is 8 bytes long which is longer than the 0 expected by selected cipher, truncating
?>

Вывод программы показывает:

Data to be Encrypted: Foo bar
Data Encrypted: 5Mraf9swmaI=
Data Decrypted: Foo bar
Data Decrypted (open SSL):

Warning: openssl_decrypt(): IV passed is 8 bytes long which is longer than the 0 expected by selected cipher, truncating in /usr/local/www/appcluster01.ezmax.ca/pub/web/test/ian/test.cmd on line 31

-2

Решение

Я только что понял, что я использовал openssl_decrypt неправильно.

Изменение на это работает нормально:

$sDecryptedString2 = openssl_decrypt(base64_decode($sEncryptedString), 'des-ede3', $sEncryptionKey, OPENSSL_ZERO_PADDING | OPENSSL_RAW_DATA, '');

Я надеюсь, что это поможет кому-нибудь когда-нибудь.

Спасибо

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]