Конвертировать код шифрования PHP в C # - PullRequest
1 голос
/ 13 ноября 2009

Я пытаюсь преобразовать этот кусок кода из PHP в C #. Это часть портала пленников. Может ли кто-нибудь объяснить, что он делает?

  $hexchal = pack ("H32", $challenge);
  if ($uamsecret) {
    $newchal = pack ("H*", md5($hexchal . $uamsecret));
  } else {
    $newchal = $hexchal;
  }
  $response = md5("\0" . $password . $newchal);
  $newpwd = pack("a32", $password);
  $pappassword = implode ("", unpack("H32", ($newpwd ^ $newchal)));

Ответы [ 2 ]

2 голосов
/ 13 ноября 2009

Эдуардо,

Если вы посмотрите на руководство pack , pack используется для преобразования строки в (шестнадцатеричной, восьмеричной, двоичной) в его числовое представление.

так

$hexcal = pack('H32', $challenge);

конвертирует строку типа 'cca86bc64ec5889345c4c3d8dfc7ade9' в фактическую 0xcca ... de9

если существует $ uamsecret, то же самое проделайте с MD5 из hexchal, сопряженным с uamsecret. if ($ uamsecret) { $ newchal = pack ("H *", md5 ($ hexchal. $ uamsecret)); } еще { $ newchal = $ hexchal; }

$response = md5("\0" . $password . $newchal);

MD% '\ 0' + $ пароль + $ newchal

$newpwd = pack("a32", $password);

pad password до 32 байт

  $pappassword = implode ("", unpack("H32", ($newpwd ^ $newchal)));

сделать xor newpwd и newchal и преобразовать его в шестнадцатеричную строку, я не получаю implode(), может быть, это преобразовать в строку в массив символов.

1 голос
/ 29 апреля 2015

Я также столкнулся с необходимостью функций php для упаковки и распаковки в c #, но не получил ни одного хорошего ресурса.

Так что я подумал сделать это сам. Я проверил ввод функции с помощью методов pack / unpack / md5, которые можно найти на сайте onlinephpfunctions.com. Так как я сделал код только в соответствии с моими требованиями. Это может быть расширено для других форматов

пакет

    private static string pack(string input)
    {
        //only for H32 & H*
        return Encoding.Default.GetString(FromHex(input));
    }
    public static byte[] FromHex(string hex)
    {
        hex = hex.Replace("-", "");
        byte[] raw = new byte[hex.Length / 2];
        for (int i = 0; i < raw.Length; i++)
        {
            raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
        }
        return raw;
    }

MD5

    private static string md5(string input)
    {
        byte[] asciiBytes = Encoding.Default.GetBytes(input);
        byte[] hashedBytes = MD5CryptoServiceProvider.Create().ComputeHash(asciiBytes);
        string hashedString = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
        return hashedString;
    }

Распаковка

    private static string unpack(string p1, string input)
    {
        StringBuilder output = new StringBuilder();

        for (int i = 0; i < input.Length; i++)
        {
            string a = Convert.ToInt32(input[i]).ToString("X");
            output.Append(a);
        }

        return output.ToString();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...