如何计算 3des 加密密钥的正确 KCV 值?
How to calculate proper KCV value for a 3des encryption Key?
我正在尝试计算 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);
这个 returns 错误值:953f34d098f996f9 应该是(最终的 kcv)53173F。这里出了什么问题?
我不是密码学家,但快速谷歌搜索说 3DES KCV 需要在 "string of binary zeroes" 上计算,而 $zeroBytes = 00000000;
不是。
PHP 会将其读作 0
,然后将其输入为 ASCII 零字符,又名 0x30
.
我想你想要的是:
$zeroBytes = "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]";
这会给你八个 NULL 字节,又名 0x00
。
我发现您的代码有两个问题:1. 密钥应该是二进制的,2. 应该使用空字节,而不是整数零。
$key = pack('H*', '0123456789ABCDEF');
$data = "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]";
$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 = "[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]";
$kcv = strtoupper(bin2hex(mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_ECB)));
var_dump($kcv);
这输出 53173F8B139F34FE
。有关详细信息,请参阅 Keying options:
The standards define three keying options:
- Keying option 1: All three keys are independent.
- Keying option 2: K1 and K2 are independent, and K3 = K1.
- Keying option 3: All three keys are identical, i.e. K1 = K2 = K3.
我正在尝试计算 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);
这个 returns 错误值:953f34d098f996f9 应该是(最终的 kcv)53173F。这里出了什么问题?
我不是密码学家,但快速谷歌搜索说 3DES KCV 需要在 "string of binary zeroes" 上计算,而 $zeroBytes = 00000000;
不是。
PHP 会将其读作 0
,然后将其输入为 ASCII 零字符,又名 0x30
.
我想你想要的是:
$zeroBytes = "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]";
这会给你八个 NULL 字节,又名 0x00
。
我发现您的代码有两个问题:1. 密钥应该是二进制的,2. 应该使用空字节,而不是整数零。
$key = pack('H*', '0123456789ABCDEF');
$data = "[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]";
$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 = "[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]";
$kcv = strtoupper(bin2hex(mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_ECB)));
var_dump($kcv);
这输出 53173F8B139F34FE
。有关详细信息,请参阅 Keying options:
The standards define three keying options:
- Keying option 1: All three keys are independent.
- Keying option 2: K1 and K2 are independent, and K3 = K1.
- Keying option 3: All three keys are identical, i.e. K1 = K2 = K3.