Silverlight + PHP - крипта AES - PullRequest
1 голос
/ 23 мая 2011

Проблема с протоколом криптографии между Silverlight и PHP.

Я попытался зашифровать текстовое значение в Silverlight и расшифровать его в PHP с помощью алгоритма AES.Этот пример, как я шифрую это в Silverlight:

<!-- language: lang-cs -->
SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "Crypt file  (CRP)|*.crp";

bool res = dlg.ShowDialog().Value;

if (res == true)
{
    Stream outStream = dlg.OpenFile();

    AesManaged cryptAlg = new AesManaged();
    ICryptoTransform encryptor = cryptAlg.CreateEncryptor(_encryptKey, _encryptIv);
    CryptoStream cryptStream = new CryptoStream(outStream, encryptor, CryptoStreamMode.Write);

    byte[] buffer = Encoding.UTF8.GetBytes(textBox1.Text);
    int size = buffer.Length;
    cryptStream.Write(buffer, 0, size);
    cryptStream.Close();
    outStream.Close();
}

Этот пример, как я дешифрую это в PHP:

<!-- language: lang-php -->
function fb_get_contents($filename) {
    $fp = fopen($filename, "rb");
    $cc = fgets($fp);
    fclose($fp);
    return $cc;
}

$value = fb_get_contents($_FILES['file']['tmp_name']);

$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

$key = substr($key, 0, 16);
$iv = $key;
$rc = mcrypt_generic_init($module, $key, $iv); 

$value = base64_decode($value);
$value = mdecrypt_generic($module, $value); 

//apply pkcs7 padding removal
$packing = ord($value[strlen($value) - 1]);
if($packing && $packing < $blockSize){
    for($P = strlen($value) - 1; $P >= strlen($value) - $packing; $P--){
        if(ord($value{$P}) != $packing){
            $packing = 0;
        }//end if
    }//end for
}//end if 

$value = substr($value, 0, strlen($value) - $packing);

И это не работает.Я думаю, что это может быть проблема с параметром заполнения алгоритма AES.Спасибо.

1 Ответ

0 голосов
/ 14 октября 2011

Отсутствует остальная часть кода на c # и что вы подразумеваете под "он не работает", я не могу быть уверен, но я бы сказал, что это ваша проблема.

$ iv = $ key;

Вы хотите вытащить форму iv cryptAlg.IV

Более того, я не думаю, что кодировкой по умолчанию является PKCS7 для AesManaged и 2) иногда вам нужно вызвать очистку буфера для получения последнего записанного блока.

...