2010-08-07 24 views
9

MISE À JOURRijndael 256 Crypter/décrypter entre C# et php?

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

Lorsque vous dites que la perfusion intraveineuse doit être aléatoire, ne voulez-vous pas dire que vous utilisez la même perfusion intraveineuse plus d'une fois ou est-ce la façon dont je l'ai codée?

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 le décrypter en utilisant mcrypt et pourrait faire avec de l'aide s'il vous plaît. Je reçois l'erreur suivante avec php, donc je devine que je ne mets pas 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 passez en mode CBC:

texte chiffré de C# = UmzUCnAzThH0nMkIuMisqg ==
clé 32 longue = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 longue = 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; 
} 

Merci

+1

La IV devrait vraiment être randomisée. Cela va à l'encontre du but d'en avoir un si ce n'est pas le cas. – quantumSoup

+0

Rijndael avec des blocs de 256 bits est non standard. – kroiz

Répondre

10

Si vous souhaitez utiliser Rijndael256 dans votre application C#, vous devez définir le BlockSize à 256.

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

Et puis votre iv a être aussi long de 256 bits.
voir SymmetricAlgorithm.BlockSize Property


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 = "123456789"; 

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

impressions hello world

+3

Je sais que ce n'est pas de ta faute, mais la IV devrait vraiment être randomisée. Cela va à l'encontre du but d'en avoir un si ce n'est pas le cas. – quantumSoup

+1

convenu. voir http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.generateiv.aspx et http://docs.php.net/function.mcrypt-create-iv – VolkerK

+0

Pouvez-vous voir Ceci s'il vous plaît ? http://stackoverflow.com/questions/18908613/mcrypt-and-base64-with-php-and-c-sharp – hsuk

-1

Crypter en utilisant 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 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.