1

我有一个 128 位 3DES 密钥 1915372928A30803A25B0659A4DD6525,如何将密钥拆分为 3 个组件并计算每个组件的 KCV?我想做类似于下面的在线工具

https://www.emvlab.org/keyshares/?combined=1915372928A30803A25B0659A4DD6525&combined_kcv=2082A4&one=B9FFAF926385DBED0FBC087F5DC674C3&one_kcv=C69561&two=EA3CD5B063E0BF73F6C5ECB5F7D32080&two_kcv=33D908&three=4AD64D0B28C66C9D5B22E2930EC83166&three_kcv=03DCA8&numcomp=three&parity=ignore&action=Generate+128+bit

我用来生成 3DES 密钥的代码

public byte[] GenerateThreeDesKey()
{
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] tripleDesKey = new byte[16];
    rng.GetBytes(tripleDesKey);
    for (var i = 0; i < tripleDesKey.Length; ++i)
    { 
        int keyByte = tripleDesKey[i] & 0xFE; 
        var parity = 0; 
        for (int b = keyByte; b != 0; b >>= 1) 
            parity ^= b & 1;
        tripleDesKey[i] = (byte)(keyByte | (parity == 0 ? 1 : 0)); 
    }
    return tripleDesKey;
}

拿到key后,如何将key拆分成3个分量,计算出KCV?

4

2 回答 2

1

以与您现在相同的方式生成两个单独的 DES 128 位密钥,它们是组件 1 和 2。然后将这些密钥与您当前的(主密钥)进行异或。结果是第三个组件。如果需要,您也可以调整该密钥的奇偶性。

要计算 KCV,只需使用生成的组件加密设置为零的 8 字节块。如果直接块加密不可用,您可以使用 ECB 模式或 CBC 模式(无填充)。对于 CBC,您还需要将 IV 设置为全零。然后取结果的最左边字节并编码为十六进制。

于 2017-04-09T00:54:13.487 回答
0

1-要计算 KCV,您必须使用生成的密钥加密 16 个字节的零

(data: 00000000000000000000000000000000, key: 404142434445464748494A4B4C4D4E4F) = 8BAF473F2F8FD0948BAF473F2F8FD094 (last three bytes is KCV (8BAF47))

2- 将密钥拆分为 3 个组件 从密钥开始404142434445464748494A4B4C4D4E4F 创建 2 个相同长度的随机数(本例中为 16 个字节):

Rand 1 : 988A59D7273186B8C9C9922B6D40BA75并且Rand 2: 8936E5269ADFABE7D4829B2EFB3BF5D9 (随机数将成为 Component1 和 Component2)现在对 3 个数字进行异或。即 XOR Key1、Component1 和 Component2 在一起:

XOR(0123456789ABCDEFFEDCBA9876543210, 988A59D7273186B8C9C9922B6D40BA75, 8936E5269ADFABE7D4829B2EFB3BF5D9) = 109FF9963445E0B0E397B39DE02F7DBC (the result will be key Component3)
于 2020-07-06T16:10:39.280 回答