我正在尝试将这段代码从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)));
答案 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 newpwd
和newchal
并将其转换为十六进制字符串,我不会将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();
}