Ejemplo n.º 1
0
        protected static byte[] NoxCrypt(byte[] data, NoxCryptFormat format, NoxCryptMode mode)
        {
            int tableOffset;
            uint part1, part2;
            uint[] table;
            byte[] output = new byte[data.Length];

            switch (format)
            {
                case NoxCryptFormat.PLR:
                    table = plr_table;
                    break;
                case NoxCryptFormat.MAP:
                    table = map_table;
                    break;
                case NoxCryptFormat.THING:
                    table = thing_table;
                    break;
                case NoxCryptFormat.MODIFIER:
                    table = modifier_table;
                    break;
                case NoxCryptFormat.GAMEDATA:
                    table = gamedata_table;
                    break;
                case NoxCryptFormat.MONSTER:
                    table = monster_table;
                    break;
                case NoxCryptFormat.SOUNDSET:
                    table = soundset_table;
                    break;
                default:
                    throw new ApplicationException("NoxCrypt: Unsupported format.");
            }

            if (mode == NoxCryptMode.ENCRYPT)
                tableOffset = 0x400;
            else if (mode == NoxCryptMode.DECRYPT)
                tableOffset = 0x418;
            else
                throw new ApplicationException("NoxCrypt: Invalid mode.");

            if (data.Length % 8 != 0)
                throw new ApplicationException("NoxCrypt: Data length must be divisible by 8.");

            for (int dataNdx = 0; dataNdx < data.Length; dataNdx += 8)
            {
                int offset = tableOffset;
                part1 = ((uint) data[dataNdx+0] << 24) | ((uint) data[dataNdx+1] << 16) | ((uint) data[dataNdx+2] << 8) | (uint) data[dataNdx+3];
                part2 = ((uint) data[dataNdx+4] << 24) | ((uint) data[dataNdx+5] << 16) | ((uint) data[dataNdx+6] << 8) | (uint) data[dataNdx+7];

                for (int i = 0; i < 8; i++)
                {
                    uint sum = 0;
                    part1 ^= table[offset++];
                    sum += table[0x000+((part1 >> 24)&0xFF)];
                    sum += table[0x100+((part1 >> 16)&0xFF)];
                    sum ^= table[0x200+((part1 >>  8)&0xFF)];
                    sum += table[0x300+((part1 >>  0)&0xFF)];

                    sum ^= table[offset++];
                    part2 ^= sum;

                    sum = 0;
                    sum += table[0x000+((part2 >> 24)&0xFF)];
                    sum += table[0x100+((part2 >> 16)&0xFF)];
                    sum ^= table[0x200+((part2 >>  8)&0xFF)];
                    sum += table[0x300+((part2 >>  0)&0xFF)];
                    part1 ^= sum;
                }

                part1 ^= table[offset++];
                part2 ^= table[offset];

                output[dataNdx+0] = (byte) ((part2 >> 24) & 0xFF);
                output[dataNdx+1] = (byte) ((part2 >> 16) & 0xFF);
                output[dataNdx+2] = (byte) ((part2 >> 8) & 0xFF);
                output[dataNdx+3] = (byte) ((part2 >> 0) & 0xFF);
                output[dataNdx+4] = (byte) ((part1 >> 24) & 0xFF);
                output[dataNdx+5] = (byte) ((part1 >> 16) & 0xFF);
                output[dataNdx+6] = (byte) ((part1 >> 8) & 0xFF);
                output[dataNdx+7] = (byte) ((part1 >> 0) & 0xFF);
            }

            return output;
        }
Ejemplo n.º 2
0
 public static byte[] NoxEncrypt(byte[] data, NoxCryptFormat format)
 {
     return NoxCrypt(data, format, NoxCryptMode.ENCRYPT);
 }