Портирую код с .NET в PHP исходный вариант - Код (Text): using System; using System.Collections; namespace Test { internal class Program { unsafe static void p3_hash(byte[] pin, byte[] seed, byte[] hash) { uint n = 0xc541a9, m = 0x1212050; ulong k; byte* in_ = (byte*)&k; in_[0] = seed[0]; in_[1] = seed[1]; in_[2] = seed[2]; in_[3] = pin[0]; in_[4] = pin[1]; in_[5] = pin[2]; in_[6] = pin[3]; in_[7] = pin[4]; for (int i = 0; i < 64; i++, n >>= 1, k >>= 1) { if (((n ^ k) & 0x1) != 0) { n ^= m; } } int[] out_ = new int[8]; BitArray bits = new BitArray(new int[] { (int)n }); for (int i = 0; i < 7; i++) { for (int j = 0; j < 4; j++) { if (bits[4 * i + j]) { out_[i] |= 1 << j; } } } hash[0] = (byte)(0x10 * out_[2] + out_[1]); hash[1] = (byte)(0x10 * out_[3] + out_[5]); hash[2] = (byte)(0x10 * out_[0] + out_[4]); } unsafe static void Main(string[] args) { byte[] seed = { 0x07, 0x35, 0xC3 }; byte[] key = new byte[3]; byte[] pin = { 0x03, 0x18, 0x40, 0x21, 0x7B }; p3_hash(pin, seed, key); Console.WriteLine($"SEED: {seed[0].ToString("X2")} {seed[1].ToString("X2")} {seed[2].ToString("X2")}, KEY: {key[0].ToString("X2")} {key[1].ToString("X2")} {key[2].ToString("X2")}"); } } } Что выходит у меня - Код (PHP): <?php function p3_hash($pin, $seed, &$key) { $n = 0xc541a9; $m = 0x1212050; $k = 0; $in_ = unpack('C*', pack('J', $k)); $in_[1] = $seed[0]; $in_[2] = $seed[1]; $in_[3] = $seed[2]; $in_[4] = $pin[0]; $in_[5] = $pin[1]; $in_[6] = $pin[2]; $in_[7] = $pin[3]; $in_[8] = $pin[4]; for ($i = 0; $i < 64; $i++, $n >>= 1, $k >>= 1) { if ((($n ^ $k) & 0x1) != 0) { $n ^= $m; } } $out_ = [0, 0, 0, 0, 0, 0, 0, 0]; for ($i = 0; $i < 7; $i++) { for ($j = 0; $j < 4; $j++) { if (($n & 1) != 0) { $out_[$i] |= 1 << $j; } $n >>= 1; } } $key[0] = (0x10 * $out_[2] + $out_[1]) & 0xFF; $key[1] = (0x10 * $out_[3] + $out_[5]) & 0xFF; $key[2] = (0x10 * $out_[0] + $out_[4]) & 0xFF; } $seed = [0x07, 0x35, 0xC3]; $key = [0, 0, 0]; $pin = [0x03, 0x18, 0x40, 0x21, 0x7B]; p3_hash($pin, $seed, $key); echo "SEED: " . sprintf("%02X", $seed[0]) . " " . sprintf("%02X", $seed[1]) . " " . sprintf("%02X", $seed[2]) . ", KEY: " . sprintf("%02X", $key[0]) . " " . sprintf("%02X", $key[1]) . " " . sprintf("%02X", $key[2]); ?> Вывод исходного - SEED: 07 35 C3, KEY: 10 E7 94 Вывод на PHP - SEED: 07 35 C3, KEY: 29 3F 78 Что я делаю не так? Как исправить?