В настоящее время в наших системах есть реализация mcrypt для шифрования некоторых полезных данных в нашем PHP-приложении. Теперь у нас есть новое требование, чтобы мы изменили модуль crypt на openssl. Также важно знать, что мы используем шифр blowfish и режим ecb. Поэтому я начал тестировать различия и то, как я могу расшифровать зашифрованные строки mcrypt с помощью openssl.
Я использовал стандартную функцию PHP:
- mcrypt_encrypt vs. openssl_encrypt
- mcrypt_decrypt vs. openssl_decrypt
Оба метода дают разные результаты. Второе - это то, что в данном шифре (blowfish) и режиме (ecb) в обоих типах требуются разные длины IV (openssl = 0 и mcrypt = 56).
Кто-нибудь знает, как я могу легко изменить модули без больших усилий по миграции?
Заранее спасибо!
UPDATE:
Вот код, который я проверял:
<code><?php
function say($message){
if(!is_string($message)){
if(!isset($_SERVER["HTTP_USER_AGENT"])) echo "<pre>";
echo var_export($message, true) . ((!isset($_SERVER["HTTP_USER_AGENT"]) ? "\n" : "<br />"));
if(!isset($_SERVER["HTTP_USER_AGENT"])) echo "
";
} Еще {
echo $ message. ((! isset ($ _ SERVER ["HTTP_USER_AGENT"])? "\ n": "
"));
}
}
сказать ("= Начать сырое шифрование");
$ key = "anotherpass";
$ str = "это работает";
сказать («Params:»);
say ("- строка для шифрования". $ str. "'");
сказать ("- ключ:". $ ключ);
сказать("");
$ params = array (
"openssl" => массив (
"cipher" => "BF",
"mode" => "ECB",
),
"mcrypt" => массив (
"cipher" => "blowfish",
"mode" => "ecb",
),
);
сказать ("= Mcrypt");
$ handler = mcrypt_module_open ($ params ['mcrypt'] ['cipher'], '', $ params ['mcrypt'] ['mode'], '');
$ iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($ handler), MCRYPT_RAND);
$ keysize = mcrypt_enc_get_key_size ($ handler);
mcrypt_generic_init ($ Обработчик, $ ключ, "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0");
сказать («Params:»);
say ("- InitVector" .bin2hex ($ iv). "(bin2hex)");
say ("- Максимальный размер ключа". $ keysize);
say ("- Cipher". $ params ['mcrypt'] ['cipher']);
say ("- Mode". $ params ['mcrypt'] ['mode']);
сказать("");
сказать («Шифрование:»);
$ m_encrypted = mcrypt_generic ($ handler, $ str);
$ m_decrypted = mdecrypt_generic ($ handler, $ m_encrypted);
say ("- Зашифровано" .bin2hex ($ m_encrypted). "(bin2hex)");
сказать ("- Расшифровано". $ m_decrypted);
сказать("");
сказать ("= Openssl");
сказать («Params:»);
сказать («- InitVector не требуется»);
say ("- Макс. размер ключа" .openssl_cipher_iv_length ($ params ['openssl'] ['cipher']. "-". $ params ['openssl'] ['mode']));
say ("- Cipher". $ params ['openssl'] ['cipher']);
say ("- Mode". $ params ['openssl'] ['mode']);
сказать("");
сказать («Шифрование:»);
$ o_encrypted = openssl_encrypt ($ str, $ params ['openssl'] ['cipher']. "-". $ params ['openssl'] ['mode'], $ key, true);
$ o_decrypted = openssl_decrypt ($ o_encrypted, $ params ['openssl'] ['cipher']. "-". $ params ['openssl'] ['mode'], $ key, true);
say ("- Зашифровано" .bin2hex ($ o_encrypted). "(bin2hex)");
сказать ("- Расшифровано". $ o_decrypted);
И вот мой результат:
= Begin raw encryption
Params:
- String to encrypt 'does it work'
- Key: anotherpass
= Mcrypt
Params:
- InitVector 06a184909d7bf863 (bin2hex)
- Max keysize 56
- Cipher blowfish
- Mode ecb
Encryption:
- Encrypted 0e93dce9a6a88e343fe5f90d1307684c (bin2hex)
- Descrypted does it work
= Openssl
Params:
- InitVector not needed
- Max keysize 0
- Cipher BF
- Mode ECB
Encryption:
- Encrypted 213460aade8f9c14d8d51947b8231439 (bin2hex)
- Descrypted does it work
Может быть, есть какие-нибудь идеи сейчас?
Спасибо!