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...
}