使用Rfc2898DeriveBytes进行AES 256位加密

时间:2017-04-25 14:23:41

标签: c# encryption cryptography aes rfc2898

我在使用AES和Rfc2898DeriveBytes时遇到了令人困惑的问题。这是我发现的代码......

public static string Decrypt(string encryptionKey, string cipherValue)
    {
        byte[] cipherBytes = Convert.FromBase64String(cipherValue);
        using (var encryptor = Aes.Create())
        {
            var pdb = new Rfc2898DeriveBytes(encryptionKey, new byte[] { (13 element byte array) });
            if (encryptor != null)
            {
                encryptor.Key = pdb.GetBytes(32);
                encryptor.IV = pdb.GetBytes(16);
                using (var ms = new MemoryStream())
                {
                    using (var cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(cipherBytes, 0, cipherBytes.Length);
                        cs.Close();
                    }
                    cipherValue = Encoding.Unicode.GetString(ms.ToArray());
                }
            }
        }
        return cipherValue;
    }

所以," cipherValue"是一个加密的字符串...以及" encryptionKey"。如何使用AES和Rfc2898Derive字节的其他示例似乎不适合此代码。我见过的其他例子中有一些非常纯文本代替了#34; encryptionKey"上面的参数,但这些例子通常是证明加密而不是解密。

此代码用于解密我的应用程序的配置文件中的密码。加密已经完成,我没有资源可以告诉我它是如何完成的。我假设密码是使用指示的" encryptionKey"加密的。和salt值,以及默认的1000次迭代和最大值Key和IV。

我很好奇关于" encryptionKey"参数数字变成了事物。 " cipherValue"是什么被解密,并给我正确的输出。这里采用了什么样的方法,这比其他我见过的例子有什么优势呢?

加密和安全性不是我强大的诉讼......如果我遗漏了任何重要的内容,请告知我们可能会对此有所了解。提前谢谢!

1 个答案:

答案 0 :(得分:1)

RFC2898DeriveBytes是一个命名不佳的PBKDF2实现,它在RFC 2898中定义。(为什么它名称不好的部分原因是RFC 2898也描述了PBKDF1算法,这是{{1}使用)

您可以在链接的RFC部分中阅读完整算法,但它的作用是使用密码作为HMAC密钥,然后获取盐的HMAC和一些状态数据,然后取HMAC的那个,最重要的是PasswordDeriveBytes HMAC。

目的是获取输入密码(低熵)并可预测地将其转换为加密密钥(具有高熵),使得难以弄清楚原始密码是什么。

只要所有输入都相同,它就会产生相同的答案。但改变任何输入只是一个完全不同的答案。

如果您看到的其他方法只是使用Encoding.UTF8.GetBytes()(或类似的)将密码转换为密钥,那么是:这是一种更好的方法(它更难破解,而且它没有'关心你的密码是多长时间。)