Одним из вариантов будет использование Rfc2898DeriveBytes
, или PBKDF2 , для создания IV и ключа из пароля.
При одинаковых входных данных - пароле, соли и числе итераций - PBKDF2 будет каждый раз генерировать одну и ту же последовательность байтов, которую затем можно использовать для своего IV и ключа.
В идеале вы должны использовать разные соли для каждого зашифрованного документа, а затем хранить соль где-то рядом с документом, но, похоже, ваши ограничения означают, что вы не можете этого сделать, и в этом случае вам нужно будет использовать константу поваренная соль. Не идеально, но в большинстве ситуаций не должно вызывать проблем.
public void DoSomething(string password)
{
byte[] iv, key;
// default iteration count is 1000 if you don't specify in the constructor
using (var deriveBytes = new Rfc2898DeriveBytes(password, _salt))
{
iv = deriveBytes.GetBytes(16); // get 16 bytes for the iv
key = deriveBytes.GetBytes(16); // get another 16 bytes for the key
}
// now use iv and key to setup RijndaelManaged to encrypt or decrypt
}
// shared, constant salt - make this as long and unguessable as you like
private static readonly byte[] _salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };