我试图将以下c#代码转换为PHP,但我不知道要使用哪个pack()参数.
var xorkey = BitConverter.ToUInt32(filedata, 0) >> 8;
xorkey *= 0x8083;
for (var i = 8; i < filedata.Length; i += 0x4)
{
BitConverter.GetBytes(BitConverter.ToUInt32(filedata, i) ^ xorkey).CopyTo(filedata, i);
xorkey ^= BitConverter.ToUInt32(filedata, i);
}
filedata = filedata.Skip(4).ToArray();
Run Code Online (Sandbox Code Playgroud)
编辑 - 一直在努力,我到目前为止似乎工作.
$xorkey = unpack("L", $filedata)[1] >> 8;
$xorkey *= 32899; // 32899 == 0x8083
for ($i = 8; $i < strlen($filedata); $i += 4) {
$bytes = unpack("L", substr($filedata, $i))[1] ^ $xorkey;
// left to do: BitConverter.GetBytes($bytes).CopyTo(filedata, i);
// this doesn't work: $xorkey ^= unpack("L", substr($filedata, $i))[1];
}
Run Code Online (Sandbox Code Playgroud)
我不确定你在那里做什么,但是如果你试图加密任何数据,你应该摆脱那个(至少是弱的)xor循环并使用一些强大的密码加密算法.除此之外,如果数据不是乘法4长度,那么你所拥有的for循环可能会导致数组索引错误.
如果你仍然希望将这段代码转换为PHP,那么在这里你可以这样做:
C#代码和结果
byte[] filedata = new byte[] { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88 };
var xorkey = BitConverter.ToUInt32(filedata, 0) >> 8;
//xorkey *= 0x8083;
/* It's important to convert the result to UInt32,
* because the multiplication of a 32bit integer with an other big integer,
* may result in a 64bit integer
*/
xorkey = Convert.ToUInt32(xorkey * 0x8083);
//Console.WriteLine("xorkey == {0}", xorkey); // xorkey == 4473666
for (var i = 8; i < filedata.Length; i += 0x4)
{
BitConverter.GetBytes(BitConverter.ToUInt32(filedata, i) ^ xorkey).CopyTo(filedata, i);
xorkey ^= BitConverter.ToUInt32(filedata, i);
}
filedata = filedata.Skip(4).ToArray();
// Result filedata will contain the following data
// 45 46 47 48 8f 20 c4 8 4 4 4 1c 1c 1c 1c 4 4 4 4 c
Run Code Online (Sandbox Code Playgroud)
PHP代码和结果
$filedata = pack('C*', 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88);
$xorkey = unpack("L", $filedata)[1] >> 8;
$xorkey = (int)($xorkey * 0x8083);
// echo '$xorkey == '.$xorkey.PHP_EOL; // $xorkey == 4473666
for ($i = 8; $i < strlen($filedata); $i += 4) {
$n = unpack("L", substr($filedata, $i, 4))[1];
$filedata = substr_replace($filedata, pack('L', $n ^ $xorkey), $i, 4);
$xorkey ^= unpack("L", substr($filedata, $i, 4))[1];
}
$filedata = substr($filedata, 4);
// Result $filedata will contain the following data
//45 46 47 48 8f 20 c4 8 4 4 4 1c 1c 1c 1c 4 4 4 4 c
Run Code Online (Sandbox Code Playgroud)