如何在 C# 中使用三重 DES 执行 ISO 9797-1 MAC?

Posted

技术标签:

【中文标题】如何在 C# 中使用三重 DES 执行 ISO 9797-1 MAC?【英文标题】:How can I do an ISO 9797-1 MAC with triple DES in C#? 【发布时间】:2011-05-19 08:21:53 【问题描述】:

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

1) 加密应该使用 9797-1 中定义为 MAC 的完整三重 DES 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);

【问题讨论】:

所以你是在做 MAC,而不是加密?所以你想生成 8 字节标签,如果我理解正确?你能链接到有问题的标准吗(我看不到 PDF,你必须购买它) 嗨 Henno。这是我第一次接触加密。我以为我正在使用 MACTripleDES 进行加密。你能解释一下两者之间的区别吗? MAC 对消息进行身份验证。因此,您发送消息(明文或加密)并添加取决于消息的 MAC(称为标签)和与另一方共享的密钥。 MAC 确保没有人可以修改消息,因为修改器无法计算正确的标签(他需要密钥)。所以它确保了消息没有被篡改,同时也向对方表明发送者也知道生成标签的密钥,所以是“好”的。所以这是身份验证+完整性,而不是机密性。 "最后 8 个字节的加密数据构成了我们需要的值。" -- 输出是否应该只是密文的最后 8 个字节? 【参考方案1】:

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);

【讨论】:

谁能把它翻译成objective c? 谁能把这个翻译成swift?【参考方案2】:

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

【讨论】:

请描述一下! 请引用那个ISO,没有文件我无法描述细节。【参考方案3】:

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

其他人正在TripleDES: Specified key is a known weak key for 'TripleDES' and cannot be used 处执行 3DES MAC 值,尽管我不建议像那里的某些答案那样更改 .NET 的行为。

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

【讨论】:

以上是关于如何在 C# 中使用三重 DES 执行 ISO 9797-1 MAC?的主要内容,如果未能解决你的问题,请参考以下文章

用三重DES加密完整对象

数据的 DES、三重 DES、AES、河豚加密的比较

具有 2 个不同密钥的 Java 三重 DES 加密

三重Des对称加密在AndroidIos 和Java 平台的实现

对称加密算法在C#中的踩坑日常

python 三重DES加密。