Andavos: mcrypt: Problem mit Kompatibilität PHP und Microsoft .NET

Beitrag lesen

Hallo,
ansonsten hier mal mein Code:

  
$hash = md5("Mein Key"); //md5 damit man immer ein 128 Bit key erhält.  
//Key in Binaerstring umwandeln  
$key = pack("H*", $hash);  
  
//$text mit $key verschluesseln  
$td = mcrypt_module_open('rijndael-128', '', 'cbc', '');  
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);  
mcrypt_generic_init($td, $key, $iv);  
$encrypted_data = mcrypt_generic($td, $text);  
mcrypt_generic_deinit($td);  
mcrypt_module_close($td);  
  
  
echo "IV: ".base64_encode($iv)."<br>  
Cipher: ".base64_encode($cipher)."<br>  
Key: ".base64_encode($key);  

Wichtig! Im C# / .Net Code muss sowohl $iv als auch $encrypted_data bekannt sein.

Dann der C# Code:

  
byte[] iv = Convert.FromBase64String("mein IV der mit base64 Codiert wurde");  
byte[] cipher = Convert.FromBase64String("meine Verschlüsselten Daten mit base64 Kodierung");  
  
byte[] key = Convert.FromBase64String("mein Key der mit base64 kodiert wurde");  
  
Rijndael aes = new RijndaelManaged();  
aes.Padding = PaddingMode.Zeros;  
  
MemoryStream stream = new MemoryStream(cipher);  
CryptoStream decrypt = new CryptoStream(stream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read);  
StreamReader reader = new StreamReader(decrypt);  
  
string text = reader.ReadToEnd();  
  
  
reader.Close();  
decrypt.Close();  
stream.Close();  
aes.Clear();  

Achja, das ist nun ungetestet. In meinen Fall war der Einsatz noch etwas komplexer und der Austausch des Keys zwischen den Applikationen hat anderes stattgefunden. Auch wurden in C# noch andere Rijndael Klassen genutzt.

Grüße
Andavos - www.php-einfach.de