2016-12-22 1 views
0

ich eine Verschlüsselung Beispiel aus einer 3rd-Party, muß ich mit integrieren ...C# AES 128 CBC mit -nosalt unterschiedlichen Ergebnissen als openssl AES -128-cbc -nosalt Herstellung

Ich soll sie verschlüsselt senden Nachricht und sie entschlüsselt es an ihrem Ende und führt die erforderlichen Operationen durch.

Sie haben mir das Beispiel zur Verfügung gestellt, die ist, wie sie die Zeichenfolge erwarten verschlüsselt werden ..

echo -n [ ‚String verschlüsseln‘] | openssl enc -AES-128-cbc -A -a -nosalt -K [EncryptionKey in Hex] -IV 30303030303030303030303030303030

Die Sandbox encryptionKey Hex, die ich mit gegeben bin, ist 313233343536373839

Zur Zeit bin ich nicht in der Lage Verwenden Sie oben angegebenen Schlüssel und IV wie ... wie die AES-Implementierungen in .Net wirft mich und Fehler, der sagt 'Der angegebene Schlüssel ist keine gültige Größe für diesen Algorithmus'

dann habe ich nur den Schlüssel mit 0s aufgefüllt um 32 Bytes zu entsprechen und die IV abzuschneiden, um 16 Bytes zu entsprechen.

, dann bin ich in der Lage, den Code atleast aber die verschlüsselte Zeichenfolge von meinem C# Code ausführen konnte einfach nicht auf OpenSSL entschlüsselt erhalten ..

Unten ist mein Code ..

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; 
    } 

OUTPUT:

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

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

==> IV: 3030303030303030

==> Verschlüsselt: B2uDRjnekFAlRDEKDldTs09lWiE4u16ZunVwDGi6gKm6YsaRlW4HU6eKJqfYZc7b

aktualisieren

Es bemerkt wurde, dass wir unterschiedliche Ergebnisse erhalten, wenn auf einem Windows-Verschlüsselung als auf einer Linux-Box, mit der gleichen Methode ..

Auf Linux-Box mit Openssl erhalten wir ..

Der Befehl: echo -n '{"filter.accession_number.equals": "0987654321"}' | openssl enc -AES-128-cbc -A -a -nosalt -K 313233343536373839 -IV 30303030303030303030303030303030

Das Ergebnis: MTAusb6rYkxYf9/REbFq9M1XwR + 6Q58FfSJPTxDNwgs6z3jZ8ru + 7ysnKuy2p3ox

Das verschlüsselte Zeichenfolge funktioniert gut .. ich bin in der Lage um es erfolgreich zu entschlüsseln.

Während der gleiche Befehl auf Windows-Box zu openssl gibt uns ..Der Befehl lautet: echo -n '{"filter.accession_number.equals": "0987654321"} openssl enc -AES-128-cbc -A -a -nosalt -K 313233343536373839 -IV 30303030303030303030303030303030

Das Ergebnis: Db9829q6QX6CPwLkE + rs6zqRJJQaGZ9xk7fbztaGqsKcHPcr7equz3yOJPLc + S6yvW4jXQTzoOk43F16GW7sPw ==

Dieser String funktioniert nicht ...

Antwort

1

Sie vergessen einfach, die Hexadezimalzahlen zu dekodieren; Encoding.ASCII.GetBytes erhält nur die ASCII-Darstellung des Schlüssels und IV.

Überprüfen Sie die Antwort here, um korrekt in Bytes zu konvertieren (d. H., Ersetzen Sie Encoding.ASCII.GetBytes durch StringToByteArray).

+0

Ich frage mich, was der Wert von 'amAes.KeySize' ist nach dem Festlegen des Schlüssels. Ich frage mich, ob es auf 256 Bytes zurückgesetzt wird, nachdem Sie den Schlüssel gesetzt haben, obwohl Sie vorher direkt auf 128 gesetzt haben. Könnten Sie es ausdrucken und diese Informationen mit mir teilen? –

+0

==> INPUT: { "filter.accession_number.equals": "0987654321" } ==> SECRET: ==> SCHLÜSSEL: 30313233343536373839000000000000 (256) ==> IV: 3030303030303030 ==> Encrypted: B2uDRjnekFAlRDEKDldTs09lWiE4u16ZunVwDGi6gKm6YsaRlW4HU6eKJqfYZc7b –

+0

Die Beschreibung wurde mit Ausgabe aktualisiert ... weiter, tut mir leid, ich verstehe nicht, wohin du mich drückst, um den Schlüssel oder IV zu dekodieren? Ich meine, bei welchem ​​Schritt? Ich denke, es erwartet die hexadezimale Zeichenfolge wie in der openssl-Anweisung, die ich in der Beschreibung erwähnt habe ... –

0

Hier ist das funktionierende Codebeispiel für jeden, der in einem ähnlichen Problem steckenbleibt ... @Maarten Bodewes Sie haben mich in die richtige Richtung weisen, musste den Code einfach neu anordnen, damit es funktioniert. Danke :)

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; 
    } 
Verwandte Themen