6

我有一个项目,它为 24 字节数据块规定了以下加密规则。

1) 加密应该使用 9797-1 中定义的完整三重 DES MAC 算法作为 MAC 算法 3 进行,输出转换 3 没有截断,并且 CBC 模式下的 DES 作为 ICV 设置为零的分组密码。最后 8 个字节的加密数据构成了我们需要的值。

该程序说所做的加密是错误的。我还需要做其他事情来匹配上述规范吗?

数据是一个 24 字节的值,加密的输出应该是 8 个字节,我猜(根据规范)。我得到整个 24 个字节作为输出:(

我编写了以下代码来实现上述规范:

des.KeySize = 128;
des.Key = ParseHex(key);
des.Mode = CipherMode.CBC;
des.Padding = PaddingMode.None;

ICryptoTransform ic = des.CreateEncryptor();

CryptoOutput = ic.TransformFinalBlock(CryptoOutput, 0, 24);

我也试过这个:

MACTripleDES des = new MACTripleDES(ParseHex(key));
byte[] CDCryptp = des.ComputeHash(CryptoOutput);
4

3 回答 3

4

ISO 9797-1 MAC 算法 3 包括使用第一个 DES 密钥执行 CBC MAC,然后仅对最后一个块执行完整的 3-DES 操作。

尝试这个:

byte[] keybytes = ParseHex(key);
byte[] key1 = new byte[8];
Array.Copy(keybytes, 0, key1, 0, 8);
byte[] key2 = new byte[8];
Array.Copy(keybytes, 8, key2, 0, 8);

DES des1 = DES.Create();
des1.Key = key1;
des1.Mode = CipherMode.CBC;
des1.Padding = PaddingMode.None;
des1.IV = new byte[8];

DES des2 = DES.Create();
des2.Key = key2;
des2.Mode = CipherMode.CBC;
des2.Padding = PaddingMode.None;
des2.IV = new byte[8];

// MAC Algorithm 3
byte[] intermediate = des1.CreateEncryptor().TransformFinalBlock(data, 0, data.Length);

// Output Transformation 3
byte[] intermediate2 = des2.CreateDecryptor().TransformFinalBlock(intermediate, intermediate.Length - 8, 8);
byte[] result = des1.CreateEncryptor().TransformFinalBlock(intermediate2, 0, 8);
于 2011-06-09T11:08:49.960 回答
2

对于 CBC-MAC 模式,您应该在 CBC 模式下使用零初始化向量 (IV) 加密整个消息,并且只获取输出的最后 8 个字节(对于 DES)。另外,由于您需要使用 DES,它应该有 64 位密钥,而不是 128。如果您可以引用 ISO(找不到免费副本),我可以更详细地描述您应该做什么。

于 2011-06-08T19:11:50.753 回答
-2

这个问题的措辞可能不如应有的好,而且看起来很像家庭作业。因此,我将向您指出一些您可能还没有看到的链接,以便您学习。

其他人正在TripleDES 处执行 3DES MAC 值:指定的密钥是“TripleDES”的已知弱密钥并且不能使用, 尽管我不建议像那里的一些答案那样改变 .NET 的行为。

如果您只需要使用 3DES,请查看:http ://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b9239824-e8a1-4955-9193-d9f6993703f3/

于 2011-06-07T20:14:10.290 回答