2013-08-16 3 views
1

преобразовать этот код:Преобразование кода в C#?

strtoupper(bin2hex(mhash(mhash_sha512, "$ico{$product[0]}{$user[1]}"))); 

в C#:

byte[] data = SHA512.Create().ComputeHash(Encoding.ASCII.GetBytes(args[0])); 
string result = ""; 
for(int index = 0; index < data.Length; index++) 
    result += data[index].ToString("X2"); 

и она работает очень хорошо. Но если я пытаюсь преобразовать ввод в UTF16:

strtoupper(bin2hex(mhash(mhash_sha512, iconv('UTF-8', 'UTF-16', "$ico{$product[0]}{$user[1]}")))); 

и в C# обращенного используя класс Encoding:

SHA512.Create().ComputeHash(Encoding.Convert(Encoding.ASCII/UTF8, Encoding.GetEncoding("UTF-16"), Encoding.ASCII/UTF8.GetBytes(args[0]))); 

он не работает. Мне нужно получить тот же результат с обоих языков. Как правильно преобразовать строку («bbb») в UTF16 на языке C#? Спасибо ...

+0

iconv ('UTF-8', 'UTF-16', DATA) по сравнению с Encoding.Convert (Encoding.ASCII, Encoding.GetEncoding ("UTF-16"), Encoding.ASCII.GetBytes (args [0])) - где ваша ссылка на UTF-8 в коде csharp? Вы используете ASCII, а не UTF-8 в коде cs. – developerwjk

+0

У меня ASCII в C# - не UTF8 ... Поэтому я конвертирую из ASCII в UTF16 в код C#. Но PHP находится в UTF8 ... Но CodePage - небольшая проблема этого преобразования. Для примера - что эквивалентно mhash в C#? Я ничего не знаю - вот почему я спрашиваю здесь ... – Matesax

+0

Зачем вам это нужно в UTF16? Почему бы просто не использовать 'Encoding.UTF8.GetBytes (args [0])'? –

ответ

3

В случае малоконечного кодирования UTF-16, измените Encoding.GetEncoding("UTF-16") на Encoding.Unicode в случае большого энтианта UTF-16, измените его на 'Encoding.BigEndianUnicode`.

При дальнейшей проверке (например, UTF-8 не совпадает с Encoding.ASCII), будет ли это хорошим переводом вашего кода PHP?

var bytesToHash = Encoding.Convert(Encoding.UTF8, Encoding.BigEndianUnicode, Encoding.UTF8.GetBytes(args[0])); 
var result = string.Concat(SHA512.Create().ComputeHash(bytesToHash).Select(b => b.ToString("X2"))); 

Я не знаком с ожидаемым выходом этой PHP функции Mhash, но, возможно, вы могли бы попробовать это:

var hash = new System.Security.Cryptography.SHA512CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(data)); 
var hashString = BitConverter.ToString(hash); 
var phpLikeHash = hashString.Replace("-", String.Empty).ToUpper(); 

UPDATE Итак, основываясь на вашей новой информации первый пример Я включил бы работу, если не требуется преобразование кодировки ввода. Таким образом, это, по крайней мере, подтверждает, что мы можем полагаться на SHA512, производя тот же вывод, что и mhash PHP, так, как вы его используете, и что любые различия связаны с байтами, представленными в качестве входных данных.

Я предлагаю вам немного поэкспериментировать с разными кодировками, используя одну и ту же литеральную строку как входной код как в PHP-коде, так и в C#. Как, например, ниже:

static bool HashIt(Encoding source, Encoding dest, string input, string expectedOutput) 
    { 
     byte[] bytes = source.GetBytes(input); 
     if (source != dest && dest != null) 
      bytes = Encoding.Convert(source, dest, bytes); 
     var hash = SHA512.Create().ComputeHash(bytes); 
     var hashString = string.Concat(hash.Select(b => b.ToString("X2"))); 
     if (hashString.Equals(expectedOutput)) 
     { 
      Console.WriteLine("Match found"); 
      Console.WriteLine("Source encoding: {0}", source.WebName); 
      if (source != dest && dest != null) 
       Console.WriteLine("Converted to: {0}", dest.WebName); 
      return true; 
     } 
     return false; 
    } 

    static void Main(string[] args) 
    { 
     var inputs = new [] { "13338170AS875HEO49F8Sam-PC", @"13338170AS875HEO49F8Sam-PC" }; 
     var expectedOutput = "A91A64DD4DF1880651CB6B919BE02C4363ED6D4B07EA246CF47FFB509918E4AA4C294FF8BA9F73E5‌​CD1CE463BB3E66F84A6C294D70C781CD0610345BCADEEDA7"; 
     var encodings = Encoding.GetEncodings().Select(e => e.GetEncoding()); 
     var matchFound = false; 
     foreach (var srcEncoding in encodings) 
     { 
      foreach (var input in inputs) 
      { 
       if (HashIt(srcEncoding, null, input, expectedOutput)) 
        matchFound = true; 
       foreach (var destEncoding in encodings) 
       { 
        if (HashIt(srcEncoding, destEncoding, input, expectedOutput)) 
         matchFound = true; 
       } 
      } 
     } 
     if (!matchFound) 
      Console.WriteLine("No matches found"); 
     Console.ReadLine(); 
    } 

который производит следующий вывод на моей системе:

No matches found 

Таким образом, вы можете быть не повезло. В настоящее время я не вижу, что еще попробовать.

+0

Я попробовал ваш код с правильным входом (13338170AS875HEO49F8Sam-PC), и я не найти соответствие ... Правильный выход: A91A64DD4DF1880651CB6B919BE02C4363ED6D4B07EA246CF47FFB509918E4AA4C294FF8BA9F73E5 CD1CE463BB3E66F84A6C294D70C781CD0610345BCADEEDA7 (PHP) – Matesax

+0

К сожалению, извините, это SHA512, не 256. Я буду обновлять мой ответ : D – Alex

+0

Но не соответствует ... – Matesax

Смежные вопросы