Здравствуйте, скажите пожалуйста как сделать 256 битный пароль под AES, на основе пользовательского пароля, длина которого может быть совсем разная.
То-есть если я сейчас буду шифровать текст, с KeyString = "helloworld", то вылезит ошибка, что пароль не подходит по длине, то-есть 256 битам. Что придумать с паролем?
public static string EncryptString(string message, string KeyString, string IVString)
{
byte[] Key = Encoding.UTF8.GetBytes(KeyString);
byte[] IV = Encoding.UTF8.GetBytes(IVString);
string encrypted = null;
RijndaelManaged rj = new RijndaelManaged();
rj.Key = Key;
rj.IV = IV;
rj.Mode = CipherMode.CBC;
try
{
MemoryStream ms = new MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
{
using (StreamWriter sw = new StreamWriter(cs))
{
sw.Write(message);
sw.Close();
}
cs.Close();
}
byte[] encoded = ms.ToArray();
encrypted = Convert.ToBase64String(encoded);
ms.Close();
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
return null;
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
return null;
}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
finally
{
rj.Clear();
}
return encrypted;
}
Если делать правильно, существуют Password Based Encryption, в которых предусмотрены наборы алгоритмов (блочные шифры, режим шифрования, хеш функция, количество итераций), которые на основе только пароля шифруют данные. Используется это, например в PKCS #12. Но, насколько я знаю, в C# нет классов для работы с этим.
Если делать проще, можно взять любую хеш-функцию, которая выдает 256-битный хеш (например SHA256) или хеш функцию, с хешом длиннее 256 бит, и обрезать конечный хеш. Для повышения безопасности (если пользователь вдруг решит использовать сильно простой пароль), можно взять хеш некоторое количество итераций (например несколько тысяч раз):
key = sha256(sha256(....sha256(pwd)...))
Сборка персонального компьютера от Artline: умный выбор для современных пользователей