Получение ключа для AES шифрования из строки - C#
Формулировка задачи:
Здравствуйте, есть строка в формате string, имеющая 32 символа (хеш md5). Нужно эту строку преобразовать в byte[] 128bit, для использования в шифровании Aes.
string str = "Строка которую нужно шифровать";
string key = "5f4dcc3b5aa765d61d8327deb882cf99";
byte[] pass = System.Text.UTF8Encoding.UTF8.GetBytes(key); //Как правильно преобразовать строку для использования в Aes
byte[] result = EncryptStringToBytesAes(str, pass, pass);
public static byte[] EncryptStringToBytesAes(string plainText, byte[] Key, byte[] IV)
{
// Проверка аргументов
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("IV");
byte[] encrypted;
// Создаем объект класса AES
// с определенным ключом and IV.
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
// Создаем объект, который определяет основные операции преобразований.
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
// Создаем поток для шифрования.
using (var msEncrypt = new MemoryStream())
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (var swEncrypt = new StreamWriter(csEncrypt))
{
//Записываем в поток все данные.
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
//Возвращаем зашифрованные байты из потока памяти.
return encrypted;
}Необработанное исключение типа "System.Security.Cryptography.CryptographicException" в mscorlib.dll Дополнительные сведения: Заданный вектор инициализации (IV) не соответствует размеру блоков для этого алгоритма.
Сейчас в голову приходит только разбивать string key на 2, чтобы получалось 16 символов и уже дальше преобразовывать в byte[] 128bit.Решение задачи: «Получение ключа для AES шифрования из строки»
textual
Листинг программы
string s = "8124D3";
byte[] bytes = new byte[s.Length/2];
for (int i=0; i<s.Length; i+=2)
{
bytes[i/2] = Convert.ToByte(s.Substring(i,2), 16);
}