я должен заменить устаревшую функцию mcrypt_encrypt, используя openssl_encrypt.
Моя старая функция mcrypt использует шифрование des и режим ecb.
Я перепробовал все варианты шифрования (openssl_get_cipher_methods) и не могу найти тот же результат. Помогите, пожалуйста
$key = '04647132';
$message = hex2bin('046471324B3680');
$mcrypt = base64_encode(mcrypt_encrypt('des', $key, $message, 'ecb'));
foreach (openssl_get_cipher_methods(true) as $cipher) {
$openSsl = base64_encode(@openssl_encrypt($message, $cipher, $key, OPENSSL_RAW_DATA));
if ($openSsl == $mcrypt) {
echo 'FOUND - ' . $cipher . ' = ' . $openSsl;
exit;
}
}
Это связано с разным заполнением данных — PKCS # 5 для MCrypt и PKCS # 7 для OpenSSL.
Вы можете предварительно колодки $message
самостоятельно (любой стандарт будет работать, но PKCS # 7 лучше) и используйте OPENSSL_ZERO_PADDING
флаг вместе с OPENSSL_RAW_DATA
, Это также означает, что после расшифровки вы должны вручную удалить заполнение — так обстоит дело со всеми режимами блочного шифрования.
Но это меньше всего твоих проблем …
Никто не должен использовать ECB или DES сегодня; Вы должны отойти от обоих как можно скорее. Это понятно, если вы поддерживаете устаревшую систему, но вам не нужно шифровать новый данные таким образом.
Когда вы в конечном итоге переходите в другой режим, не игнорируйте требование IV — причина, почему ECB плох, именно потому, что он не использует IV.
Кроме того, я знаю, что это просто пример кода, но $key
в вашем примере не правильный ключ … используйте random_bytes()
генерировать один.
Все это и многие другие проблемы, о которых вы даже не знаете, могут быть решены, если вы просто используете популярную, хорошо проверенную криптографическую библиотеку — она сделает всю работу за вас за один простой шаг.
Пожалуйста, серьезно подумайте об этом — даже профессиональные криптографы предпочитают сторонние библиотеки вместо написания собственного кода, и для этого есть веские причины.
Других решений пока нет …