【问题标题】:How to encrypt decrypt string using MACTripleDES?如何使用 MACTripleDES 加密解密字符串?
【发布时间】:2016-01-07 16:57:07
【问题描述】:

如何在 C# 中使用 MACTripleDES 加密和解密字符串? MACTripleDES 和 TripleDES 有区别吗?

【问题讨论】:

  • 如果MAC 是安全的,那么您就不能“解密”它。如果您“加密”超过一个块大小,那么您可能无法再解密它。你想达到什么目的?
  • @ArtjomB。那么我怎样才能在 MACTripleDES 中取回原始文本。我试过类似 TripleDES

标签: c# encryption cryptography tripledes


【解决方案1】:

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

这意味着在此之前的每个明文数据块都无法检索。也就是说,除非你知道最后一个块的明文,否则你可以将它与最后一个块进行异或,取回之前的密文,并通过解密计算明文。

另一方面,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 或经过身份验证的加密。

【讨论】:

    【解决方案2】:

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

    如果输入小于或等于块大小,那么您可能能够解密身份验证标签以获得相应的输入。能否做到这一点取决于实际的 MAC 算法。例如CBC-MAC 有这个不受欢迎的属性,即短消息被简单地加密,这可能导致消息伪造和机密性泄露。还有更好的替代方案,例如 CMAC (OMAC1),它也基于一些分组密码或基于安全散列函数的 HMAC。 MACTripleDES is an implementation of CBC-MAC,永远不要使用。

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

    【讨论】:

    • 感谢@ArtjomB。当输入等于块大小时,我怎么能像你提到的那样解密。那么 MACTripleDES 的用途是什么。
    • implementation 看起来像 CBC-MAC,因此您应该能够在 ECB 模式下使用 Triple DES 直接对其进行解密。我在上一段中描述了 MAC 的常见用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2011-01-26
    • 2012-01-26
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多