如何在 C# 中使用三重 DES 进行 ISO 9797-1 MAC
本文关键字:DES 三重 进行 ISO MAC 9797-1 | 更新日期: 2023-09-27 17:57:11
我有一个项目,它为24字节的数据块规定了以下加密规则。
1) 密码学应使用完整的三重 DES MAC 算法完成,如 9797-1 中定义为 MAC 算法 3,输出变换 3 不截断,DES 处于 CBC 模式作为块 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);
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);
对于 CBC-MAC 模式,您应该在 CBC 模式下使用零初始化向量 (IV) 加密整个消息,并且仅获取输出的最后 8 个字节(对于 DES)。此外,由于您需要使用 DES,因此它应该具有 64 位密钥,而不是 128 位密钥。如果你能引用ISO(找不到免费副本),我可以更详细地描述你应该做什么。
这个问题可能没有应有的措辞那么好,看起来很像家庭作业。因此,我将为您指出一些您可能还没有看到的链接,以便您可以学习。
其他人正在 TripleDES 上执行 3DES MAC 值:指定键是"TripleDES"的已知弱键,无法使用,尽管我不建议像那里的一些答案那样更改 .NET 的行为。
如果您只需要使用3DES,请查看以下内容:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b9239824-e8a1-4955-9193-d9f6993703f3/