Laden...

CryptoStream "Zeichenabstände sind ungültig und können nicht entfernt werden."

Erstellt von C#-Coder vor 12 Jahren Letzter Beitrag vor 12 Jahren 18.119 Views
Thema geschlossen
C
C#-Coder Themenstarter:in
7 Beiträge seit 2012
vor 12 Jahren
CryptoStream "Zeichenabstände sind ungültig und können nicht entfernt werden."

Hey @ll,

ich weis dass es zu dem Thema schon 1 oder 2 andere Themen gibt, die hab ich angesehen aber die haben nicht geholfen.
Ich habe auch schon gegoogelt und Beispiele auf MSDN angesehen, aber die halfen leider auch net.

Ich bin irgendwie ein Problemmagnet...

Ich will einen String ver- und entschlüsseln. Das verschlüsseln klappt auch ohne Probleme, aber beim entschlüsseln kommt die CryptoException > Fehlermeldung:

Zeichenabstände sind ungültig und können nicht entfernt werden.

Hier der Code:

   static class Cryption
    {
        public enum CryptionMode { Bit128, Bit192, Bit256 }
        
        static public string Encrypt(string text, CryptionMode mode, byte[] key, byte[] iv)
        {
            int size;
            switch (mode)
            {
                case CryptionMode.Bit128: size = 128; break;
                case CryptionMode.Bit192: size = 192; break;
                case CryptionMode.Bit256: size = 256; break;
                default: throw new Exception("Invalid CryptionBitMode.");
            }

            //Implementing a new Rijndael-instance
            Rijndael rijndael = Rijndael.Create();
            rijndael.BlockSize = size;
            rijndael.IV = iv;
            rijndael.Key = key;

            //Creating streams for cryption...
            MemoryStream stream = new MemoryStream();
            CryptoStream crypter = new CryptoStream(stream, rijndael.CreateEncryptor(), CryptoStreamMode.Write );

            //Encrypting string and write it to memory...
            byte[] buffer = Encoding.Unicode.GetBytes(text);
            crypter.Write(buffer, 0, buffer.Length);

            //Read the encrypted string form memory...
            buffer = new byte[stream.Length];
            stream.Seek(0, SeekOrigin.Begin);
            stream.Read(buffer, 0, buffer.Length);

            crypter.Close();
            stream.Close();

            //Return with the encrypted string...
            return Convert.ToBase64String(buffer);
        }

        static public string Decrypt(string text, CryptionMode mode, byte[] key, byte[] iv)
        {
            int size;
            switch (mode)
            {
                case CryptionMode.Bit128: size = 128; break;
                case CryptionMode.Bit192: size = 192; break;
                case CryptionMode.Bit256: size = 256; break;
                default: throw new Exception("Invalid CryptionBitMode.");
            }

            //Implementing a new Rijndael-instance
            Rijndael rijndael = Rijndael.Create();
            rijndael.BlockSize = size;
            rijndael.IV = iv;
            rijndael.Key = key;

            //Creating streams for cryption...
            MemoryStream stream = new MemoryStream();
            CryptoStream crypter = new CryptoStream(stream, rijndael.CreateDecryptor(), CryptoStreamMode.Read);

            //Write the encrypted text to memory
            byte[] buffer = Convert.FromBase64String(text);
            stream.Write(buffer, 0, buffer.Length);

            //Read the encrypted stirng and decrypt it...
            buffer = new byte[stream.Length];
            stream.Seek(0, SeekOrigin.Begin);
            crypter.Read(buffer, 0, buffer.Length);

            crypter.Close();
            stream.Close();

            //Return with the encrypted string...
            return Encoding.Unicode.GetString(buffer);
        }
    }

Hier rufe ich den Code auf - zum testen:

byte[] key = encoder.GetBytes("ThisIsAVeryLongKeyToEnAndDecrypt"), IV = new byte[16]; //irgendeinen key generieren
            for(int i = 0; i<IV.Length; i++) IV[i] = Convert.ToByte(i*2+5); //irgendeinen IV generieren
            string s = Cryption.Encrypt("Hallo Das hier ist Ein Test",Cryption.CryptionMode.Bit128, key, IV);
            string x = Cryption.Decrypt(s, Cryption.CryptionMode.Bit128, key, IV);

Bitte Hilfe.

Mfg C#

C
2.121 Beiträge seit 2010
vor 12 Jahren

Bei der Zeile
CryptoStream crypter = new CryptoStream(stream, rijndael.CreateDecryptor(), CryptoStreamMode.Read);
fehlt mir noch dass du den stream mit Daten füllst. Aus dem Stream wird in diesem Fall gelesen, da sollte demnach was drin stehen.
Das stream.Write müsste demnach wahrscheinlich vor dieser Zeile stehen.

C
C#-Coder Themenstarter:in
7 Beiträge seit 2012
vor 12 Jahren

Hab ich auch schon probiert. Geht aber auch nicht.

Mfg C#

P
157 Beiträge seit 2010
vor 12 Jahren

Schon mal was von Flush gehört. Du schreibst zwar die Daten in den MemorySteam rufst aber nicht crypter.FlushFinalBlock() auf.

C
C#-Coder Themenstarter:in
7 Beiträge seit 2012
vor 12 Jahren

Das hatte ich auch schon probiert. Das problem ist ja nicht das reinschreiben. Das funktioniert alles. Ich habe auch den kompletten verschlüsselten Text den ich wieder in den Memorystream schreibe. nur das Auslesen und entschlüsseln mit dem cryptostream funktioniert nicht.

Mfg C#

P
157 Beiträge seit 2010
vor 12 Jahren

Das crypter.FlushFinalBlock() muss gleich hinter dem letzten Schreibvorgang. Dann funktioniert das auch.

C
C#-Coder Themenstarter:in
7 Beiträge seit 2012
vor 12 Jahren

Bombe. Wenn ich das direkt dahinter setzte funktioniert es tatsächlich.
Vielen danl für deine Hilfe

Mfg C#

U
1.688 Beiträge seit 2007
vor 12 Jahren

Hallo,

Ich bin irgendwie ein Problemmagnet...

auch das ist keine Rechtfertigung dafür, nun damit zu beginnen, anscheinend routinemäßig mehrere Foren parallel zu beschäftigen - insbesondere da es hier explizit unerwünscht ist und Du in einem anderen Thread noch extra darauf hingewiesen wurdest.
Crosspost

Hinweis von herbivore vor 12 Jahren

Korrekt, bitte keine Crossposts mehr, siehe [Hinweis] Wie poste ich richtig? Punkt 2.2.

Thema geschlossen