C# - Ungültige Zeichenabstände und ungültige Länge der Daten?
Hallo, ich habe eine Xml-Datei, welche einen Benutzernamen sowie Passwort enthalt und eine Xml-Datei, welche auch einen Benutzernamen und Passwort enthält, nur ist dort das Passwort verschlüsselt.
Wenn ich die erstgenannte Xml-Datei öffne (Passwort nicht verschlüsselt) kommt der Fehler:
"System.Security.Cryptography.CryptographicException: Zeichenabstände sind ungültig und können nicht entfernt werden."
Wenn ich die andere Xml-Dazei öffne (Passwort verschlüsselt) kommt der Fehler:
"System.Security.Cryptography.CryptographicException: Die Länge der zu entschlüsselnden Daten ist ungültig."
Code zum entschlüsseln der Datei:
byte[] chiperbytes = File.ReadAllBytes(path);
MemoryStream ms1 = new MemoryStream(chiperbytes);
CryptoStream cs1 = new CryptoStream(ms1, desObj.CreateDecryptor(), CryptoStreamMode.Read);
cs1.Read(chiperbytes, 0, chiperbytes.Length);
plainbytes2 = ms1.ToArray();
cs1.Close();
ms1.Close();
textBoxPasswort.Text = Encoding.ASCII.GetString(plainbytes2);
Code zum verschlüsseln:
cipherData = textBoxVerschlüsselung.Text;
plainbytes = Encoding.ASCII.GetBytes(cipherData);
plainKey = Encoding.ASCII.GetBytes("01234567890abcdef");
desObj.Mode = CipherMode.CBC;
desObj.Padding = PaddingMode.PKCS7;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, desObj.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(plainbytes, 0, plainbytes.Length);
cs.Close();
chiperbytes = ms.ToArray();
ms.Close();
textBoxVerschlüsselung.Text = Encoding.ASCII.GetString(chiperbytes);
Bitte helft einem Anfänger. :D
Danke.
2 Antworten
Versuche mal cs via
cs.Dispose();
freizugeben. Hatte den Fehler gestern auch lösen können aber gerade heute musste meine VS Lizenz ablaufen. Wäre also so das, was mir im Moment einfiele.
Meine Decryption sieht so aus:
public static string Decrypt(string cipherText)
{
string Key = "KEY";
cipherText = cipherText.Replace(" ", "+");
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(Key, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.FlushFinalBlock();
}
cipherText = Encoding.Unicode.GetString(ms.ToArray());
}
}
return cipherText;
}
Der Befehl:
cs.FlushFinalBlock();
Könnte ebenfalls funktionieren.
MfG
Ein Dispose wird bereits von der Close-Methode angefordert, ist daher unnötig. Eleganter wäre es aber auf jeden Fall, wenn der FS, so wie du, using-Blöcke verwenden würde.
Ist denn die komplette XML-Datei verschlüsselt oder nur das Passwort? Wenn nur das Passwort verschlüsselt ist, musst Du die XML ganz normal einlesen und dann eben nur den Inhalt des Passworts entschlüsseln. Ansonsten kommt es natürlich zu solchen Exceptions, was Du versuchst, etwas zu entschlüsseln, was gar nicht verschlüsselt ist.