Рабочие скрипты
Следующие сценарии PHP и Perl показывают, как добиться одинакового вывода для двух языков. Ниже я объясню некоторые детали.
PHP:
$value = '01715034842';
$cipher = 'bf-cbc';
$key = '12345678901234567890123456789012345678901234567890123456';
$option = OPENSSL_RAW_DATA;
$iv = 'Toy@dtv!';
$crypted = openssl_encrypt($value, $cipher, $key, $option, $iv);
echo($crypted)
Perl:
use Crypt::CBC;
use Crypt::Blowfish;
my $value = '01715034842';
my $key = '12345678901234567890123456789012345678901234567890123456';
my $iv = 'Toy@dtv!';
my $cipher = Crypt::CBC->new( -literal_key => 1,
-key => $key,
-iv => $iv,
-header => 'none',
-cipher => 'Blowfish'
);
my $crypted = $cipher->encrypt($value);
print $crypted;
Использование diff
на двух выходах не дает разницы, показывая, что они одинаковы:
$ diff <(php encrypt.php) <(perl encrypt.pl)
$
Подробности, поясняющие необходимые изменения
В следующих разделах объясняются необходимые изменения по сравнению с исходным кодом.
Ключ шифрования
Функция PHP openssl_encrypt()
всегда ожидает необработанный ключ. Байты, которые вы передаете, являются байтами, используемыми в качестве ключа шифрования С другой стороны, класс Perl CBC
ожидает парольную фразу по умолчанию , из которой он получит ключ шифрования , выполняя хэш MD5 . Если вы хотите, чтобы класс использовал ваши необработанные байты в качестве ключа шифрования, вы должны установить для параметра literal_key
значение 1
.
После того, как вы это сделаете, класс CBC
ожидает, что ключом будет точное число байтов, необходимое для схемы шифрования, , который класс CBC
предполагает 56
для Crypt::Blowfish
осуществление . Отсюда и скорректированный ключ в скриптах. В противном случае вы получите ошибку If specified by -literal_key, then the key length must be equal to the chosen cipher's key length of 56 bytes
Выходной формат
Функция PHP openssl_encrypt()
по умолчанию возвращает строку в кодировке base64, класс CBC
возвращает необработанные байты. Один из способов сделать это согласованным - установить в PHP параметр OPENSSL_RAW_DATA
.
Проверка зашифрованного текста
Если вы хотите проверить зашифрованный текст в читаемом формате, вы можете добавить свои собственные процедуры печати в конце или передать вывод в инструмент, такой как hexdump
или xxd
$ php encrypt.php | xxd
00000000: 5f35 3205 74e8 dcaa 2f05 9aa4 366e ef8b _52.t.../...6n..
$ perl encrypt.pl | xxd
00000000: 5f35 3205 74e8 dcaa 2f05 9aa4 366e ef8b _52.t.../...6n..