MCrypt rijndael-128 для преобразования OpenSSL aes-128-ecb

Поскольку 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==