该类Rfc2898DeriveBytes
可以为您生成随机盐 - 只需将所需的盐大小传递给适当的构造函数。并且不要忘记将生成的盐存储在安全的地方 - 它无法确定性地重新生成,没有它,您将无法重新创建密钥和 IV 进行解密。
string password = GetPasswordFromUserInputOrWherever();
using (var deriveBytes = new Rfc2898DeriveBytes(password, 16)) // 16 byte salt
{
byte[] salt = deriveBytes.Salt;
// now save the salt somewhere safe
// you'll need it to generate the same byte sequence when decrypting
using (var rijndael = new RijndaelManaged())
{
rijndael.Key = deriveBytes.GetBytes(rijndael.KeySize / 8);
rijndael.IV = deriveBytes.GetBytes(rijndael.BlockSize / 8);
// encrypt...
}
}
然后解密:
string password = GetPasswordFromUserInputOrWherever();
byte[] salt = GetSaltFromWhereverYouPreviouslySavedIt();
using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
using (var rijndael = new RijndaelManaged())
{
rijndael.Key = deriveBytes.GetBytes(rijndael.KeySize / 8);
rijndael.IV = deriveBytes.GetBytes(rijndael.BlockSize / 8);
// decrypt...
}