将PHP加密代码转换为C#

时间:2009-11-13 02:30:34

标签: c# .net php encryption

我正在尝试将这段代码从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 个答案:

答案 0 :(得分:2)

爱德华多,

如果您查看pack手册,pack用于将(十六进制,八进制,二进制)中的字符串转换为其数字表示。

所以

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

会将像'cca86bc64ec5889345c4c3d8dfc7ade9'这样的字符串转换为实际的0xcca ... de9

如果$ uamsecret存在,那么hexchal的MD5与uamsecret一起做同样的事情。     if($ uamsecret){         $ newchal = pack(“H *”,md5($ hexchal。$ uamsecret));       } else {         $ newchal = $ hexchal;       }

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

MD%'\ 0'+ $ password + $ newchal

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

password填充为32字节

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

执行xor newpwdnewchal并将其转换为十六进制字符串,我不会将implode()转换为字符串转换为字符数组。

答案 1 :(得分:1)

我还在c#中遇到了php的pack-unpack函数的需要,但没有获得任何好的资源。

所以我想自己做。我已经通过onlinephpfunctions.com上的pack / unpack / md5方法验证了函数的输入。因为我只根据我的要求完成了代码。这可以扩展到其他格式

<强>包

    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();
    }