用于解密VB.NET RijndaelManaged类加密的PHP函数


PHP function to decrypt a VB.NET RijndaelManaged class encryption

我有以下Visual Basic。NET函数,用于加密文件。此函数来自第三方,因此我无法更改原始代码。

Dim bytes As Byte() = New UnicodeEncoding().GetBytes("12345678")
Dim fileStream1 As FileStream = New System.IO.FileStream(txtInput.Text, FileMode.Create)
Dim rijndaelManaged As RijndaelManaged = New RijndaelManaged
Dim cryptoStream1 As CryptoStream = New CryptoStream(fileStream1, rijndaelManaged.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write)
Dim fileStream2 As FileStream = New System.IO.FileStream(txtOutput.Text, FileMode.Open)
Dim BytesRead As Integer
Dim buffer(4096) As Byte
Do
   BytesRead = fileStream2.Read(buffer, 0, buffer.Length) 
   If BytesRead > 0 Then
      cryptoStream1.Write(buffer, 0, BytesRead)
   End If
Loop While BytesRead > 0

我需要帮助创建一个PHP来解密上面的函数。目前,我试图在PHP中使用以下函数进行解密:

function decrypt($text) {
  $key = mb_convert_encoding("12345678","utf-16"); 
  $iv = mb_convert_encoding("12345678","utf-16");
  return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv), "'0");
}
$decrypted=decrypt(file_get_contents("tes_encrypted.xml"));
$nfile = fopen("test.xml", 'w');
fwrite($nfile, $decrypted);
fclose($nfile);

正如您所看到的,VB.NET中的加密函数使用预定义的Key和IV。它也没有指定填充方法。PHP函数生成不同的结果。

最后我得到了答案。这里有正确的PHP代码来解密上面的VB.NET加密:

function unpad($value)
{
    $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $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;
            }
        }
    }
    return substr($value, 0, strlen($value) - $packing); 
}

function decrypt($text) {
    $key= mb_convert_encoding("12345678","ucs-2LE");
    $iv= mb_convert_encoding("12345678","ucs-2LE");
    return unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv));
}