Что не хватает в моем преобразовании кода C # в PHP? - PullRequest
0 голосов
/ 03 марта 2009

Я пытаюсь понять это, чтобы сделать что-то подобное. Я знаю:

buf содержит ключ аутентификации с добавленным к нему хешем (последние 20 байтов) HashData, который ищется в MachineKeySection, это SHA1

length -= 20;
byte[] buffer2 = MachineKeySection.HashData(buf, null, 0, length);

for (int i = 0; i < 20; i++)
{
    if (buffer2[i] != buf[length + i])
    {
        return null;
    }
}

Вот что я думаю: Мы хэшируем все, кроме последних 20 байтов буфера. Затем мы по одному байту за раз сравниваем только что созданный хеш с хешем, который добавляется к последним 20 байтам буфера.

Так что в PHP я пытаюсь это:

//get the length of the ticket -20 bytes
$ticketLn = strlen($buf)-40;
//grab all but the last 20 bytes
$ticket = substr($decrypthex, 0, $ticketLn);
//create a hash of the ticket
$hash = substr($decrypthex, $ticketLn);

И следующим шагом будет сравнение. Но когда я отображаю выходные данные $ hash и sha1 ($ ticket), они не совпадают, поэтому я даже не стал сравнивать их в коде.

Ответы [ 2 ]

2 голосов
/ 03 марта 2009

По умолчанию функция php sha1 () возвращает шестнадцатеричное число из 40 символов. Вы должны явно запросить 20-байтовый двоичный формат, если вы этого хотите

$hash = sha1( $ticket, true );
1 голос
/ 03 марта 2009
$ticket = substr($decrypthex, 0, -20);
$hash = substr($decrypthex, -20);
...