Я хотел бы знать, как вернуть те же значения для 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-коде?
Вы не используете тот же механизм заполнения.
Если вы читаете справочную страницу 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-документа).
Других решений пока нет …