Не одно и то же хеш-значение в c # и php - PullRequest
2 голосов
/ 07 марта 2012

У меня есть веб-сервис, разработанный на c #.Он использует MD5 для генерации сеансового ключа.

c #:

public static string GetMD5(string pTxt)
{
    string sCTxt = "";
    byte[] aTxt;
    UnicodeEncoding oEnc = new UnicodeEncoding();
    aTxt = oEnc.GetBytes(pTxt);
    HashAlgorithm oHash = new MD5CryptoServiceProvider();
    byte[] aCTxt = oHash.ComputeHash(aTxt);
    foreach (byte b in aCTxt)
        sCTxt += String.Format("{0:X2}", b);
    return (sCTxt);
}

По нескольким причинам я должен сделать один и тот же метод GetMD5 в PHP .Конечно, базовая функция md5 () не возвращает тот же хеш (из-за UNICODE)

Я пытался смоделировать код в PHP, но безуспешно

php:

public function HexToBytes($s) {
    return join('', array_map('chr', array_map('hexdec', str_split($s, 2))));
}

public function GetMD5($pStr) {
    $data = mb_convert_encoding($pStr, 'UTF-16LE', 'ASCII');
    $h = $this->HexToBytes(hash_hmac('md5', $data, ''));
    return (base64_encode($h));
}

Есть идеи, почему результат не совпадает?

Заранее спасибо


**

ИСПРАВЛЕНО!Спасибо!

**

Для тех, кто заинтересован, вот метод PHP, который соответствует c # one

public function str2hex($string) {
   $hex = "";
   for ($i = 0; $i < strlen($string); $i++)
      $hex .= (strlen(dechex(ord($string[$i]))) < 2) ? "0" . dechex(ord($string[$i])) : dechex(ord($string[$i]));       
   return $hex;
}

public function GetMD5($pStr) {
   $data = mb_convert_encoding($pStr, 'UTF-16LE', 'UTF-8');
   $h = $this->str2hex(md5($data, true));
   return strtoupper($h);
}

1 Ответ

3 голосов
/ 07 марта 2012

Я думаю, вы просто слишком усложнили свои методы.У меня работали следующие альтернативы:

C # :

public static string GetMD5(string text)
{
    byte[] textBytes = Encoding.UTF8.GetBytes(text);
    byte[] hash = MD5.Create().ComputeHash(textBytes);

    return Convert.ToBase64String(hash);
}

PHP :

public function GetMD5($pStr) {
    return base64_encode(
              md5(mb_convert_encoding($pStr, "UTF8", "Unicode"), true));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...