【问题标题】:DES Cryptography in C#C# 中的 DES 密码学
【发布时间】:2011-10-02 14:25:01
【问题描述】:

我一直在尝试找出使用 DES 算法加密 byte[16] 变量的正确方法。场景如下:

  • 数据应以 8 字节部分加密。加密密钥为:byte[] {11, 11, 11, 11, 11, 11, 11, 11}
  • 前 8 个字节使用 Instance Vector = new byte[8] 加密(8 个字节,值为 0)。
  • 加密的结果将是接下来 8 个字节的 IV。 (这是 CBC 吗?)
  • 最后 8 个字节是我应该发送的结果。

有了这些信息,我实现了Encrypt方法如下:

public static byte[] Encrypt(byte[] data)
{
    var dataChunk = new byte[8];
    var IV = new byte[8];
    var result = new byte[8];
    var key = new byte[] { 11, 11, 11, 11, 11, 11, 11, 11 };

    for (int counter = 0; counter < data.Length / 8; counter++)
    {
        // Copy the next 8-byte chunk.
        Array.Copy(data, counter * 8, dataChunk, 0, 8);
        var des = System.Security.Cryptography.DES.Create();
        des.Key = key;
        des.IV = IV;
        des.Padding = PaddingMode.None;
        ICryptoTransform cryptoTransform = des.CreateEncryptor(key, IV);

        // Encrypt the datra chunk.
        cryptoTransform.TransformBlock(dataChunk, 0, 8, result, 0);

        // Set the new IV.
        Array.Copy(result, IV, 8);
    } 
return result;
}

这是使用 DES 加密技术加密数据的正确方法吗?

【问题讨论】:

  • 您可能希望接受 IV 作为此函数的输入。顾名思义,它毕竟是初始向量。此外,由于您要丢弃除最后一个块之外的所有加密数据,因此这并不是真正的加密。它是 MAC(消息验证码)——本质上是一种共享秘密签名机制。

标签: .net encryption des


【解决方案1】:

您不需要为每个块创建一个加密器加密器本身实现了操作模式(CBC,...)和填充。 所以你需要这样的东西:

byte[] input = ...
byte[] key = ...
byte[] iv = ...

using (DES des = DES.Create())
{
    des.Mode = CipherMode.CBC;
    des.Padding = PaddingMode.None;

    using (ICryptoTransform encryptor = des.CreateEncryptor(key , iv))
    {
        byte[] output = encryptor.TransformFinalBlock(input, 0, input.Length);
    }
}

我在这里省略了使用 DES 的警告。之后您可能还想查看CryptoStream,以便更轻松地进行加密和解密...

【讨论】:

    【解决方案2】:

    我无法帮助您使用 C#,但我可以尝试解决您的最后一个问题:这是否是加密的“正确方法”。嗯,这个答案取决于你期望做什么。

    您实现的是一种称为 CBC-MAC 的模式;它不允许接收者恢复消息(因此它根本不是真正的“加密”);一个线索是消息是 16 个字节,但“加密”消息只有 8 个字节。它确实具有中间人很难修改消息并得出正确的 8 字节 MAC 值的特性(假设他们没有密钥);因此,像这样的事情经常被用作加密的强完整性检查。现在,CBC-MAC 确实存在长度扩展攻击的问题;如果你不关心长度扩展攻击(你所有的消息都是 16 字节),这对你来说可能并不重要?

    CBC-MAC 是否适合您的应用程序?好吧,我不知道答案;您的关键问题:

    • 你想做什么?您是否正在尝试“加密”一条消息(以便对方可以恢复它)?或者,您是否试图证明该消息是由拥有密钥的人发送的?
    • 您是否想与其他人兼容?是否有人指定了这种“加密”方法?
    • ortag 决定省略 DES 的警告,但我想我会包括它们 - DES 可以通过不完全不合理的工作量来破坏;它可能对你的小妹妹甚至普通黑客是安全的,但如果你的对手可以访问一些计算机资源,他可以打破这个。如果这是一个问题,您需要切换到更强的密码,例如 AES

    【讨论】:

    • 确实,不清楚问题中的 "encryption" 是什么意思,或者是否存在一些混淆。哦,无论如何,关于安全方面,你是对的,这是一个商业 "codebreaker" 机器的performance graph .. 它甚至是关于AES 解密并且已经快得令人难以置信,不用考虑这对DES 有什么作用...
    • @poncho:是的,那是 CBC-MAC。感谢您的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多