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);
        }
Пример #2
0
        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);
        }