2014-11-22 4 views
0

Я пытаюсь выполнить следующий тест, чтобы возвращать результаты, которые должны возвращать определенный шифр. Они предоставляют строку Key, IV и Plaintext, как показано ниже.AES C# Шифрование шифрования FIPS

Но я получаю «Указанный вектор инициализации (IV) не соответствует размеру блока для этого алгоритма».

Я застрял на этом некоторое время и не могу найти хороший простой пример и попробовал комбинацию вещей.

Ниже мой код на C#. Я старался, чтобы это было очень просто.

string AesPlainText = "1654001d3e1e9bbd036a2f26d9a77b7f"; 
     string AesKey = "3ccb6039c354c9de72adc9ffe9f719c2c8257446c1eb4b86f2a5b981713cf998"; 
     string AesIV = "ce7d4f9679dfc3930bc79aab81e11723"; 

     AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); 
     aes.KeySize = 256; 
     aes.IV = HexToByteArray(AesIV); 
     aes.Key = HexToByteArray(AesKey); 
     aes.Mode = CipherMode.CBC; 

     // Convert string to byte array 
     byte[] src = Encoding.Unicode.GetBytes(AesPlainText); 

     // encryption 
     using (ICryptoTransform encrypt = aes.CreateEncryptor()) 
     { 
      byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length); 

      // Convert byte array to Base64 strings 
      Console.WriteLine(Convert.ToBase64String(dest)); 
     } 

ОБНОВЛЕНО НА ОТВЕТ:

Спасибо, большое наблюдение. Я изменил Encoding.UTF8.GetBytes, чтобы использовать HexToByteArray в приведенном выше примере, и теперь он работает.

public static byte[] HexToByteArray(String hex) 
{ 
    int NumberChars = hex.Length; 
    byte[] bytes = new byte[NumberChars/2]; 
    for (int i = 0; i < NumberChars; i += 2) 
     bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
    return bytes; 
} 
+0

Спасибо ниже, это функция, которую я добавил, которая, похоже, разрешает мою проблему и позволяет запускать шифрование. –

ответ

3

Ваш открытый текст, ключ и IV, кажется, должны быть указаны в шестнадцатеричном, так что вам нужно декодировать шестнадцатеричном, чтобы добраться до основных байтов вместо выполнения кодирования UTF8.

Вы можете получить массив байтов из шестнадцатеричного here. Обратите внимание, что имя метода должно иметь что-то с hex-in in, не называть его StringToByteArray или atoi или что-то глупое.

Смежные вопросы