2017-02-12 1 views
0

Ich versuche, den folgenden C# -Code in PHP zu konvertieren, aber ich weiß nicht, welche pack() - Argumente zu verwenden.Konvertieren von Binärpacking C# -Code zu PHP

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

Edit - Ich habe daran gearbeitet, was ich bis jetzt zu arbeiten scheint.

$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]; 
} 

Antwort

8

Ich bin nicht sicher, was Sie versuchen es zu tun, aber wenn Sie die Daten zu verschlüsseln versuchen, sollten Sie loswerden, dass (zumindest schwach) xor Schleife bekommen und einige starke verwenden cipher encryption algorithms. Abgesehen davon kann die for-Schleife, die Sie haben, Arrayindexfehler verursachen, wenn die Daten nicht die Länge von multiply-4 haben.

Wenn Sie noch dieses Stück Code zu PHP konvertieren, dann ist hier, wie Sie es tun können:

C# -Code und führen

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 

PHP-Code und führen

$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 
+0

Vielen Dank! – Pierre