Benutzer mit den meisten Antworten
Problem mit Entschlüsselung

Frage
-
Hallo, und wieder habe ich ein Problem mit der Entschlüsselung, auch wenn ich mir die Ursache leider nicht erklären kann.
Beim Entschlüsseln kommt eine Ausnahme:
"Zeichenabstände sind ungültig und können nicht entfernt werden." Typ ist eine CryptographicExeption.
Leider habe ich keine Ahnung, was mir diese Fehlermeldung sagen will, oder wie ich sie beheben kann.
public void DecryptValidated(Stream inputStream, Stream outputStream, byte[] key, byte[] IV) { //Create rijndael instance RijndaelManaged rijndael = new RijndaelManaged(); rijndael.KeySize = keySize; rijndael.BlockSize = blockSize; rijndael.IV = IV; rijndael.Key = key; rijndael.Mode = CipherMode.CBC; rijndael.Padding = PaddingMode.ISO10126; //Delete key and IV key = null; IV = null; /////////////////// byte[] buffer = new byte[bufferSize]; int bytesRead = 0; byte[] storedMAC = new byte[this.ClearTextMACLength]; using (CryptoStream crypto = new CryptoStream(inputStream, rijndael.CreateDecryptor(), CryptoStreamMode.Read)) { bytesRead = crypto.Read(buffer, 0, bufferSize); //Hier tritt der Fehler auf byte[][] temp = SplitArray(buffer, this.ClearTextMACLength); storedMAC = temp[0]; outputStream.Write(temp[1], 0, (bytesRead - this.ClearTextMACLength)); while (bytesRead != 0) { bytesRead = crypto.Read(buffer, 0, bufferSize); if (bytesRead != 0) outputStream.Write(buffer, 0, bytesRead); } } byte[] actualMAC = SHA2.SHA256ByteFile(outputStream); //Clear all values rijndael.Clear(); rijndael.Dispose(); rijndael = null; buffer = null; if (!MACisEqual(actualMAC, storedMAC)) { throw new CryptographicException("Decryption failed. MAC is not valid. A reason may be the wrong key/IV or a tampering of the file"); } storedMAC = null; actualMAC = null; }
Diese Verschlüsselung testet glechzeit anhand eines MACs die Korrektheit der Entschlüsselung (ich habe mich hier aus verschiedenen Gründen gegen eine Trennung der Verschlüsselung und des MACs entschieden, da dies nicht so funktioniert hat wie ich wollte). Der Code hat schon einmal funktioniert, allerdings wüsste ich nicht, was ich verändert habe.Ich hoffe es kann mir jemand weiterhelfen.
- Bearbeitet Simon Rühle Sonntag, 17. März 2013 17:59
Antworten
-
Hallo zusammen,
auf CodePlex gibt es eine Bibliothek namens Security.Cryptography.Debug.dll, die bei der Diagnose genau dieses Problems Hilfe leistet. Das CLR Security Team hat dankenswerterweise auch gleich Code-Beispiele für die Verwendung der Library gepostet.
Simon, Du wirst dich irgendwo beim Zusammenstellen des Gesamtarrays bestehend aus dem MAC/Hash und den verschlüsselten Daten oder eben beim Splitten der MAC-Daten vertan haben, so dass entweder der Schlüssel oder der Initialisierungsvektor falsche Daten enthalten. Übrigens: Einer Verschlüsselungsroutine einen Stream als Parameter zu übergeben, schreit geradezu nach Problemen. Normalerweise übergibt man einfache Byte-Arrays.
Gruß
Marcel- Als Antwort markiert Stefan Kleinewillinghoefer Freitag, 29. März 2013 08:49
Alle Antworten
-
hmm, auf Deutsch habe ich diese Meldung noch nie gesehen, aber ich denke Zeichenabstände ist die absolut gelungene Übersetzung für Padding ;) Also überprüfe ob du, abhängig von deinen ISO-Padding, eine bestimmte Länge des Cipher-Blocks benötigst und ob diese korrekt sind.
-
Hallo zusammen,
auf CodePlex gibt es eine Bibliothek namens Security.Cryptography.Debug.dll, die bei der Diagnose genau dieses Problems Hilfe leistet. Das CLR Security Team hat dankenswerterweise auch gleich Code-Beispiele für die Verwendung der Library gepostet.
Simon, Du wirst dich irgendwo beim Zusammenstellen des Gesamtarrays bestehend aus dem MAC/Hash und den verschlüsselten Daten oder eben beim Splitten der MAC-Daten vertan haben, so dass entweder der Schlüssel oder der Initialisierungsvektor falsche Daten enthalten. Übrigens: Einer Verschlüsselungsroutine einen Stream als Parameter zu übergeben, schreit geradezu nach Problemen. Normalerweise übergibt man einfache Byte-Arrays.
Gruß
Marcel- Als Antwort markiert Stefan Kleinewillinghoefer Freitag, 29. März 2013 08:49
-
Hallo Simon Rühle,
hat Dir die Antwort von Marcel geholfen? Wenn ja, markiere sie bitte als Antwort.
Grüße,
Stefan Kleinewillinghoefer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwicklern“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden koennen.
-
Hallo,
Wir gehen davon aus, dass die Antwort Dir weitergeholfen hat.
Wenn ja, wäre es hilfreich wenn Du diese Lösung bestätigen würdest, sodass andere Leute von derselben Situation profitieren können.
Wenn nein, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
Grüße,
Stefan Kleinewillinghoefer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwicklern“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden koennen.
-
Mich hat die Fehlermeldung auch etwas verwirrt, aber der Hinweis von Stefan Hoffmann dass es evtl. die englische Übersetzung sein könnte, war für mich die Lösung.
Ich habe beim Entschlüsseln einfach das Padding vergessen. Jetzt funktioniert es einwandfrei!
Vielen vielen Dank!