PHP Blowfish CBC BC Pearl Crypt - PullRequest
0 голосов
/ 27 августа 2018

Я шифрую номера клиентов в PHP с использованием openssl_encrpyt.

$value = '01715034842';
$key = 'pi3kn3W@k@cj3';                
$iv = 'Toy@dtv!';
$cipher = 'bf-cbc';

$crypted = openssl_encrypt($value, $cipher, $key, true, $iv);
$hashValue = unpack('H*',$crypted);

Конечный результат: 0b6b81176ac7c298ebcb294f0a581539

Также мой друг программирует другую часть в Pearl.И он также кодирует то же число, используя те же ключи и используя Blowfish для (он использует библиотеку жемчуга: https://metacpan.org/pod/release/LDS/Crypt-CBC-2.30/CBC.pm):

use Crypt::CBC;
use Crypt::Blowfish;


## szyfrowanie
my $key = 'pi3kn3W@k@cj3';
my $iv = 'Toy@dtv!';

my $cipher = Crypt::CBC->new(   -key    => $key,
                                -iv => $iv,
                                -header => 'none',
                                -cipher => 'Blowfish'
                            );
sub mkHash {
        my  $crypt = $cipher->encrypt_hex($_[0]);
#        print 'Hash: '.$crypt."\n";
        return $crypt;
}


sub deHash {
        my $crypt = $cipher->decrypt_hex($_[0]);
       # print 'string: '.$crypt."\n";
        return $crypt;
}

my $clientHash = mkHash($smc);

И он получает для того же набора данных другой результат:c5377bcf0f55af641709c35928350576

Так что мы не можем использовать этот широкий диапазон.Это зависит от языковых различий программирования?Или это ошибка в моем коде или языке?Я думаю, что когда мы используем один и тот же набор данных и одинаковое шифрование (BlowFish CBC), мы должны получать одинаковые результаты на всех языках.

Ждем мнения по этому делу.

НаилучшееBartek.

1 Ответ

0 голосов
/ 27 августа 2018

Рабочие скрипты

Следующие сценарии 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..
...