Как сделать пароль под AES 256?

492
12 августа 2017, 00:40

Здравствуйте, скажите пожалуйста как сделать 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;
        }
Answer 1

Если делать правильно, существуют Password Based Encryption, в которых предусмотрены наборы алгоритмов (блочные шифры, режим шифрования, хеш функция, количество итераций), которые на основе только пароля шифруют данные. Используется это, например в PKCS #12. Но, насколько я знаю, в C# нет классов для работы с этим.

Если делать проще, можно взять любую хеш-функцию, которая выдает 256-битный хеш (например SHA256) или хеш функцию, с хешом длиннее 256 бит, и обрезать конечный хеш. Для повышения безопасности (если пользователь вдруг решит использовать сильно простой пароль), можно взять хеш некоторое количество итераций (например несколько тысяч раз):

key = sha256(sha256(....sha256(pwd)...))
READ ALSO
Как правильно реализовать метод RemoveFromRoleAsync (IUserRoleStore )?

Как правильно реализовать метод RemoveFromRoleAsync (IUserRoleStore )?

Добрый денья пытаюсь реализовать самостоятельно (в учебных целях), свой UserStore и Manager в Identity

255
Как присвоить null календарю в asp.net c#

Как присвоить null календарю в asp.net c#

Есть проблема с присвоением календарю значения nullПишет что null присвоить ему нельзя, пытаюсь конвертировать календарь или как нибудь привести...

234
Передача параметров в FastReport из c#

Передача параметров в FastReport из c#

Пытаюсь передать цифры в стринговом формате в фаст репорт в sql запросНо выдаёт ошибку:

328
Как реализовать отправку данных без jQuery?

Как реализовать отправку данных без jQuery?

Как реализовать отправку данных, например при регистрации, без библиотеки jQuery, на чистом JavaScript?

281