Вектор инициализации Rijndael с 16 байтами
Я должен номер кредитной карты, чтобы быть зашифрованным и храниться в базе данных в виде строки. Я делаю следующее
RijndaelManaged rijMan = new RijndaelManaged();
byte[] encrypt = Encrypt(txtCredit.Text, rijMan.Key, rijMan.IV);
string card = Convert.ToBase64String(encrypt);
string key = Convert.ToBase64String(rijMan.Key);
string iv = Convert.ToBase64String(rijMan.IV);
и это функция шифрования:
public static byte[] Encrypt(string message, byte[] key, byte[] iv)
{
byte[] encrypted;
using (RijndaelManaged rijMan = new RijndaelManaged())
{
rijMan.Key = key;
rijMan.IV = iv;
ICryptoTransform encrypt = rijMan.CreateEncryptor(rijMan.Key, rijMan.IV);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
{
using (StreamWriter sw = new StreamWriter(cs))
{
sw.Write(message);
}
encrypted = ms.ToArray();
}
}
}
return encrypted;
}
И я храню их все в базе данных. Это, кажется, хорошо. Но когда я получаю обратно строку из базы данных и использую System.Text.Encoding.UTF8.GetBytes(string)
преобразовать в byte
это исключение
Указанный вектор инициализации (IV) не соответствует размеру блока для этого алгоритма.
Можно ли сгенерировать IV таким образом, чтобы он составлял 16 байтов? Заранее спасибо за ответ
1 ответ
В верхней части поста вы используете алгоритм BASE64 для преобразования байтов IV в строку
string ivString = Convert.ToBase64String(rijMan.IV);
а затем в нижней части вашего поста вы используете кодировку UTF8 для чтения строки в байтовый массив
byte[] iv = System.Text.Encoding.UTF8.GetBytes(ivString);
но вы должны снова использовать алгоритм BASE64:
byte[] iv = Convert.FromBase64String(ivString);
Кстати: я надеюсь, что вы не храните ключ AES (rijMan.Key) в той же базе данных, что и зашифрованный номер вашей кредитной карты, потому что это сделает полное шифрование совершенно бесполезным.