Вектор инициализации 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) в той же базе данных, что и зашифрованный номер вашей кредитной карты, потому что это сделает полное шифрование совершенно бесполезным.

Другие вопросы по тегам