【问题标题】:How to calculate proper KCV value for a 3des encryption Key?如何计算 3des 加密密钥的正确 KCV 值?
【发布时间】:2015-06-19 07:38:25
【问题描述】:

我正在尝试计算 DES 加密的 KCV。

$data = 'F337CE3C64E02D96C61A9EC69E051D5A';
$transport = '4B4D3733504D3735';
$encData = bin2hex(mcrypt_encrypt(MCRYPT_DES, pack('H*', $transport),         
$data, MCRYPT_MODE_ECB));

这一切都很好,数据已正确加密。

现在我要计算 KCV。

$key = 'F337CE3C64E02D96C61A9EC69E051D5A';
$zeroBytes = 00000000;
$kcv = bin2hex(mcrypt_encrypt(MCRYPT_3DES, $key, $zeroBytes, MCRYPT_MODE_ECB));
var_dump($kcv);

这会返回错误的值:953f34d098f996f9,它应该是(最终的 kcv)53173F。这里出了什么问题?

【问题讨论】:

    标签: php encryption mcrypt


    【解决方案1】:

    我不是密码学家,但快速谷歌搜索说需要根据“二进制零字符串”计算 3DES KCV,而 $zeroBytes = 00000000; 不是这样。

    PHP 会将其读取为 0,然后将其输入到 ASCII 零字符中,也就是 0x30

    我想你想要的是:

    $zeroBytes = "\0\0\0\0\0\0\0\0";
    

    这会给你八个 NULL 字节,也就是 0x00

    【讨论】:

    • 感谢您的快速回复。这是一个很好的镜头,但不幸的是这也给出了错误的 kcv ...我想我已经尝试了所有方法,但似乎没有任何效果。
    【解决方案2】:

    我发现您的代码存在两个问题:1. 密钥应该是二进制的,2. 应该使用空字节,而不是整数零。

    $key = pack('H*', '0123456789ABCDEF');
    $data = "\0\0\0\0\0\0\0\0";
    
    $kcv = strtoupper(bin2hex(mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_ECB)));
    var_dump($kcv);
    

    这会按预期输出D5D44FF720683D0D(密钥0123456789ABCDEF 的KCV 是D5D44FF720683D0D)。

    编辑:在您的情况下,您需要将前 16 个字符附加到密钥的末尾以获得正确的 KCV:

    $key = 'F337CE3C64E02D96C61A9EC69E051D5A';
    $key .= substr($key, 0, 16);
    $key = pack('H*', $key);
    
    $data = "\0\0\0\0\0\0\0\0";
    
    $kcv = strtoupper(bin2hex(mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_ECB)));
    var_dump($kcv);
    

    这会输出53173F8B139F34FE。详情请见Keying options

    标准定义了三个键控选项:

    • 键控选项 1:所有三个键都是独立的。
    • 键控选项 2:K1 和 K2 是独立的,并且 K3 = K1。
    • 键控选项 3:所有三个键都相同,即 K1 = K2 = K3。

    【讨论】:

    • 现在这个家伙似乎是个密码学家。 :P
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多