首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AES加密混乱?

AES加密混乱?
EN

Stack Overflow用户
提问于 2018-09-10 00:44:33
回答 1查看 0关注 0票数 0

我无法理解我在互联网上找到的以下加密代码。任何人都可以帮助我理解每个代码行中发生的事情,以便清楚地了解这段代码的实际工作方式吗?

代码语言:javascript
复制
 private static void Encrypt(string inputPath, string outputPath) {
        string EncryptionKey = "Key";
        using (Aes encryptor = Aes.Create()) {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (FileStream fsOutput = new FileStream(outputfilePath, FileMode.Create)) {
                using (CryptoStream cs = new CryptoStream(fsOutput, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) {
                    using (FileStream fsInput = new FileStream(inputPath, FileMode.Open)) {
                        int data;
                        while ((data = fsInput.ReadByte()) != -1) {
                            cs.WriteByte((byte)data);
                        }
                    }
                }
            }
        }
    }

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-09-10 10:44:23

Rfc2898DeriveBytes用于将密码转换为加密密钥,然后加密密钥可用于使用您最喜欢的对称加密算法加密数据(请使用AES,而不是不安全的DES)。

你发现这个代码做错了,并且有很多问题。但在我列举问题之前,要明白什么是正确的做事方式。密码是人类使用的密钥,密钥是密码学所需要的。密码是低熵,密钥应该是高熵以防止暴力。我们无法将低熵事物转化为高熵事物,但我们能做的是减慢对低熵事物的强力搜索。这就是Rfc2898DeriveBytes的全部目的:要慢,所以密码不能强行强制。

安全使用此功能还有另一个要求:如果两次使用相同的密码,则不应该两次获得相同的加密密钥。为了满足这一要求,使用盐。硬编码盐会破坏目的:它意味着相同的密码将始终产生相同的加密密钥。

所以这段代码的问题包括:

  • 您永远不应该对密钥或密码进行硬编码(EncryptionKey)。实际上,EncryptionKey即使将密码命名为加密密钥,也是密码。
  • 不要硬编码盐(0x49, 0x76, ...)。顺便说一句,盐是某人名字的ascii值:“Ivan Medvedev”。好,这个可怕的代码的作者将他的名字永久地烧成了它!
  • 使用硬编码的值确实打败了整个函数的重点 - 你已经使它变慢了,但你总是得到相同的加密密钥。如果你要以错误的方式做事,没有理由让它既错又慢。
  • 由于该函数的实现方式,每次加密时它总是得到相同的IV。你永远不应该重复使用IV!

请参阅Top 10 Developer Crypto Mistakes中的第 1,2,4和6点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002588

复制
相关文章

相似问题

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