Преобразование кода C # в php приводит к другому результату

#c# #php

#c# #php

Вопрос:

У меня есть код, использующий C #, и я хочу попробовать перевести на php-код, но всегда получал другой результат в версии php

C#

 private static string encryptDecrypt(string input)
 {
     char[] key = { 'X' }; //Any chars will work, in an array of any size
     char[] output = new char[input.Length];

     for (int i = 0; i < input.Length; i  )
     {
         output[i] = (char)(input[i] ^ key[i % key.Length]);
     }

     return new string(output);
 }

string vb64 = "DAAdAAAADAAVAAsAHwA=";
string decrypted = encryptDecrypt(Encoding.Unicode.GetString(Convert.FromBase64String(vb64)));
Console.WriteLine("Decrypted:"   decrypted);  
  

расшифрованный вывод: TEXTMSG

PHP

 function encryptDecrypt($input) {
    $key = ['X']; 
    $output = '';
    for ($i = 0; $i < strlen($input); $i  ) {
        $output .= $input[$i] ^ $key[$i % count($key)];
    }
    return $output;
}
$vb64 = "DAAdAAAADAAVAAsAHwA=";
$decrypted = encryptDecrypt(base64_decode($vb64));
echo "decrypted ".$decrypted.PHP_EOL;
  

расшифрованный TXEXXXTXMXSXGX

РЕДАКТИРОВАТЬ: необходимо добавить mb_convert_encoding для установки значения UTF-16 encryptDecrypt(mb_convert_encoding(base64_decode($ vb64), «», «UTF-16LE»))

Комментарии:

1. Просто чтобы вы знали, Encoding.Unicode != Encoding.UTF8

2. Вы уверены, что count($key) это правильно? Я думаю, вы хотели использовать strlen($key) [Строку 5].

3. Эти два кода отличаются. То, что вы делаете в цикле для PHP, не совпадает с исходным кодом C #.

4. я скопировал код из github.com/KyleBanks/XOREncryption

5. @user Я рекомендую опубликовать ваш собственный ответ на ваш вопрос, поскольку я неправильно понял, какой язык был, так сказать, «проблемой», и я не могу предоставить ответ на PHP. 🙂