2009-06-24 4 views
2

Ich habe einen PHP-Entschlüsselungsalgorithmus an einem Ende und einen .Net-Verschlüsselungsalgorithmus an einem anderen. Ich benutze mcrypt_decrypt zum Entschlüsseln Zweck in PHP-Code und auf der Suche nach einem Äquivalent von mcrypt_encrypt in .Net.MCRYPT in .Net

$cipher_alg = MCRYPT_RIJNDAEL_128; 
$iv = mcrypt_create_iv (mcrypt_get_iv_size ($cipher_alg, MCRYPT_MODE_ECB), MCRYPT_RAND); 

$encrypted_string = mcrypt_encrypt ($cipher_alg, $sessionkey, $string, MCRYPT_MODE_CBC, $iv); 
$hex_encrypted_string = bin2hex ($encrypted_string); 

Gibt es ein Äquivalent von mcrypt_encrypt in .NET: die folgenden Genauer gesagt ist der PHP-Code, ich möchte .net konvertieren?

+0

'mcrypt_create_iv()' + 'MCRYPT_MODE_ECB' ist ein teurer' NOP'. –

Antwort

3

Ich bin mit a solution in my blog herausgekommen. Hier

ist ein Auszug:

private static string CreateEncryptedString(string myString, string hexiv, string key) 
    { 
     RijndaelManaged alg = new RijndaelManaged(); 
     alg.Padding = PaddingMode.Zeros; 
     alg.Mode = CipherMode.CBC; 
     alg.BlockSize = 16 * 8; 
     alg.Key = ASCIIEncoding.UTF8.GetBytes(key); 
     alg.IV = StringToByteArray(hexiv); 
     ICryptoTransform encryptor = alg.CreateEncryptor(alg.Key, alg.IV); 

     MemoryStream msStream = new MemoryStream(); 
     CryptoStream mCSWriter = new CryptoStream(msStream, encryptor, CryptoStreamMode.Write); 
     StreamWriter mSWriter = new StreamWriter(mCSWriter); 
     mSWriter.Write(myString); 
     mSWriter.Flush(); 
     mCSWriter.FlushFinalBlock(); 

     var EncryptedByte = new byte[msStream.Length]; 
     msStream.Position = 0; 
     msStream.Read(EncryptedByte, 0, (int)msStream.Length); 

     return ByteArrayToHexString(EncryptedByte); 

    } 

    public static byte[] StringToByteArray(String hex) 
    { 
     int NumberChars = hex.Length; 
     byte[] bytes = new byte[NumberChars/2]; 
     for (int i = 0; i < NumberChars; i += 2) 
      bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
     return bytes; 
    } 

    public static string ByteArrayToHexString(byte[] ba) 
    { 
     StringBuilder hex = new StringBuilder(ba.Length * 2); 
     foreach (byte b in ba) 
      hex.AppendFormat("{0:x2}", b); 
     return hex.ToString(); 
    } 

Es ist eine Sache zu beachten. Die Schlüsselgröße muss 16 sein. Das bedeutet, dass der Schlüsselparameter eine Zeichenfolge mit 16 Zeichen sein muss. Andernfalls funktioniert die Verschlüsselung nicht und es wird eine CryptographicException ausgelöst.

Auf dem PHP-Ende, hier ist, wie Sie die Decodierung tun:

$cipher_alg = MCRYPT_RIJNDAEL_128; 
$decrypted_string = mcrypt_decrypt($cipher_alg, $key, 
$encrypted_string , MCRYPT_MODE_CBC, trim(hex2bin(trim($hexiv)))); 
1

Es gibt keine direkte Entsprechung, aber 128-bit Rijndael wird unterstützt (und wahrscheinlich die meisten anderen Verschlüsselungen, die Sie möchten). Details und ein Beispiel finden Sie in der Klasse Rijndael.

Grundsätzlich basiert der Verschlüsselungsteil des Frameworks darauf, dass Sie eine geeignete Instanz einer Basisklasse angeben (CryptoStream, SymmetricAlgorithm usw.) anstatt eine Chiffre nach Namen zu spezifizieren - aber Sie sollten in der Lage sein, das zu tun, was Sie brauchen.

Verwandte Themen