我应该在C#中实现MAC-CBC生成方法,其中包含有关加密算法的一些信息。这就是我所拥有的:
byte[] {11, 11, 11, 11, 11, 11, 11, 11}
Instance Vector = new byte[8]
加密(8个字节,值为0)。 (CBC?)有了这些信息,我实施了以下方法:
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 ......?我做错了吗?
答案 0 :(得分: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 };
看看它是否更好。
答案 1 :(得分:2)