2017-09-19 2 views
1

Ich habe eine Windows-Anwendung (x64), die auf Winodws 7, 8 und jetzt 10 funktioniert. Heute haben wir das Programm unter einem Windows 2012 Server ausgeführt. Als wir uns das Ereignisprotokoll angesehen haben, haben wir einen Fehler gefunden, der von System.Security.Cryptography.RijndaelManaged..ctor() stammt (leider hat uns das Protokoll nicht den vollständigen Pfad angegeben).Rijndael Kryptografie funktioniert nicht unter Windows Server 2012

Ich habe den Algorithmus Rijndael verwendet, um vertrauliche Daten in meinem Programm zu verschlüsseln. Das erste, was das Programm macht, ist, die verschlüsselte Konfigurationsdatei abzurufen und zu entschlüsseln, um alle Einstellungen zu erhalten. Und hier startet mein Programm nicht.

Dies ist die Entschlüsselungs-Methode in meinem Programm:

public static string Decrypt(string cipherText, string passPhrase) 
{ 
    byte[] cipherTextBytes = Convert.FromBase64String(cipherText); 
    using (PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null)) 
    { 
     byte[] keyBytes = password.GetBytes(keysize/8); 
     using (RijndaelManaged symmetricKey = new RijndaelManaged()) 
     { 
      symmetricKey.Mode = CipherMode.CBC; 
      using (ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)) 
      { 
       using (MemoryStream memoryStream = new MemoryStream(cipherTextBytes)) 
       { 
        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) 
        { 
         byte[] plainTextBytes = new byte[cipherTextBytes.Length]; 
         int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 
         return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); 
        } 
       } 
      } 
     } 
    } 
} 

Und das ist die Fehlermeldung, die ich im Protokoll erhalten:

Anwendung: Postbag.exe Framework Version: v4.0.30319 Beschreibung : Der Prozess wurde aufgrund einer nicht behandelten Ausnahme beendet. Ausnahme: Info: System.InvalidOperationException um System.Security.Cryptography.RijndaelManaged..ctor() um Common.StringCipher.Decrypt (System.String, System.String) um Common.Conf..cctor() Ausnahme: System.TypeInitializationException bei Common.Conf.get_DataProvider() bei Postbag.FormMain..ctor() bei Postbag.Program.Main()

der neue Server hat auch die gleichen Versionen von .NET Framework.

+0

Da Sie die Blockgröße nicht ändern, sollten Sie 'new RijndaelManaged()' durch 'Aes.Create()' ersetzen. Es wird die gleiche Ausgabe erzeugen, aber keine FIPS-Ausnahme. – bartonjs

Antwort

4

Die RijndaelManaged clases sind nicht FIPS-kompatibel und Ihr Server scheint die Sicherheitspolitik Systemkryptografie zu haben: FIPS-konformen Algorithmus für Verschlüsselung, Hashing und Satz unterzeichnen.

In dem Wissen artical "System cryptography: Use FIPS compliant algorithms for encryption, hashing, and signing" security setting effects in Windows XP and in later versions of Windows heißt es:

Microsoft .NET Framework-Anwendungen wie Microsoft ASP.NET nur für die Verwendung von Algorithmus-Implementierungen ermöglichen, die von NIST zertifiziert sind FIPS 140 kompatibel zu sein. Insbesondere sind die einzigen kryptografischen Algorithmusklassen, die instanziiert werden können, diejenigen, die FIPS-kompatible Algorithmen implementieren. Die Namen dieser Klassen enden in "CryptoServiceProvider" oder "Cng." Jeder Versuch, eine Instanz von anderen Verschlüsselungsalgorithmus Klassen wie Klassen mit Namen zu erstellen, die auf „Managed“ verursacht eine InvalidOperationException Ausnahme

Also entweder disable the security policy (aus dem Secpol.msc Werkzeug) auftritt oder eine FIPS verwenden konforme Implementierung. Leider hat Rijndael keine solche Implementierung, daher sollten Sie sehen, ob AesCng oder AesCryptoServiceProvider Ihren Anforderungen entspricht, denn AES ist die formale Implementierung dessen, was als Rijndael begann. Basierend auf the blog Is RijndaelManaged class FIPS compliant? von Prateek Kr Dubey schließe ich, dass Daten, die mit RijdaelManaged verschlüsselt sind, mit AesCng oder AesCryptoServiceProvider entschlüsselt werden können.

Um vollständig zu sein ich eine Encrypt-Methode mit der RijnDaelManaged Klasse erstellt und Ihr Codebeispiel auf dieser Linie angepasst:

using (RijndaelManaged symmetricKey = new RijndaelManaged()) 

using (var symmetricKey = new AesCryptoServiceProvider()) // or new AesCng() 

und war tatsächlich in der Lage zu lesen, um die Zeichenfolge zu entschlüsseln.

+0

Danke für die Information. Aber wie kann ich die Sicherheitsrichtlinie deaktivieren? – Disasterkid

+1

Ich habe es unter * deaktivieren Sie die Sicherheitsrichtlinie *, aber hier ist es auch: https://i.stack.imgur.com/bSsH0.png – rene

+0

Vielen Dank für Ihre Antwort. Lassen Sie mich versuchen, die Richtlinie vom Server zu entfernen und es erneut zu versuchen. Ich glaube nicht, dass Änderungen am Programm derzeit machbar sind, da es sich um eine lokale Lösung handelt und die Anwendung der Änderung viele Aktualisierungen erfordert. Aber sobald der Kunde die Police entfernt, werde ich wiederkommen. – Disasterkid

Verwandte Themen