1

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

  • 数据应以 8 字节部分加密。加密的关键是:byte[] {11, 11, 11, 11, 11, 11, 11, 11}
  • Instance Vector = new byte[8]前 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 加密技术加密数据的正确方法吗?

4

2 回答 2

4

您不需要为每个块创建加密器。加密器本身实现了操作模式(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,以便更轻松地进行加密和解密......

于 2011-10-02T16:58:25.053 回答
2

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

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

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

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