public static byte[] Decrypt(string path) { int[] filedata = null; using (var stream = File.Open(path, FileMode.Open)) { filedata = new int[stream.Length / 4]; using (var reader = new BinaryReader(stream)) { int size = (int)stream.Length; int words = size >> 2; int xorval = 0; stream.Seek(0x1C, SeekOrigin.Begin); int SEED = reader.ReadInt32().Reverse(); _rand = new RandomXS(SEED); stream.Seek(0, SeekOrigin.Begin); if (size % 8 == 0) { goto Dword_loop; } else if (size == 0) { return(null); } else if (size / 8 <= 0) { goto BYTE_loop; } #pragma warning disable CS0642 // Возможно, ошибочный пустой оператор else { ; //goto default_loop } #pragma warning restore CS0642 // Возможно, ошибочный пустой оператор #region DWORD Loop Dword_loop: if (words == 0) { goto loops_end; } else if (words / 8 <= 0) { goto Word_Loop; } else { for (int i = 0; i < words >> 3; i++) { for (int x = 0; x < 8; x++) { var randInt = _rand.GetInt(); var XOR = reader.ReadInt32().Reverse() ^ randInt; var val = XOR ^ xorval; xorval = (randInt << 13) & unchecked ((int)0x80000000); filedata[x + (i * 8)] = val.Reverse(); } } } #endregion #region Word Loop Word_Loop: if ((words & 7) <= 0) { goto loops_end; } int offset = (size >> 2 >> 3 << 3 << 2); stream.Seek(offset, SeekOrigin.Begin); for (int i = 0; i < (words & 7); i++) { var randInt = _rand.GetInt(); var XOR = reader.ReadInt32().Reverse() ^ randInt; var val = XOR ^ xorval; xorval = (randInt << 13) & unchecked ((int)0x80000000); filedata[offset / 4 + i] = val.Reverse(); } goto loops_end; #endregion #region BYTE Loop BYTE_loop: if ((size & 7) == 0) { goto func_end; } stream.Seek(4, SeekOrigin.Begin); for (int i = 4; i < (size & 7); i++) { byte[] data = BitConverter.GetBytes(filedata[i.RoundDown(4)]); var b = reader.ReadByte(); var shifted = (b >> 3) | (b << 32 - 3); var val = b ^ shifted; data[i] = (byte)val; } #endregion loops_end: filedata[7] = SEED.Reverse(); } } func_end: byte[] result = new byte[filedata.Length * sizeof(int)]; Buffer.BlockCopy(filedata, 0, result, 0, result.Length); return(result); }
private byte[] Decrypt(FileData d) { int[] filedata = null; filedata = new int[d.size() / 4]; int size = (int)d.size(); int words = size >> 2; int xorval = 0; d.seek(0x1C); d.Endian = Endianness.Big; int SEED = d.readInt(); RandomXS _rand = new RandomXS(SEED); d.Endian = Endianness.Big; d.seek(0); if (size % 8 == 0) { goto Dword_loop; } else if (size == 0) { return(null); } else if (size / 8 <= 0) { goto BYTE_loop; } else { ;//goto default_loop } #region DWORD Loop Dword_loop: if (words == 0) { goto loops_end; } else if (words / 8 <= 0) { goto Word_Loop; } else { for (int i = 0; i < (words >> 3); i++) { for (int x = 0; x < 8; x++) { var randInt = _rand.GetInt(); var XOR = d.readInt() ^ randInt; var val = XOR ^ xorval; xorval = (randInt << 13) & unchecked ((int)0x80000000); filedata[x + (i * 8)] = val.Reverse(); } } } #endregion #region Word Loop Word_Loop: if ((words & 7) <= 0) { goto loops_end; } int offset = (size >> 2 >> 3 << 3 << 2); d.seek(offset); for (int i = 0; i < (words & 7); i++) { var randInt = _rand.GetInt(); var XOR = d.readInt() ^ randInt; var val = XOR ^ xorval; xorval = (randInt << 13) & unchecked ((int)0x80000000); filedata[offset / 4 + i] = val.Reverse(); } goto loops_end; #endregion #region BYTE Loop BYTE_loop: if ((size & 7) == 0) { goto func_end; } d.seek(4); for (int i = 4; i < (size & 7); i++) { byte[] data = BitConverter.GetBytes(filedata[i.RoundDown(4)]); var b = d.readByte(); var shifted = (b >> 3) | (b << 32 - 3); var val = b ^ shifted; data[i] = (byte)val; } #endregion loops_end: filedata[7] = SEED.Reverse(); func_end: byte[] result = new byte[filedata.Length * sizeof(int)]; Buffer.BlockCopy(filedata, 0, result, 0, result.Length); return(result); }