Verwenden Sie keine Blockverschlüsselung mit EZB für die symmetrische Verschlüsselung.
(Gilt für AES, 3DES, ...)
Hier ist ein Beitrag und ein sehr ähnlicher Microsoft KB-Artikel darüber, wie der EZB-Modus zu Code führt, der nicht verschlüsselt ist.
Siehe auch diesen ähnlichen Beitrag von Rook
Nur Textnachricht:
Dieselbe Nachricht, die im EZB-Modus verschlüsselt ist (egal welche Verschlüsselung Sie verwenden):
Die GENAUE gleiche Nachricht im CBC-Modus (auch hier spielt es keine Rolle, was Verschlüsselung, die Sie verwenden):
Der falsche Weg
public static string Encrypt (Zeichenfolge toEncrypt, Zeichenfolgenschlüssel, bool useHashing) { byte [] keyArray = UTF8Encoding.UTF8.GetBytes (Schlüssel); byte [] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toEncrypt); if (useHashing) keyArray = new MD5CryptoServiceProvider (). ComputeHash (keyRider; ) {Key = keyArray, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7}; ICryptoTransform cTransform = tdes.CreateEncryptor (); Byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptBray.Tr; (resultArray, 0, resultArray.Length);}
Der Fehler befindet sich in der folgenden Zeile
{Key = keyArray, Mode = CipherMode.ECB , Padding = PaddingMode.PKCS7};
Der richtige Weg
Die guten Leute von Microsoft haben mir den folgenden Code geschickt, um den oben verlinkten KB-Artikel zu korrigieren. Dies wird im Fall # 111021973179005
angegeben
Dieser Beispielcode verwendet AES zum Verschlüsseln von Daten, und der Schlüssel für die AES-Verschlüsselung ist der von SHA256 generierte Hashcode. AES ist der AES-Algorithmus (Advanced Encryption Standard). Der AES-Algorithmus basiert auf Permutationen und Substitutionen. Permutationen sind Umordnungen von Daten, und Substitutionen ersetzen eine Dateneinheit durch eine andere. AES führt Permutationen und Substitutionen mit verschiedenen Techniken durch. Weitere Informationen zu AES finden Sie im Artikel „Schützen Sie Ihre Daten mit dem neuen erweiterten Verschlüsselungsstandard“ im MSDN Magazine unter http://msdn.microsoft.com/en-us/magazine/cc164055.aspx.
SHA ist der sichere Hash-Algorithmus. SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) wird jetzt empfohlen. Weitere Informationen zu Hash-Werten in .NET Framework finden Sie unter http://msdn.microsoft.com/en-us/library/92f9ye3s.aspx#hash_values .
Der Standardwert des Betriebsmodus des symmetrischen Algorithmus für AesCryptoServiceProvider
ist CBC. CBC ist der Cipher Block Chaining-Modus. Es führt Feedback ein. Bevor jeder Klartextblock verschlüsselt wird, wird er durch eine bitweise exklusive ODER-Verknüpfung mit dem Chiffretext des vorherigen Blocks kombiniert. Dies stellt sicher, dass selbst wenn der Klartext viele identische Blöcke enthält, diese jeweils in einen anderen Chiffretextblock verschlüsselt werden. Der Initialisierungsvektor wird mit dem ersten Klartextblock durch eine bitweise ausschließliche ODER-Verknüpfung kombiniert, bevor der Block verschlüsselt wird. Wenn ein einzelnes Bit des Chiffretextblocks entstellt wird, wird auch der entsprechende Klartextblock entstellt. Außerdem wird ein Bit im nachfolgenden Block an derselben Position wie das ursprüngliche verstümmelte Bit entstellt. Weitere Informationen zu CipherMode
finden Sie unter http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx.
Hier ist der Beispielcode.
// Diese Funktion wird zum Verschlüsseln der Daten mit Schlüssel und iv verwendet.
Byte [] verschlüsseln (Byte [] Daten, Byte [] Schlüssel, Byte [] iv) {// Einen AESCryptoProvider erstellen. using (var aesCryptoProvider = new AesCryptoServiceProvider ()) {// Initialisiere den AESCryptoProvider mit Schlüssel und iv. aesCryptoProvider.KeySize = key.Length * 8; aesCryptoProvider.IV = iv; aesCryptoProvider.Key = key; // Verschlüsselung aus dem AESCryptoProvider erstellen. using (ICryptoTransform encryptor = aesCryptoProvider.CreateEncryptor ()) {// Speicherstrom zum Speichern der verschlüsselten Daten erstellen. using (MemoryStream stream = new MemoryStream ()) {// Erstellen Sie einen CryptoStream, um die Daten zu verschlüsseln. using (CryptoStream cryptoStream = neuer CryptoStream (Stream, Verschlüsseler, CryptoStreamMode.Write)) // Daten verschlüsseln. cryptoStream.Write (data, 0, data.Length); // die verschlüsselten Daten zurückgeben. return stream.ToArray (); }}}} // Diese Funktion wird zum Entschlüsseln der Daten mit Schlüssel und iv.byte [] verwendet. Entschlüsseln (Byte [] Daten, Byte [] Schlüssel, Byte [] iv) {// Erstellen Sie einen AESCryptoServiceProvider. using (var aesCryptoProvider = new AesCryptoServiceProvider ()) {// Initialisiere den AESCryptoServiceProvier mit key und iv. aesCryptoProvider.KeySize = key.Length * 8; aesCryptoProvider.IV = iv; aesCryptoProvider.Key = key; // Entschlüsseler aus dem AESCryptoServiceProvider erstellen. using (ICryptoTransform decryptor = aesCryptoProvider.CreateDecryptor ()) {// Erstellt einen Speicherstrom mit den verschlüsselten Daten. using (MemoryStream stream = neuer MemoryStream (Daten)) {// Erstellen Sie einen CryptoStream, um die verschlüsselten Daten zu entschlüsseln. using (CryptoStream cryptoStream = neuer CryptoStream (Stream, Entschlüsseler, CryptoStreamMode.Read)) {// Ein Byte-Puffer-Array erstellen.
Byte [] readData = neues Byte [1024]; int readDataCount = 0; // Erstellen Sie einen Speicherstrom zum Speichern der entschlüsselten Daten. using (MemoryStream resultStream = new MemoryStream ()) {do {// Daten entschlüsseln und in das readData-Pufferarray schreiben. readDataCount = cryptoStream.Read (readData, 0, readData.Length); // Schreibe die entschlüsselten Daten in resultStream. resultStream.Write (readData, 0, readDataCount); } // Überprüfen Sie, ob sich noch mehr verschlüsselte Daten im Stream befinden. while (readDataCount > 0); // Die entschlüsselten Daten zurückgeben. return resultStream.ToArray (); }}}}}} // Diese Funktion wird zum Generieren einer gültigen Schlüsselbinärdatei mit UTF8-Codierung und SHA256-Hash-Algorithmus verwendet. Byte [] GetKey (Zeichenfolgenschlüssel) {// SHA256-Hash-Algorithmusklasse erstellen. using (SHA256Managed sha256 = new SHA256Managed ()) // Dekodiere den String-Schlüssel in binär und berechne die Hash-Binärdatei des Schlüssels. return sha256.ComputeHash (Encoding.UTF8.GetBytes (Schlüssel));}
Weitere Informationen zu den Klassen im Beispielcode finden Sie unter den folgenden Links:
· AesCryptoServiceProvider-Klasse
· SHA256Managed Class
· CryptoStream-Klasse
Darüber hinaus gibt es mehrere Artikel, die zum besseren Verständnis der Kryptografie in .NET Framework beitragen können. Weitere Informationen finden Sie unter den folgenden Links:
· Cryptographic Services
· .NET Framework-Kryptografiemodell
· Eine einfache Anleitung zur Kryptografie
· Verschlüsselung ohne Geheimnisse