none
Problem mit Entschlüsselung RRS feed

  • 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.


    Sonntag, 17. März 2013 17:58

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

    Sonntag, 17. März 2013 18:53
    Moderator

Alle Antworten