Как бы я перевести этот код C # на PHP? - PullRequest
5 голосов
/ 03 февраля 2010

Мне нужна версия PHP следующего кода C #:

string dateSince = "2010-02-01";
string siteID = "bash.org";
string sharedSecret = "12345"; // the same combination on my luggage!

using System.Security.Cryptography;

MD5CryptoServiceProvider x = new MD5CryptoServiceProvider();
byte[] dataBytes = System.Text.Encoding.ASCII.GetBytes(string.Format("{0}{1}{2}",   dateSince,  siteID, sharedSecret));
string result = BitConverter.ToString(x.ComputeHash(dataBytes));

... этот фрагмент кода кажется неполным. Но вот что я думаю:

  1. объединение dateSince, siteID и sharedSecret. Кража трусов.

  2. ???

  3. преобразование этой строки в байтовый массив ascii.

  4. с хешем MD5 этого массива.

Этот загадочный объект BitConverter, по-видимому, преобразует этот хэшированный массив MD5 в строку шестнадцатеричных чисел. Согласно вышеупомянутому документу, значение результата должно выглядеть примерно так: «6D-E9-9A-B6-73-D8-10-79-BC-4F-EE-51-A4-84-15-D8»

Любая помощь очень ценится!


Забыл включить это раньше. Вот версия PHP того, что я написал до сих пор:

$date_since = "2010-02-01";
$site_id = "bash.org";
$shared_secret = "12345";

$initial_token = $date_since.$site_id.$shared_secret;

$ascii_version = array();
foreach($i=0; $i < strlen($initial_token); $i++) {
    $ascii_version[] = ord(substr($initial_token,$i,1));
}

$md5_version = md5(join("", $ascii_version));

$hexadecimal_bits = array();
foreach($i=0; $i < strlen($md5_version); $i++) {
   // @todo convert to hexadecimal here?
   $hexadecimal_bits[] = bin2hex(substr($md5_version,$i,1));
}

$result = join("-", $hexadecimal_bits);

Ответы [ 2 ]

1 голос
/ 03 февраля 2010

Я думаю, что это будет работать для вас.Похоже, что метод MD5CryptoServiceProvider :: ComputeHash возвращает массив из 16 байтов, а не строку из 32 символов, как обычная функция PHP md5().Тем не менее, PHP md5() имеет второй необязательный параметр, который вызывает «необработанный вывод», который действительно соответствует выводу ComputeHash().

$date_since = "2010-02-01";
$site_id = "bash.org";
$shared_secret = "12345";
$initial_token = $date_since.$site_id.$shared_secret;

//get the RAW FORMAT md5 hash
//corresponds to the output of MD5CryptoServiceProvider::ComputeHash
$str = md5($initial_token, true);
$len = strlen($str);
$hex = array();
for($i = 0; $i < $len; $i++) {
    //convert the byte to a hex string representation (left padded with zeros)
    $hex[] = str_pad(dechex(ord($str[$i])), 2, '0', STR_PAD_LEFT);
}
//dump output
echo implode("-",$hex);

//outputs fe-0d-58-fd-5f-3d-83-fe-0f-6a-02-b4-94-0c-aa-7b
0 голосов
/ 03 февраля 2010

Это то, что я вижу, за исключением того, что то, что выводится, не будет вводить тире. Их нужно вводить другим способом.

var $dateSince = "2010-02-01"; 
var $siteID = "bash.org"; 
var $sharedSecret = "12345"; // the same combination on my luggage! 

var $full_string = $dateSince . $siteID . $sharedSecret;

string result = md5($full_string);
...