如何使用MACTripleDES加密解密字符串?

时间:2016-01-07 16:57:08

标签: c# encryption cryptography tripledes

如何使用C#中的MACTripleDES加密和解密字符串? MACTripleDES和TripleDES之间有什么区别吗?

2 个答案:

答案 0 :(得分:3)

MACTripleDES使用CBC-MAC。在用零填充消息之后,CBC-MAC使用CBC模式。这在撤销的FIPS 113规范(DAA)中规定。只保留最后一个块:

CBC-MAC

这意味着在此之前的每个明文数据块都无法检索。也就是说,除非您知道最后一个块的明文,否则您可以使用最后一个块对其进行异或,检索先前的密文,并通过解密来计算明文。

另一方面,

CBC模式下的TripleDES输出所有密文块,之前使用它作为下一个明文块的向量。

using System;
using System.Security.Cryptography;

namespace StackOverflow
{
    public class MACTripleDESTest
    {
        public static void Main(String[] args)
        {
            // example key
            byte[] key = new byte[24];
            for (int i = 0; i < key.Length; i++)
            {
                key[i] = (byte) i;
            }

            // uses CBC MAC with zero initialization vector and Zero padding
            MACTripleDES macTDES = new MACTripleDES(key);
            byte[] result = macTDES.ComputeHash(new byte[] { 0x01, 0x02, 0x03, 0x04 });

            TripleDES tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = key;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.None;
            ICryptoTransform tf = tdes.CreateDecryptor();
            byte[] pt = tf.TransformFinalBlock(result, 0, tdes.BlockSize / 8);
            Console.WriteLine(BitConverter.ToString(pt));
        }
    }
}

将导致:

01-02-03-04-00-00-00-00

CBC-MAC is rather insecure:

  • 与CBC模式加密一起使用时,相同的密钥完全失败
  • 它无法为动态大小的消息提供完全的安全性
  • 3DES块大小相当小

使用AES-CMAC,HMAC或经过身份验证的加密。

答案 1 :(得分:2)

Message Authentication Code (MAC)类似于哈希,因为您无法解密&#34;它。输入通常是一些任意长的消息,但输出的大小为三重DES块大小,限制为64位。由于输入可能大于输出,因此您应该很容易看到它无法解密&#34;,因为同一输出值有多个可能的输入值。这称为Pigeonhole principle

如果输入小于或等于块大小,则可能能够解密认证标记以获得相应的输入。是否可以这样做取决于实际的MAC算法。例如,CBC-MAC具有此不受欢迎的属性,即短消息被简单加密,这可能导致消息伪造和机密性中断。还有更好的替代方案,例如CMAC(OMAC1),它也基于一些分组密码或基于安全散列函数的HMAC。 MACTripleDES is an implementation of CBC-MAC,绝对不能使用。

通常,MAC用于验证消息。由于消息的接收者知道消息和用于创建MAC(密钥认证)的密钥,因此她可以运行MAC算法来生成认证标记,并将其与消息一起发送的标记进行比较。 。如果两个标签相同,则接收方可以合理地确定在传输过程中没有操纵消息或标签。