Я пытаюсь понять это, чтобы я мог сделать что-то подобное. Я знаю:
buf содержит ключ аутентификации с добавленным к нему хэшем (последние 20 байтов).
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 байт buf. Затем мы по байту за раз сравниваем только что созданный хэш с хэшем, добавленным к последним 20 байтам buf.
Итак, в 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), они не совпадают, поэтому я даже не стал сравнивать их в коде.