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

Php 如何计算3des加密密钥的正确KCV值?,php,encryption,mcrypt,Php,Encryption,Mcrypt,我正在计算DES加密的KCV $data = 'F337CE3C64E02D96C61A9EC69E051D5A'; $transport = '4B4D3733504D3735'; $encData = bin2hex(mcrypt_encrypt(MCRYPT_DES, pack('H*', $transport), $data, MCRYPT_MODE_ECB)); 这一切都很好,数据得到了正确的加密 现在我想计算KCV $key = 'F337CE3C64E02D96

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

我不是密码学家,但快速搜索一下就会发现3DES KCV需要在“二进制零字符串”上进行计算,
$zeroBytes=00000000不是这样

PHP将其读取为
0
,然后将其键入ASCII零字符,即
0x30

我想你想要的是:

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

这将给您八个空字节,也就是
0x00

我发现您的代码有两个问题: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
。有关更多详细信息,请参阅:

这些标准定义了三个关键帧选项:

  • 设置关键帧选项1:所有三个关键帧都是独立的
  • 键控选项2:K1和K2是独立的,K3=K1
  • 键控选项3:所有三个键都相同,即K1=K2=K3

谢谢你的快速回复。这是一个好镜头,但不幸的是,这也给了错误的kcv。。。我想我已经试过了所有的方法,但似乎都不管用。现在这个家伙似乎是个密码学家P