我在使用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"是什么被解密,并给我正确的输出。这里采用了什么样的方法,这比其他我见过的例子有什么优势呢?
加密和安全性不是我强大的诉讼......如果我遗漏了任何重要的内容,请告知我们可能会对此有所了解。提前谢谢!
答案 0 :(得分:1)
RFC2898DeriveBytes
是一个命名不佳的PBKDF2实现,它在RFC 2898中定义。(为什么它名称不好的部分原因是RFC 2898也描述了PBKDF1算法,这是{{1}使用)
您可以在链接的RFC部分中阅读完整算法,但它的作用是使用密码作为HMAC密钥,然后获取盐的HMAC和一些状态数据,然后取HMAC的那个,最重要的是PasswordDeriveBytes
HMAC。
目的是获取输入密码(低熵)并可预测地将其转换为加密密钥(具有高熵),使得难以弄清楚原始密码是什么。
只要所有输入都相同,它就会产生相同的答案。但改变任何输入只是一个完全不同的答案。
如果您看到的其他方法只是使用Encoding.UTF8.GetBytes()(或类似的)将密码转换为密钥,那么是:这是一种更好的方法(它更难破解,而且它没有'关心你的密码是多长时间。)