2010-08-07 23 views
9

ACTUALIZADORijndael 256 Encriptar/desencriptar entre C# y php?

he hecho los cambios en el código C# por lo que utiliza un tamaño de bloque de 256. Pero ahora el mundo hola ve así http://pastebin.com/5sXhMV11 y yo puedo entender por qué debería utilizar con rtrim() para obtener paseo del lío al final.

También cuando dices que el IV debe ser aleatorio, ¿con esto quieres decir que no utilizas el mismo IV más de una vez o la forma en que lo he codificado mal?

¡Gracias nuevamente!

Hola,

estoy tratando de descifrar una cadena con PHP que se ha cifrado en C#. Parece que no puedo obtener PHP para descifrarlo usando mcrypt y podría hacerlo con algo de ayuda, por favor. Recibo el siguiente error con php, así que supongo que no estoy configurando el IV correctamente.

Error: El parámetro IV debe ser tan largo como el tamaño de bloque

utilizar ambas funciones el mismo sistema de cifrado, clave, IV y establecido en el modo CBC:

texto cifrado a partir de C# = UmzUCnAzThH0nMkIuMisqg ==
clave 32 de largo = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 largo = 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; 
} 

Gracias

+1

La IV realmente debe ser aleatorio. Derrota el propósito de tener uno si no es así. – quantumSoup

+0

Rijndael con bloques de 256 bits no es estándar. – kroiz

Respuesta

10

Si desea utilizar Rijndael256 en su aplicación C# tiene que configurar el tamaño de bloque a 256.

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

Y entonces su IV tiene también tiene 256 bits de largo.
ver SymmetricAlgorithm.BlockSize Property


O al revés: En la actualidad su aplicación C# utiliza Rijndael128 y así es necesario que el script php.

<?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); 

impresiones hello world

+3

Sé que no es su culpa, pero el IV realmente debe ser aleatorio. Derrota el propósito de tener uno si no es así. – quantumSoup

+1

de acuerdo. ver http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.generateiv.aspx y http://docs.php.net/function.mcrypt-create-iv – VolkerK

+0

Puedes ver esto por favor ? http://stackoverflow.com/questions/18908613/mcrypt-and-base64-with-php-and-c-sharp – hsuk

-1

Cifrar utilizando 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); 

Descifrar usando 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); 

donde pKeyFilename es un archivo de intercambio de información personal creada con el cert.crt archivo de certificado. Este ejemplo usa un cifrado AES-256.