如何计算3des加密密钥的正确KCV值?

时间:2015-04-13 20:43:34

标签: php encryption mcrypt

我试图计算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。这里出了什么问题?

2 个答案:

答案 0 :(得分:1)

我看到你的代码有两个问题: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。
  •   

答案 1 :(得分:0)

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

PHP会将其读作0,然后将其输入ASCII零字符,即0x30

我认为你想要的是:

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

这将为您提供8个NULL字节,即0x00