Прежде всего, OPENSSL_NO_PADDING
не должен использоваться с openssl_encrypt()
. В документации упоминается OPENSSL_ZERO_PADDING
, что (смущает) означает «без заполнения». Это то, что вы хотите.
OPENSSL_NO_PADDING
- , предназначенный для использования с асимметричной криптографией . По совпадению он имеет значение 3, равное OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
. Это причина, по которой вы можете использовать его неправильно, без последствий (в данном случае).
Ваши шифротексты отличаются, потому что функция openssl_encrypt()
в режиме bf-ecb
по умолчанию дополнит вашу клавишу ключом \0
, если его длина меньше 16 байтов. Это не требуется для blowfish, и mcrypt_encrypt()
этого не делает. Чтобы отключить это поведение, используйте флаг OPENSSL_DONT_ZERO_PAD_KEY
при вызове openssl_encrypt()
. Поскольку этот флаг, похоже, не задокументирован, вам нужно перейти к исходному коду , чтобы узнать об этом :-). Или прочитайте Ошибка # 72362 Шифрование OpenSSL Blowfish некорректно для коротких ключей .
При этом правильный вызов openssl_encrypt()
становится:
$opts = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING | OPENSSL_DONT_ZERO_PAD_KEY;
$encrypted_openssl = openssl_encrypt($message_padded, "bf-ecb", $key, $opts);
Тестирование:
$ php bf.php
My secret message => JPO/tvAqFD2KCTqfv0l8uWLfPUWdZIxQ
My secret message => JPO/tvAqFD2KCTqfv0l8uWLfPUWdZIxQ