PHP расшифровывает данные (зашифрованные с помощью mcrypt) с помощью openssl - PullRequest
0 голосов
/ 09 ноября 2018

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

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

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

Я начинаю подозревать, что проблема в библиотеке 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

1 Ответ

0 голосов
/ 09 ноября 2018

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

Изменение на это прекрасно работает:

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

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

Спасибо

...