2010-08-07 7 views
9

AKTUALISIERTRijndael 256 Verschlüsseln/Entschlüsseln zwischen C# und PHP?

ich die Änderungen an dem C# -Code gemacht habe, so dass es eine Blockgröße von 256 verwendet, aber jetzt der Hallo Welt sieht aus wie diese http://pastebin.com/5sXhMV11 und ich kann nicht herausfinden, was ich verwenden soll, um mit rtrim() Holen Sie sich Fahrt von der Sauerei am Ende.

Auch wenn Sie sagen, die IV sollte zufällig sein, damit meinen Sie nicht die gleiche IV mehr als einmal verwenden oder ist die Art, wie ich es falsch codiert habe?

Danke nochmal!

Hallo,

Ich versuche, eine Zeichenfolge mit PHP zu entschlüsseln, die in C# verschlüsselt wurde. Ich kann nicht scheinen, PHP zu bekommen, um es mit mcrypt zu entschlüsseln und könnte mit etwas Hilfe bitte tun. Ich bekomme den folgenden Fehler mit PHP, also rate ich, dass ich IV nicht richtig setze.

Fehler: Die IV-Parameter, solange die Block

Beide Funktionen verwenden die gleiche cipher, Schlüssel, IV und auf CBC-Modus sein muss:

verschlüsselten Text aus C# = UmzUCnAzThH0nMkIuMisqg ==
Taste 32 long = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 long = 123456789

C#

public static string EncryptString(string message, string KeyString, string IVString) 
    { 
     byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString); 
     byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString); 

     string encrypted = null; 
     RijndaelManaged rj = new RijndaelManaged(); 
     rj.Key = Key; 
     rj.IV = IV; 
     rj.Mode = CipherMode.CBC; 

     try 
     { 
      MemoryStream ms = new MemoryStream(); 

      using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write)) 
      { 
       using (StreamWriter sw = new StreamWriter(cs)) 
       { 
        sw.Write(message); 
        sw.Close(); 
       } 
       cs.Close(); 
      } 
      byte[] encoded = ms.ToArray(); 
      encrypted = Convert.ToBase64String(encoded); 

      ms.Close(); 
     } 
     catch (CryptographicException e) 
     { 
      Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); 
      return null; 
     } 
     catch (UnauthorizedAccessException e) 
     { 
      Console.WriteLine("A file error occurred: {0}", e.Message); 
      return null; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("An error occurred: {0}", e.Message); 
     } 
     finally 
     { 
      rj.Clear(); 
     } 

     return encrypted; 
    } 

PHP

var $mcrypt_cipher = MCRYPT_RIJNDAEL_256; 
var $mcrypt_mode = MCRYPT_MODE_CBC; 

function decrypt($key, $iv, $encrypted) 
{ 
    $encrypted = base64_decode($encrypted); 

    $decrypted = rtrim(mcrypt_decrypt($this->mcrypt_cipher, $key, $encrypted, $this->mcrypt_mode, $iv), "\0");; 
    return $decrypted; 
} 

Dank

+1

Die IV sollte wirklich randomisiert werden. Es vereitelt den Zweck, einen zu haben, wenn es nicht ist. – quantumSoup

+0

Rijndael mit 256-Bit-Blöcken ist nicht Standard. – kroiz

Antwort

10

Wenn Sie Rijndael256 in Ihrem C# .NET-Anwendung verwenden möchten Sie die Blockgröße auf 256.

RijndaelManaged rj = new RijndaelManaged(); 
rj.BlockSize = 256; 

gesetzt und dann iv hat auch 256 Bit lang sein.
siehe SymmetricAlgorithm.BlockSize Property


Oder umgekehrt: Ihre C# Anwendung verwendet Rijndael128 Zeit und so muss Ihr PHP-Skript.

<?php 
class Foo { 
    protected $mcrypt_cipher = MCRYPT_RIJNDAEL_128; 
    protected $mcrypt_mode = MCRYPT_MODE_CBC; 

    public function decrypt($key, $iv, $encrypted) 
    { 
    $iv_utf = mb_convert_encoding($iv, 'UTF-8'); 
    return mcrypt_decrypt($this->mcrypt_cipher, $key, base64_decode($encrypted), $this->mcrypt_mode, $iv_utf); 
    } 
} 



$encrypted = "UmzUCnAzThH0nMkIuMisqg=="; 
$key = "qwertyuiopasdfghjklzxcvbnmqwerty"; 
$iv = "123456789"; 

$foo = new Foo; 
echo $foo->decrypt($key, $iv, $encrypted); 

druckt hello world

+3

Ich weiß, es ist nicht deine Schuld, aber die IV sollte wirklich randomisiert werden. Es vereitelt den Zweck, einen zu haben, wenn es nicht ist. – quantumSoup

+1

vereinbart. siehe http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.generativ.aspx und http://docs.php.net/function.mcrypt-create-iv – VolkerK

+0

Kannst du sehen? das bitte ? http://stackoverflow.com/questions/18908613/mcrypt-and-base64-with-php-and-c-sharp – hsuk

-1

Verschlüsselung mit PHP;

/Generate public key for encrytion 
$path = "keys/"; 

    $crt = openssl_x509_read(file_get_contents($path."cert.crt")); 
    $publickey = openssl_get_publickey($crt); 

    //Encrypt using public key 
    openssl_public_encrypt($source, $crypted, $publickey); 

    //openssl_private_encrypt($source, $crypted, $privkey); 
    echo base64_encode($crypted); 

Decrypt C#

X509Certificate2 x509cert = new X509Certificate2(pKeyFilename); 
    RSACryptoServiceProvider.UseMachineKeyStore = false; 
    RSACryptoServiceProvider crypt = (RSACryptoServiceProvider)x509cert.PrivateKey;     

    byte[] decrypted = crypt.Decrypt(Convert.FromBase64String(data), false); 
    return ASCIIEncoding.UTF8.GetString(decrypted); 

wo pKeyFilename ein Personal Information Exchange Datei mit der Zertifikatsdatei cert.crt erstellt ist. In diesem Beispiel wird eine AES-256-Verschlüsselung verwendet.