2017-02-12 5 views
0

次のC#コードをPHPに変換しようとしていますが、使用するpack()引数がわかりません。バイナリパッキングC#コードを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(); 

編集 - これまで作業していたものは、これまでのところ動作しています。

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

答えて

8

私はあなたがそこに何をしようとしてわからないんだけど、あなたが任意のデータを暗号化しようとしている場合、あなたはその(少なくとも弱)XORループを取り除くと、いくつかの強力なを使用して取得する必要がありますcipher encryption algorithms。これに加えて、あなたが持っているforループは、データの長さが4の倍数でない場合、配列のインデックス付けエラーを引き起こす可能性があります。

あなたはまだそれから、ここであなたがそれを行うことができますどのように、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 

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

ありがとうございました! – Pierre

関連する問題