Одинаковое возвращаемое значение в php и perl 3DES CBC

Я хотел бы знать, как вернуть те же значения для 3DES-надписи в Perl и PHP. Код PHP выглядит следующим образом:

$bytes = array(0,0,0,0,0,0,0,0);
$iv = implode(array_map("chr", $bytes));
$ciphertext = mcrypt_encrypt(MCRYPT_3DES, base64_decode('Mk9m98IfEblmPfrpsawt7BmxObt98Jev'), '0000001920', MCRYPT_MODE_CBC, $iv);
echo base64_encode($ciphertext);

Результат: «A / VCTXA6q / x / emW0zzlSDg ==»

Код Perl:

use Crypt::CBC;
$cipher = Crypt::CBC->new(  -key    => decode_base64('Mk9m98IfEblmPfrpsawt7BmxObt98Jev'),
-cipher => 'DES_EDE3',
-iv     => pack("H*","0000000000000000"),
-literal_key => 1,
-header      => 'none'
);

$ciphertext = $cipher->encrypt("0000001920");
print encode_base64($ciphertext, '');

Результат: «A / VCTXA6q / y9g7ypgqlWIg ==»

Результаты очень похожи, что я делаю неправильно в моем Perl-коде?

2

Решение

Вы не используете тот же механизм заполнения.

Если вы читаете справочную страницу PHP mcrypt_encrypt очень внимательно вы увидите следующее примечание рядом с параметром данных:

Если размер данных не равен n * blockize, данные будут дополнены символом ‘\ 0’.

Теперь, если вы также прочитали справочную страницу Perls Crypt :: CBC, вы заметили, что у них есть несколько методов заполнения (определяемых -padding параметр). По умолчанию используется PKCS # 5, который отличается от простого заполнения 0x00,

Теперь, если вы измените отступ "null"Perl печатает так же, как PHP. Итак, ваш код должен выглядеть так:

use MIME::Base64;
use Crypt::CBC;
$cipher = Crypt::CBC->new(  -key    => decode_base64('Mk9m98IfEblmPfrpsawt7BmxObt98Jev'),
-cipher => 'DES_EDE3',
-iv     => pack("H*","0000000000000000"),
-padding     => "null",
-literal_key => 1,
-header      => 'none'
);

$ciphertext = $cipher->encrypt("0000001920");
print encode_base64($ciphertext, '');

В качестве альтернативы вы можете реализовать PKCS # 5 в PHP, что вам нужно сделать самостоятельно, так как PHP не включает его по умолчанию (найдите PHP PKCS # 5, и вы, вероятно, найдете некоторые фрагменты кода, которые вы можете использовать, даже если простая функция PKCS # 5 в одном из комментариев PHP-документа).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]