Question

MISE À JOUR

J'ai apporté les modifications au code C # il utilise une taille de bloc de 256. mais maintenant les regards du monde bonjour comme celui-ci http://pastebin.com/5sXhMV11 et je ne peux pas comprendre ce que je devrais utiliser avec rtrim () pour obtenir tour du désordre à la fin.

De même, lorsque vous dites que la IV doit être aléatoire, par cela signifie que vous ne pas utiliser le même IV plus d'une fois ou est la façon dont je l'ai codé mal?

Merci encore!

Salut,

Je suis en train de décrypter une chaîne avec PHP qui a été chiffré en C #. Je ne peux pas sembler obtenir PHP pour déchiffrer à l'aide mcrypt et pourrait faire avec un peu d'aide s'il vous plaît. Je reçois l'erreur suivante avec php donc je suppose que je ne suis pas le réglage de la IV correctement.

Erreur: Le paramètre IV doit être aussi longtemps que le blocksize

Les deux fonctions utilisent le même chiffrement, clé, IV et en mode CBC:

texte chiffré de c # = UmzUCnAzThH0nMkIuMisqg ==
clé 32 = longue qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 longue = 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), "\0");;
    return $decrypted;
}

Merci

Était-ce utile?

La solution

Si vous voulez utiliser Rijndael256 dans votre application C #, vous devez définir la BlockSize 256.

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

Et puis votre iv doit être de 256 bits de long aussi bien.
voir SymmetricAlgorithm.BlockSize Propriété


Ou l'inverse: Actuellement, votre application C # utilise Rijndael128 et doit donc votre 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

Autres conseils

Chiffrer via 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);

Décrypter en utilisant 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);

où pKeyFilename est un fichier Personal Information Exchange créé avec le fichier de certificat cert.crt. Cet exemple utilise un cryptage AES-256.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top