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

时间:2011-05-19 08:21:54

标签: c# hash cryptography des 3des

我有一个项目,规定了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);

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

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

答案 2 :(得分:-2)

这个问题可能没有应有的措辞,看起来很像家庭作业。所以我会指出一些你可能还没有看过的链接,这样你就可以学习。

其他人正在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/