Зашифровать с помощью mcrypt и расшифровать с помощью openssl в режиме CBC и шифре BLOWFISH. - PullRequest
0 голосов
/ 18 сентября 2018

Мы зашифровали некоторые данные в шифре mcrypt BLOWFISH, и режим CBC Строка зашифрована в php5.5, и нам необходимо расшифровать ее в php7.1 (версия php обновлена)

Ниже приведен наш кодчтобы попытаться расшифровать строку mcrypt с помощью openssl

$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, $iv);

echo $decrypted;

Приведенный выше код не расшифровывает строку.Пожалуйста, предложите мне любой способ расшифровки строки

1 Ответ

0 голосов
/ 19 сентября 2018

Вам не хватало одного параметра на стороне 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() похоже не способен на это.

...