我遇到了Rfc2898DeriveBytes與AES混淆的使用。下面是我發現的代碼....使用Rfc2898DeriveBytes進行AES 256位加密
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字節的其他示例似乎不適合此代碼。我見過的其他例子有一些非常純文本代替上面的「encryptionKey」參數,但這些例子通常是演示加密而不是解密。
此代碼正用於解密我的應用程序的配置文件中的密碼。加密已經完成,我沒有資源可以告訴我它是如何完成的。我假設密碼是使用指定的「encryptionKey」和salt值加密的,以及默認的1000次迭代和最大大小的Key和IV。
我很好奇主要是關於「encryptionKey」參數如何計算的東西。 「cipherValue」是什麼被解密,並給我正確的輸出。在這裏工作的方法是什麼,以及我看過的其他例子有什麼優點?
加密和安全性並不是我的強項西裝......讓我知道是否遺漏了任何重要的東西,這可能會爲我們提供更多的信息。提前致謝!
鹽必須隨機選擇(第二個參數爲Rfc2898DeriveBytes)。不要使用靜態鹽,因爲這會使密碼具有確定性,因此不會在語義上安全。觀察密文的攻擊者可以確定何時之前發送了相同的消息前綴。鹽不是祕密的,所以你可以把它和密文一起發送。通常,它只是在密文前面加上,然後在解密之前切掉。 –