首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的DES密码技术

C#中的DES密码技术
EN

Stack Overflow用户
提问于 2011-10-02 14:25:01
回答 2查看 3.9K关注 0票数 1

我一直试图找出使用DES算法加密byte16变量的正确方法。下面是一个场景:

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

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

代码语言:javascript
复制
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加密技术加密数据的正确方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-02 16:58:25

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

代码语言:javascript
复制
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的警告。您可能还想看看http://msdn.microsoft.com/library/system.security.cryptography.cryptostream.aspx之后的一个更容易的en和解密.

票数 4
EN

Stack Overflow用户

发布于 2011-10-02 19:59:08

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

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

CBC-MAC对您的应用是正确的吗?我不知道答案,你要问的关键问题是:

  • 你想做什么?您是否试图“加密”一条消息(以便对方可以恢复它)?或者,你是想证明信息是有人用钥匙发送的吗?
  • 你是想和别人相处吗?是其他人指定了这个“加密”方法吗?
  • ortag决定省略对DES的警告,但我想我会把它们包括进去-- DES可以用不完全不合理的工作量来破解;可能对你的妹妹,甚至是joe普通的黑客来说是安全的,但是如果你的对手能够访问一些计算机资源,他就可以破解这个问题。如果这是一个问题,你会想要切换到一个更强的密码,如AES
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7627266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档