Поскольку Mcrypt устарел, я хочу использовать OpenSSL вместо этого в моем коде, так как мы уже используем php 7.0.17 на нашем сервере, и нет никаких подсказок, когда они обновляют его.
Некоторые сторонние API (размещенные на PHP 5.x, вероятно, и использование mcrypt ), принимают зашифрованные данные. Они предоставили методы, которые они используют для шифрования / расшифровки строк.
Вот они
$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c' ; public function encrypt128($str) { $block = mcrypt_get_block_size("rijndael_128", "ecb"); $pad = $block - (strlen($str) % $block); $str .= str_repeat(chr($pad), $pad); return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB)); } public function decrypt128($str) { $str = base64_decode($str); $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB); $len = strlen($str); $pad = ord($str[$len - 1]); return substr($str, 0, strlen($str) - $pad); }
используя эти методы string small1
если зашифровано становится v7IXp5vVaFVXXlt/MN8BVw==
Мы хотим использовать openssl_encrypt
на нашей стороне, чтобы, если мы шифруем ту же строку с OpenSSL, она должна давать такие же результаты, как Mcrypt. Я исследовал, что mcrypt с использованием rijndael-128 Mode ecb должен быть совместим с OpenSSL aes-128-ecb
.
За последние несколько часов я пытался сделать свой собственный метод для шифрования строк, обслуживающих тот же результат, используя OpenSSL. До сих пор я пришел к этому
public function sslEncrypt128($str) { $secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c'; return base64_encode(openssl_encrypt($str, 'aes-128-ecb', $secret, OPENSSL_RAW_DATA)); }
Но он создает различную строку SxJ3+EdaeItZx3/EwGTUbw==
же, как и выше. Я не знаю, является ли это проблемой флага или дополнением, любые указатели будут приветствоваться.
Я добавил код здесь, чтобы проверить онлайн https://3v4l.org/v2J2N
Заранее спасибо.
В вашем конкретном примере я обнаружил, что, изменяя aes-128-ecb
на aes-256-ecb
, он производит тот же результат, что и унаследованный mcrypt_encrypt
.
Скорее всего, ключ должен был использоваться как hex (он уже в шестнадцатеричном формате) не как строка, которая должна быть преобразована в hex.
Mcrypt:
mcrypt
не поддерживает стандартное дополнение PKCS # 7 (née PKCS # 5), только нестандартное заполнение нулей, но добавление явно добавляется до mcrypt .
Шифрование v7IXp5vVaFVXXlt/MN8BVw==
– это правильное шифрование на основе дополнения PKCS # 7. ECB и ключ в виде строки.
См .: mcrypt – КАЛЬКУЛЯТОР AES .
В шестнадцатеричном виде заметьте, что заполнение данных хорошо видно:
key: 6130613765373939376236643566636435356634623563333236313162383763
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: BFB217A79BD56855575E5B7F30DF0157
В Base64:
encrypted: v7IXp5vVaFVXXlt/MN8BVw==
OpenSSL:
Обратите внимание, что ключ имеет 256 бит, но вызов OpenSSL с «aes-128-ecb», по-видимому, подразумевает 128-но ключ. Таким образом, клавиши не совпадают.
См.: OpenSSL – КАЛЬКУЛЯТОР AES
В шестнадцатеричном виде заметьте, что заполнение данных хорошо видно:
key: 61306137653739393762366435666364
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: 4B1277F8475A788B59C77FC4C064D46F
В Base64:
encrypted: SxJ3+EdaeItZx3/EwGTUbw==