Функция PHP для расшифровки шифрования класса VB.NET RijndaelManaged

У меня есть следующая функция 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 использует предопределенный ключ и IV. Он также не указывает метод заполнения. Функция PHP генерирует другой результат.


person christofersimbar    schedule 29.04.2014    source источник


Ответы (1)


Наконец я получил ответ. Вот правильный код 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));
}
person christofersimbar    schedule 04.05.2014