2016-12-22 2 views
0

У меня есть пример шифрования с 3 партии мне нужно интегрировать с ...C# AES 128 CBC с -nosalt производить различные результаты, чем OpenSSL AES -128-CBC -nosalt

Я должен отправить их зашифрованными и они расшифровывают его на своем конце и выполняют необходимые операции.

Они предоставили мне пример того, как они ожидают, строка должна быть зашифрована ..

эхо -n [ «Строка для шифрования»] | OpenSSL ENC -AES-128-CBC -A -a -nosalt -К [EncryptionKey в Hex] -IV 30303030303030303030303030303030

песочница EncryptionKey Hex, что я даюсь с является 313233343536373839

В настоящее время я не могу для использования выше указанного ключа и IV, как ... как реализации AES в .Net бросает меня и ошибка, которая говорит: «Указанный ключ не является допустимым размером для этого алгоритма»

затем я просто заполнил ключ с помощью 0s для соответствия 32 байтам и усечения IV в соответствии с 16 байтами.

тогда я могу запустить код по крайней мере, но зашифрованная строка из моих C# код просто не могли получить расшифрованные на OpenSSL ..

Ниже мой код ..

public static string EncryptString(string plainText, string password) 
    { 

     byte[] key, iv; 
     //converting key to hex 
     byte[] ba = Encoding.ASCII.GetBytes("abcdef"); 
     string encryptionKeyHex = BitConverter.ToString(ba); 
     encryptionKeyHex = encryptionKeyHex.Replace("-", ""); 

     // Padding key hex with zeros to match the size that .Net algo expects 
     if (encryptionKeyHex.Length < 32) 
     { 
      while (encryptionKeyHex.Length < 32) 
      { 
       encryptionKeyHex += "0"; 
      } 
     } 

     var keyBytes = Encoding.ASCII.GetBytes(encryptionKeyHex); 
     var ivBytes = Encoding.ASCII.GetBytes("3030303030303030"); // truncated the original IV specified in the question description to match the size. 

     iv = ivBytes; 
     key = keyBytes; 

     var amAes = new AesManaged(); 
     amAes.Mode = CipherMode.CBC; 
     amAes.Padding = PaddingMode.PKCS7; 
     amAes.KeySize = 128; 
     amAes.BlockSize = 128; 
     amAes.Key = key; 
     amAes.IV = iv; 

     var icTransformer = amAes.CreateEncryptor(); 
     var msTemp = new MemoryStream(); 

     var csEncrypt = new CryptoStream(msTemp, icTransformer, CryptoStreamMode.Write); 
     var sw = new StreamWriter(csEncrypt); 
     sw.Write(plainText); 
     sw.Close(); 
     sw.Dispose(); 

     csEncrypt.Clear(); 
     csEncrypt.Dispose(); 

     byte[] bResult = msTemp.ToArray(); 
     //var sha = new SHA1CryptoServiceProvider(); 
     //var result = sha.ComputeHash(bResult); 
     string sResult = Convert.ToBase64String(bResult); 
     sResult = HttpUtility.UrlEncode(sResult); 

     if (System.Diagnostics.Debugger.IsAttached) 
     { 
      string debugDetails = ""; 
      debugDetails += "==> INPUT  : " + plainText + Environment.NewLine; 
      debugDetails += "==> SECRET : " + password + Environment.NewLine; 
      //debugDetails += "==> SALT  : " + Program.ByteArrayToHexString(salt) + Environment.NewLine; 
      debugDetails += "==> KEY  : " + Encoding.ASCII.GetString(amAes.Key) + " (" + amAes.KeySize.ToString() + ")" + Environment.NewLine; 
      debugDetails += "==> IV  : " + Encoding.ASCII.GetString(amAes.IV) + Environment.NewLine; 
      debugDetails += "==> ENCRYPTED : " + sResult; 
      Console.WriteLine(debugDetails); 
     } 

     return sResult; 
    } 

ВЫВОД:

==> INPUT: { "filter.accession_number.equals": "0987654321"}

==> SECRET: ==> KEY: 303132333435363738390000 00000000 (256)

==> IV: 3030303030303030

==> ENCRYPTED: B2uDRjnekFAlRDEKDldTs09lWiE4u16ZunVwDGi6gKm6YsaRlW4HU6eKJqfYZc7b

Update

Было замечено, что мы получаем разные результаты при шифровании на коробке окна чем на Linux Box, используя тот же метод.

На linux box с помощью openssl мы получаем ..

Команда: echo -n '{"filter.accession_number.equals": "0987654321"}' | OpenSSL ENC -AES-128-CBC -A -a -nosalt -К 313233343536373839 -iv 30303030303030303030303030303030

Результат: MTAusb6rYkxYf9/REbFq9M1XwR + 6Q58FfSJPTxDNwgs6z3jZ8ru + 7ysnKuy2p3ox

Это зашифрованная строка работает просто отлично .. я могу чтобы успешно расшифровать его.

Выдавая ту же команду в окне окна, чтобы openssl дает нам ..

Команда: echo -n '{"filter.accession_number.equals": "0987654321"}' | OpenSSL ENC -AES-128-CBC -A -a -nosalt -К 313233343536373839 -iv 30303030303030303030303030303030

Результат: Db9829q6QX6CPwLkE + rs6zqRJJQaGZ9xk7fbztaGqsKcHPcr7equz3yOJPLc + S6yvW4jXQTzoOk43F16GW7sPw ==

Эта строка не работает ...

ответ

1

Вы просто забываете декодировать гексадецималы; Encoding.ASCII.GetBytes получает только ASCII-представление ключа и IV.

Проверьте правильность преобразования here в байты (т. Е. Замените Encoding.ASCII.GetBytes на StringToByteArray).

+0

Мне интересно, что значение 'amAes.KeySize' после установки ключа. Я задаюсь вопросом, сбрасывается ли он на 256 байт после того, как вы установили ключ, даже если вы установите его на 128 перед этим. Не могли бы вы распечатать его и поделиться со мной информацией? –

+0

==> ВХОД: { "filter.accession_number.equals": "0987654321"} ==> секрету: ==> Ключ: 30313233343536373839000000000000 (256) ==> IV: 3030303030303030 ==> ENCRYPTED: B2uDRjnekFAlRDEKDldTs09lWiE4u16ZunVwDGi6gKm6YsaRlW4HU6eKJqfYZc7b –

+0

Обновлено описание с выходом ... далее, извините, я не понимаю, где вы указываете мне, чтобы расшифровать ключ или IV? Я имею в виду, на каком этапе? я предполагаю, что он ожидает шестнадцатеричную кодированную строку, как в инструкции openssl, о которой я упомянул в описании ... –

0

Вот пример рабочего кода для тех, кто попадает в аналогичную проблему ... @Maarten Bodewes Вы написали меня в правильном направлении, просто пришлось перестроить код, чтобы он работал. Спасибо :)

public static string EncryptString(string plainText) 
    { 
     byte[] key, iv; 

     byte[] rawKey = Encoding.ASCII.GetBytes("123456789abcdef"); 
     string encryptionKeyHex = BitConverter.ToString(rawKey); 

     byte[] hexKayBytes = FromHex(encryptionKeyHex); // convert to bytes with 'dashes' 
     byte[] data = FromHex("30-30-30-30-30-30-30-30-30-30-30-30-30-30-30-30"); 

     encryptionKeyHex = ByteArrayToHexString(hexKayBytes); 

// modifying key size to match the algorithm validation on key size 

     if (encryptionKeyHex.Length < 32) 
     { 
      while (encryptionKeyHex.Length < 32) 
      { 
       encryptionKeyHex += "0"; 
      } 
     } 

     var ivOriginal = BitConverter.ToString(data); 
     ivOriginal = ivOriginal.Replace("-", ""); 

     if (ivOriginal.Length < 16) 
     { 
      while (ivOriginal.Length < 16) 
      { 
       ivOriginal += "0"; 
      } 
     }    

     var keyBytes = StringToByteArray(encryptionKeyHex); 
     var ivBytes = StringToByteArray(ivOriginal); 

     iv = ivBytes; 
     key = keyBytes; 

     var amAes = new AesManaged(); 
     amAes.Mode = CipherMode.CBC; 
     amAes.Padding = PaddingMode.PKCS7; 
     amAes.KeySize = 128; 
     amAes.BlockSize = 128; 
     amAes.Key = key; 
     amAes.IV = iv; 

     var icTransformer = amAes.CreateEncryptor(); 
     var msTemp = new MemoryStream(); 

     var csEncrypt = new CryptoStream(msTemp, icTransformer, CryptoStreamMode.Write); 
     var sw = new StreamWriter(csEncrypt); 
     sw.Write(plainText); 
     sw.Close(); 
     sw.Dispose(); 

     csEncrypt.Clear(); 
     csEncrypt.Dispose(); 

     byte[] bResult = msTemp.ToArray(); 
     string sResult = Convert.ToBase64String(bResult); 

     if (System.Diagnostics.Debugger.IsAttached) 
     { 
      string debugDetails = ""; 
      debugDetails += "==> INPUT  : " + plainText + Environment.NewLine; 
      debugDetails += "==> SECRET : " + password + Environment.NewLine; 
      //debugDetails += "==> SALT  : " + Program.ByteArrayToHexString(salt) + Environment.NewLine; 
      debugDetails += "==> KEY  : " + Encoding.ASCII.GetString(amAes.Key) + " (" + amAes.KeySize.ToString() + ")" + Environment.NewLine; 
      debugDetails += "==> IV  : " + Encoding.ASCII.GetString(amAes.IV) + Environment.NewLine; 
      debugDetails += "==> ENCRYPTED : " + sResult; 
      Console.WriteLine(debugDetails); 
     } 

     return sResult; 
    } 

    public static byte[] FromHex(string hex) 
    { 
     hex = hex.Replace("-", ""); 
     byte[] raw = new byte[hex.Length/2]; 
     for (int i = 0; i < raw.Length; i++) 
     { 
      raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16); 
     } 
     return raw; 
    } 

    private static string ByteArrayToHexString(byte[] bytes) 
    { 
     StringBuilder sbHex = new StringBuilder(); 

     foreach (byte b in bytes) 
      sbHex.AppendFormat("{0:x2}", b); 

     return sbHex.ToString(); 
    } 

    public static byte[] StringToByteArray(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; 
    } 
Смежные вопросы