2010-08-07 4 views
9

ОБНОВЛЕНОRijndael 256 Шифрование/расшифровка между C# и php?

Я сделал изменения в C# код поэтому он использует размер блока 256. но теперь привет мир выглядит так http://pastebin.com/5sXhMV11 и я не могу понять, что я должен использовать с RTRIM() для В конце концов, прибегайте к беспорядку.

Также, когда вы говорите, что IV должно быть случайным, вы подразумеваете, что вы не используете тот же IV больше, чем один раз, или это то, как я его неправильно закодировал?

Еще раз спасибо!

Привет,

Я пытаюсь расшифровать строку с PHP, который был зашифрован в C#. Я не могу заставить PHP расшифровать его с помощью mcrypt и, возможно, с некоторой помощью справится. Я получаю следующую ошибку с php, поэтому я предполагаю, что я не правильно устанавливаю IV.

Ошибка: Параметр IV должен быть до тех пор, как размером блока

Обе функции используют тот же шифр, ключ, IV и установите режим CBC:

зашифрованный текст из C# = UmzUCnAzThH0nMkIuMisqg ==
ключ 32 длиной = qwertyuiopasdfghjklzxcvbnmqwerty
IV 16 длиной = 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; 
} 

Благодаря

+1

IV действительно должен быть рандомизирован. Это побеждает цель иметь один, если это не так. – quantumSoup

+0

Rijndael с 256-битными блоками нестандартен. – kroiz

ответ

10

Если вы хотите использовать Rijndael256 в приложении C# вы должны установить BLOCKSIZE на 256.

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

А потом капельницу имеет также должно быть 256 бит.
см SymmetricAlgorithm.BlockSize Property


Или наоборот: В настоящее время ваш C# приложение использует Rijndael128 и поэтому должен ваш скрипт.

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

печатает hello world

+3

Я знаю, что это не твоя вина, но я действительно должен быть рандомизирован. Это побеждает цель иметь один, если это не так. – quantumSoup

+1

согласился. см. http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.generateiv.aspx и http://docs.php.net/function.mcrypt-create-iv – VolkerK

+0

Вы можете видеть это пожалуйста? http://stackoverflow.com/questions/18908613/mcrypt-and-base64-with-php-and-c-sharp – hsuk

-1

Шифрование с использованием 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); 

дешифрования с использованием 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); 

где pKeyFilename является обмен персональной информацией файла создается файл сертификата cert.crt. В этих примерах используется шифрование AES-256.