C#中的DES密码术

时间:2011-10-02 14:25:01

标签: .net encryption des

我一直试图找出使用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加密技术加密数据的正确方法吗?

2 个答案:

答案 0 :(得分:3)

您不需要为每个块创建加密器 加密器本身实现了操作模式( 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之后更加容易的解密和解密......

答案 1 :(得分:2)

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

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

CBC-MAC对您的应用程序来说是正确的吗?好吧,我不知道答案;关键问题:

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