2

我应该在 C# 中实现一个 MAC-CBC 生成方法,其中包含一些有关密码算法的信息。这是我所拥有的:

  • 我应该使用 DES。
  • 关键是byte[] {11, 11, 11, 11, 11, 11, 11, 11}
  • 数据(16 字节)应按 8 字节部分加密。Instance Vector = new byte[8]前 8 个字节使用(8 个字节,值为 0)加密。(加拿大广播公司?)
  • 加密值的最后 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)应该返回 value: 的输出A7CBFB3C730B059C。这意味着加密数据的最后八个字节应该是:byte[] {167, 203, 251, 60, 115, 11, 05, 156}.

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

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

4

2 回答 2

4

CBC-MAC 需要一个零初始化向量。更好地明确指定 IV:

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

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

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

看看是否效果更好。

于 2011-10-03T10:21:19.760 回答
2

Mono项目有一个通用的MAC-CBC 实现,它应该适用于任何SymmetricAlgorithm——即使它在内部被用于实现MACTripleDES

您可以在此处找到 MIT.X11 许可的源代码。按原样使用它或将其与您自己的代码进行比较。

于 2011-10-03T13:49:04.703 回答