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#
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.
Schon mal was von Flush gehört. Du schreibst zwar die Daten in den MemorySteam rufst aber nicht crypter.FlushFinalBlock() auf.
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#
Das crypter.FlushFinalBlock() muss gleich hinter dem letzten Schreibvorgang. Dann funktioniert das auch.
Bombe. Wenn ich das direkt dahinter setzte funktioniert es tatsächlich.
Vielen danl für deine Hilfe
Mfg C#
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
Korrekt, bitte keine Crossposts mehr, siehe [Hinweis] Wie poste ich richtig? Punkt 2.2.