PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .NET: Entschlüsseln mit Rijndael


Elemental
2007-06-14, 08:56:15
Hallo zusammen,
ich kämpfe gerade an der Entschlüsselung eines verschlüsselten xml-strings, der mir aus einer ClassLibrary geliefert wird.

So erzeuge ich das Rijndael-Objekt mit key und init-Vektor:


byte[] byteArray = Convert.FromBase64String(strXMLRecipeResults);

// Create a RijndaelManaged object
aesAlg = new RijndaelManaged();
aesAlg.Key = new byte[] { 91, 46, 46, 210, 129, 102, 145, 235, 147, 128, 112, 151, 42, 172, 247, 199, 57, 213, 231, 22, 1, 139, 100, 237, 132, 231, 224, 54, 179, 99, 167, 88 };
aesAlg.IV = new byte[] { 245, 51, 234, 142, 250, 200, 228, 93, 151, 109, 206, 231, 52, 32, 228, 212 };

// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);


Das sollte richtig sein...

Jetzt zum eigentlichen entschlüsseln; ich habe zwei Varianten versucht:

1.

// Create the streams used for decryption.
msDecrypt = new MemoryStream(byteArray);
csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
srDecrypt = new StreamReader(csDecrypt);

// Read the decrypted bytes from the decrypting stream
// and place them in a string.
string plaintext = srDecrypt.ReadToEnd();


Funktioniert so, allerdings steht dann in "plaintext" ein '\0' nach jedem Zeichen. Ein anschliessendes
plaintext = plaintext.Replace("\0", string.Empty);
und alles is paletti; nicht schön, aber funktioniert...

2.

//Create the streams
msDecrypt = new MemoryStream();
csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Write);

//Write the data and make it do the decryption
csDecrypt.Write(byteArray, 0, byteArray.Length);

//Get the decrypted string
plaintext = System.Text.Encoding.Unicode.GetString(msDecrypt.ToArray());


Funktioniert fast wunderbar, d.h. keine '\0' nach jedem Zeichen, aber es fehlen die letzten 4 byte des strings :|


Jetzt meine Frage:
Wie macht man's richtig? :rolleyes:

mfG
Elemental

Xmas
2007-06-14, 14:39:37
Du musst den CryptoStream flushen oder closen bevor du vom MemoryStream ein Array anforderst.

Elemental
2007-06-14, 14:52:26
Funktioniert! Danke! :smile:

Gnafoo
2007-06-14, 17:48:00
Auch wenn sich die Sache schon erledigt hat: Anscheinend liegen die Daten ja in UTF16 vor. Der StreamReader verwendet aber UTF8, sofern nichts anderes angegeben wurde (steht zumindest in der MSDN-Library X-D). Das erklärt die '\0'-Zeichen. Ich vermute mal, dass ein "new StreamReader(csDecrypt, Encoding.Unicode)" das Problem beheben würde.

Elemental
2007-06-18, 10:42:42
Stimmt, geht auch! :)