Skip to main content
 首页 » 编程设计

c#之如何使用 DES 实现 CBC-MAC

2024年02月06日27duanxz

我应该用 C# 实现 MAC-CBC 生成方法,并提供一些有关加密算法的信息。这是我所拥有的:

  • 我应该使用 DES。
  • key 是byte[] {11, 11, 11, 11, 11, 11, 11, 11}
  • 数据(16 字节)应按 8 字节部分加密。前 8 个字节使用 Instance Vector = new byte[8] 加密(8 个字节,值为 0)。 (CBC?)
  • 加密值的最后 8 个字节应转换为十六进制字符串。这是我应该发送的结果。

根据这些信息,我实现了以下方法:

public static string Encrypt(byte[] data) 
{ 
    var IV = new byte[8]; 
    var key = new byte[] { 11, 11, 11, 11, 11, 11, 11, 11 }; 
    var result = new byte[16]; 
 
    // Create DES and encrypt. 
    var des = DES.Create(); 
    des.Key = key; 
    des.IV = IV; 
    des.Padding = PaddingMode.None; 
    des.Mode = CipherMode.CBC; 
    ICryptoTransform cryptoTransform = des.CreateEncryptor(key, IV); 
    cryptoTransform.TransformBlock(data, 0, 16, result, 0); 
 
    // Get the last eight bytes of the encrypted data. 
    var lastEightBytes = new byte[8]; 
    Array.Copy(result, 8, lastEightBytes, 0, 8); 
 
    // Convert to hex. 
    var hexResult = string.Empty; 
    foreach (byte ascii in lastEightBytes) 
    { 
        int n = (int)ascii; 
        hexResult += n.ToString("X").PadLeft(2, '0'); 
    } 
 
    return hexResult; 
} 

他们向我提供的样本原始数据是:input=byte[] {0, 6, 4, 1, 6, 4, 1, 7, E, E, F, F, F, F, B, B)它应该返回值的输出: A7CBFB3C730B059C 。这意味着加密数据的最后八个字节应该是: byte[] {167, 203, 251, 60, 115, 11, 05, 156}

但不幸的是使用上述方法,我得到:32D91200D0007632 。这意味着我的加密数据不正确。 (我的方法生成的加密值的最后八个字节是 byte[] {50, 207, 18, 0, 208, 0, 118, 50} )。

有什么方法可以让我知道我应该做什么才能到达 A7CB...?我做错了什么吗?

请您参考如下方法:

CBC-MAC 需要零初始化向量。最好明确指定 IV:

var IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };   

你说你的 key 是byte[] { 11, 11, 11, 11, 11, 11, 11, 11 } 这些字节是十六进制还是基数10?您可能想尝试:

var key = new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }; 

看看是否效果更好。