我有一个128位3DES密钥1915372928A30803A25B0659A4DD6525,如何将密钥分成3个组件并计算每个组件的KCV?我想对下面的在线工具做类似的事情
我用来生成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?
答案 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 : 988A59D7273186B8C9C9922B6D40BA75
和Rand 2: 8936E5269ADFABE7D4829B2EFB3BF5D9
(随机数将成为Component1和Component2) 现在对这3个数字进行XOR。即XOR Key1,Component1和Component2一起:
XOR(0123456789ABCDEFFEDCBA9876543210, 988A59D7273186B8C9C9922B6D40BA75, 8936E5269ADFABE7D4829B2EFB3BF5D9) = 109FF9963445E0B0E397B39DE02F7DBC (the result will be key Component3)