Entwickler-Ecke

IO, XML und Registry - String Verschlüsselt in Registry schreiben und wieder ausles


sun30friend - Do 22.03.12 11:58
Titel: String Verschlüsselt in Registry schreiben und wieder ausles
Hallo liebe Gemeinde,

ich habe da mal wieder ein Problem wo ich Eure Erfahrung und hilfe benötige.

ich verschlüssel einen String und möchte ihn später wieder auslesen und entschlüsseln.
Allerdings habe ich das Problem das ich beim Entschlüsseln "Bad Data" als Fehlermeldung bekomme.

Ich seh bestimmt den Wald vor lauter Bäumen nicht mehr:

Key settings

C#-Quelltext
1:
2:
private readonly byte[] key = new byte[] { xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx };
private readonly byte[] iv = new byte[] { xx, xx, xx, xx, xx, xx, xx, xx };


Verschlüsselung und schreiben in Registry:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
string input = "12345";

MemoryStream mstream = new MemoryStream();
CryptoStream cstream = new CryptoStream(mstream, new TripleDESCryptoServiceProvider().CreateEncryptor(this.key, this.iv), CryptoStreamMode.Write);

byte[] toEncrypt = new UnicodeEncoding().GetBytes(input);
cstream.Write(toEncrypt, 0, toEncrypt.Length);
cstream.FlushFinalBlock();
byte[] ret = mstream.ToArray();
                        
cstream.Close();
mstream.Close();

RegistryKey wreg = Registry.CurrentUser.CreateSubKey("Software\\Test");
wreg.SetValue("testentry", ret);


Auslesen und Entschlüsseln:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
RegistryKey regreader = Registry.CurrentUser.OpenSubKey("Software\\Test"true);

byte[] rread = (byte[])regreader.GetValue("testentry");

MemoryStream nmstream = new MemoryStream();
CryptoStream ncstream = new CryptoStream(nmstream, new TripleDESCryptoServiceProvider().CreateDecryptor(this.key, this.iv), CryptoStreamMode.Read);
byte[] fromEncrypt = new byte[rread.Length];

ncstream.Read(fromEncrypt, 0, fromEncrypt.Length);  // Hier bekomme ich den Fehler "Bad Data"

string result = new UnicodeEncoding().GetString(fromEncrypt);


Ich hoffe Ihr könnt mir folgend und auch einen Tipp geben.

Danke im Voraus und Gruß
Flo


Th69 - Do 22.03.12 12:26

Hallo Flo,

hast du denn schon den Debugger benutzt? Kriegst du das gleiche Byte-Array beim Lesen zurück, was du auch hineinschreibst?
Probiere ansonsten mal

C#-Quelltext
1:
wreg.SetValue("testentry", ret, RegistryValueKind.Binary);                    


... jetzt sehe ich den Fehler (beim nochmaligen Drüber-gucken über deinen Code): dein MemoryStream beim Auslesen ist leer - du mußt da noch das Byte-Array rread hineinschreiben...


sun30friend - Do 22.03.12 12:47

Hallo Th69,

vielen Dank... So blind kann man sein.
wenn ich den memorystream fülle geht es natürlich

danke und einen schönen tag noch

Gruß
Flo