C # исключение шифрования - PullRequest
1 голос
/ 17 июня 2010

я команда,

У меня есть следующий код шифрования в C #. Я получаю исключение как Specified initialization vector (IV) does not match the block size for this algorithm.

Не могли бы вы сказать мне, что здесь отсутствует ссылка?

//Key and IV for RSA Encryption
byte[] ketByte = Encoding.UTF8.GetBytes("C3CA193570B26E5C3CBB50FD805A01S2");
byte[] IVByte =  Encoding.UTF8.GetBytes("C3FG563570FG565C3CBB50FD805A01S2");

//Read image
Image sourceImg = Image.FromFile(@"D:\ImageSource\Cha1.bmp");

//Convert to Byte[]
byte[] byteArray = ImageToByteArray(sourceImg);

//Encrypt
byte[] encryptedByteArray = EncryptByte(byteArray, ketByte, IVByte);



public static byte[] EncryptByte(byte[] palinData, byte[] Key, byte[] theInitializationVector)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            System.Security.Cryptography.Rijndael algorithm = System.Security.Cryptography.Rijndael.Create();

            algorithm.Key = Key;
            algorithm.IV = theInitializationVector;  //Exception

            System.Security.Cryptography.CryptoStream cStream = new System.Security.Cryptography.CryptoStream(ms,algorithm.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write);

            cStream.Write(palinData, 0, palinData.Length);
            cStream.Close();

            byte[] encryptedData = ms.ToArray();
            return encryptedData;
        }

Спасибо

Lijo

Ответы [ 3 ]

2 голосов
/ 17 июня 2010

С Свойство SymmetricAlgorithm.IV Документация:

Размер свойства IV должен совпадать со свойством BlockSize .

И свойство BlockSize:

Получает или задает размер блока в битах криптографической операции.

Я не знаю, сколько битов в кодировке UTF-8 "C3CA193570B26E5C3CBB50FD805A01S2", но это почти наверняка не правильно (Вы знаете, сколько байтов занимает кодированный символ UTF-8? Вы также не знаете размер блока шифра Риендала, и вы не должны это знать.

Вы почти наверняка должны использовать PasswordDeriveBytes вместо:

PasswordDeriveBytes pdb = 
      new PasswordDeriveBytes("C3CA193570B26E5C3CBB50FD805A01S2", null);

IVByte = pdb.GetBytes(algorithm.BlockSize / 8); //divide by 8 for bits to bytes

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

1 голос
/ 17 июня 2010

Ваш вектор инициализации не правильный размер, IV обычно составляет 16 байтов.

Попробуйте уменьшить размер вашего вектора пополам:

byte[] IVByte =  Encoding.UTF8.GetBytes("C3FG563570FG565C");
0 голосов
/ 17 июня 2010

Что вы ожидаете

byte[] ketByte = Encoding.UTF8.GetBytes("C3CA193570B26E5C3CBB50FD805A01S2");
byte[] IVByte =  Encoding.UTF8.GetBytes("C3FG563570FG565C3CBB50FD805A01S2");

делаете? Потому что они не загружают эти шестнадцатеричные значения в байтовый массив. Они создают 32-байтовый массив, содержащий значения ASCII каждого символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...