C# AES-256 Unicode Key
Мне нужно сделать сильный ключ для AES-256 в а) символах Юникода, б) в байтах.
а) Я должен сгенерировать 50 случайных символов Юникода и затем преобразовать их в байты. Можно ли использовать символы Юникода в качестве ключа AES256? Например, я хочу использовать эту страницу для создания пароля. Есть ли способ импортировать все символы из таблицы символов Windows для программирования в приложении Windows Form?
б) я использую этот код:
System.Security.Cryptography.AesCryptoServiceProvider key = new System.Security.Cryptography.AesCryptoServiceProvider();
key.KeySize = 256;
key.GenerateKey();
byte[] AESkey = key.Key;
Этого достаточно или я должен что-то изменить?
Также у меня есть еще один вопрос. Если ключ AES длиннее 43 символов ASCII, будет более безопасным или он все равно будет хеширован до 256 бит? И есть ли разница между ASCII ключом из 43 символов и 100?
1 ответ
а) Я должен сгенерировать 50 случайных символов Юникода и затем преобразовать их в байты. Можно ли использовать символы Юникода в качестве ключа AES256?
Да, это возможно. Поскольку у вас достаточно места для символов, вы можете просто закодировать его. ceil(32 / 3) * 4 = 44, так что у вас будет достаточно символов для этого. Вы не будете использовать дополнительное пространство, предоставляемое кодировкой Unicode, хотя. Очевидно, вам нужно будет преобразовать его обратно в двоичный файл перед его использованием.
б) есть
aes.GenerateKey
"довольно"?
Да, aes.GenerateKey
достаточно для генерации двоичного ключа AES.
c) Если ключ AES длиннее 43 символов ASCII, будет более безопасным или он все равно будет хеширован до 256 бит? И есть ли разница между ASCII ключом из 43 символов и 100?
Ключ AES вообще не хэшируется. Это всего лишь 128, 192 или 256 бит (т.е. 16, 24 или 32 байта) данных, которые должны быть неотличимы от случайных (для кого-то, кто, конечно, не знает значение). Если вы хотите что-то хэшировать, вам придется сделать это самостоятельно, но, пожалуйста, продолжайте читать.
Важно понимать, что пароль не является ключом, и что ключи для современных шифров почти всегда кодируются как двоичные. Для AES не существует такого понятия, как ключ ASCII. Если вам нужно закодировать ключ, используйте базу 64.
Если вы хотите использовать пароль, то вам нужно использовать функцию получения ключа или KDF. Кроме того, если вы хотите защитить от атак по словарю и радужной таблице, вам нужно использовать функцию получения ключа на основе пароля или PBKDF. Такой KDF также называется "хэшем пароля". В случае.NET ваш лучший выбор - Rfc2898DeriveBytes, который реализует PBKDF2. PBKDF2 определен в RFC 2898 под названием: PKCS #5: Спецификация криптографии на основе пароля версии 2.0, которую вы можете прочитать.