2011-05-23 54 views
1

Silverlight和PHP之间的密码协议问题。Silverlight + PHP - AES crypt

我试图加密Silverlight中的文本值,并使用AES算法在PHP中解密。 这个例子我如何在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算法的填充参数的问题。谢谢。

+0

你是什么意思“它不工作”? – 2011-05-25 07:32:52

+0

这意味着解密后的文本值不等于输入文本值。 – user470214 2011-05-25 07:56:15

+0

请使用您的IV和密钥来显示更完整的示例。 尝试将它们设置为一些无意义的[0,0,0,0 ..]。我怀疑你的字节表示有问题。 – wizzard0 2011-05-25 15:28:35

回答

0

如果缺少其他的C#代码,以及“你的工作不正常”的含义,我不能确定,但​​我会说这是你的问题。

$ iv = $ key;

你想拉IV形式cryptAlg.IV

而且,我不觉得默认的编码是PKCS7为AesManaged和2)有时需要调用flush在缓冲区得到最后的书面块。