如何拆分3DES密钥并在C#中计算KCV?

时间:2017-04-08 23:06:46

标签: c# cryptography 3des symmetric-key

我有一个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;
}

获取密钥后,如何将密钥拆分为3个组件并计算KCV?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

2-将键分为3个部分 从键404142434445464748494A4B4C4D4E4F开始 创建2个相同长度的随机数(在此示例中为16个字节):

Rand 1 : 988A59D7273186B8C9C9922B6D40BA75Rand 2: 8936E5269ADFABE7D4829B2EFB3BF5D9 (随机数将成为Component1和Component2) 现在对这3个数字进行XOR。即XOR Key1,Component1和Component2一起:

XOR(0123456789ABCDEFFEDCBA9876543210, 988A59D7273186B8C9C9922B6D40BA75, 8936E5269ADFABE7D4829B2EFB3BF5D9) = 109FF9963445E0B0E397B39DE02F7DBC (the result will be key Component3)