【问题标题】:Same return value in php and perl 3DES CBCphp 和 perl 3DES CBC 中的返回值相同
【发布时间】:2016-02-08 07:17:34
【问题描述】:

我想知道如何在 perl 和 php 中为 3DES 加密返回相同的值。 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 perl encryption 3des


    【解决方案1】:

    您没有使用相同的填充机制。

    如果你仔细阅读PHP's mcrypt_encrypt的参考页面,你会在data参数旁边看到以下注释:

    如果数据的大小不是n * blocksize,数据将用'\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, '');
    

    另外,您可以在 PHP 中实现 PKCS#5,您必须自己完成,因为 PHP 默认不包含它(搜索 PHP PKCS#5,您可能会找到一些可以使用的 code-sn-ps ,甚至在其中一个 PHP-doc cmets 中有一个 simple PKCS#5 function

    【讨论】:

    • 请注意,PHP 的填充方法对于任何可能包含 NUL 的字符串(即几乎任何“二进制”文件)都是不安全的。
    • 这很有趣@ikegami!感谢您的信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多