ACTUALIZADO

He hecho los cambios en el código de C# por lo que se utiliza un tamaño de bloque de 256. pero ahora el hola mundo parece este http://pastebin.com/5sXhMV11 y no puedo averiguar lo que debo usar con rtrim() para obtener el paseo del lío en el final.

También cuando dices que la IV debe ser al azar, por ello te refieres a no utilizar el mismo IV más de una vez, o es la forma en que me han codificado mal?

Gracias de nuevo!

Hola,

Estoy tratando de descifrar una cadena con PHP que se ha cifrado en C#. Me parece que no puede obtener de PHP para descifrarlo utilizando mcrypt y podría hacer con un poco de ayuda por favor. Me sale el siguiente error con php así que supongo que no soy la configuración de la IV correctamente.

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

Ambas funciones utilizan el mismo sistema de cifrado, clave, IV y configurado para el modo CBC:

texto cifrado de c# = UmzUCnAzThH0nMkIuMisqg==
clave de 32 tiempo = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 = 1234567890123456

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), "
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;
}
"
);; return $decrypted; }

Gracias

El IV que en realidad debería ser al azar. Se frustra el propósito de tener uno si no lo es.
Rijndael de 256 bits de bloques no es estándar.

OriginalEl autor arbme | 2010-08-07

2 Comentarios

  1. 10

    Si quieres usar Rijndael256 en su aplicación en C#, usted tiene que fijar el Tamaño de los bloques de 256.

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

    Y, a continuación, su iv tiene que ser de 256 bits de largo.

    ver SymmetricAlgorithm.Tamaño De Bloque Propiedad


    O al revés: en la Actualidad su aplicación en 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 = "1234567890123456";
    
    $foo = new Foo;
    echo $foo->decrypt($key, $iv, $encrypted);

    imprime hello world

    Sé que no es su culpa, pero el IV que en realidad debería ser al azar. Se frustra el propósito de tener uno si no lo es.
    de acuerdo. consulte msdn.microsoft.com/en-us/library/… y docs.php.net/function.mcrypt-create-iv
    Se puede ver esto por favor ? stackoverflow.com/questions/18908613/…
    Cierto, pero su ejemplo 😉

    OriginalEl autor VolkerK

  2. -1

    Cifrar usando 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 utilizando 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 Intercambio de Información Personal creado el Archivo con el archivo de certificado cert.crt. Este ejemplo utiliza un cifrado AES-256.

    OriginalEl autor Digital Human

Dejar respuesta

Please enter your comment!
Please enter your name here