У меня есть веб-сервис, разработанный на 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);
}