Вам не хватало одного параметра на стороне openssl
: OPENSSL_DONT_ZERO_PAD_KEY
.
Если длина ключа, заданного для openssl_decrypt()
, меньше длины ключа по умолчанию для шифра (Blowfish в этомслучай) код клея PHP openssl
расширяет ключ до этой длины, добавляя дополнительные нули.Вы можете видеть, что это происходит здесь .Реализация mcrypt
не выполняет заполнение клавиш.Длина ключа openssl
по умолчанию для Blowfish составляет 16 байтов, поэтому, если ваш ключ короче 16 байтов, ключи для mcrypt
и openssl
будут отличаться - если вы не используете опцию openssl
, чтобы этого не делатьзаполнение клавиши.
Проверка того, что это действительно так:
# bf.php
$data = "Lorem ipsum";
$key = "12345678";
$iv = "12345678";
$encrypted = mcrypt_encrypt(
MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC, $iv);
#echo $encrypted . PHP_EOL;
$decrypted = openssl_decrypt(
$encrypted, "BF-CBC", $key,
OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING | OPENSSL_DONT_ZERO_PAD_KEY, $iv);
echo $decrypted . PHP_EOL;
и
$ php bf.php
Lorem ipsum
Этот комментарий tmadam является актуальнымтоже что касается нулей в конце.Расширяя это предложение:
var_dump($decrypted);
var_dump(rtrim($decrypted));
дает
string(16) "Lorem ipsum"
string(11) "Lorem ipsum"
Конечно, вы не можете сделать rtrim
для двоичных данных, в этом случае вам придется запомнить или сохранить, какой размервашего исходного открытого текста или вручную дополнить данные в соответствии с некоторой полезной схемой заполнения, а не дополнением нулями.mcrypt_encrypt()
похоже не способен на это.