예제 #1
0
        static public void Decrypt(Stream source, Stream target, byte[] key, Bemani2DXEncryptionType type)
        {
            BinaryReader reader = new BinaryReader(source);
            BinaryWriter writer = new BinaryWriter(target);

            byte[] lastBlock    = { 0, 0, 0, 0, 0, 0, 0, 0 };
            byte[] currentBlock = { 0, 0, 0, 0, 0, 0, 0, 0 };

            while (source.Position < source.Length)
            {
                byte[] block = reader.ReadBytes(8);
                Array.Copy(block, currentBlock, 8);

                // xor with key 0
                for (int i = 0; i < 8; i++)
                {
                    block[i] ^= key[i];
                }

                // manipulation
                DecryptCycle(block);

                // swap first half with second half
                for (int i = 0; i < 4; i++)
                {
                    byte swap = block[i];
                    block[i]     = block[i + 4];
                    block[i + 4] = swap;
                }

                if (type == Bemani2DXEncryptionType.Standard)
                {
                    // xor with key 1
                    for (int i = 0; i < 8; i++)
                    {
                        block[i] ^= key[8 + i];
                    }

                    // manipulation
                    DecryptCycle(block);

                    // xor with key 2
                    for (int i = 0; i < 8; i++)
                    {
                        block[i] ^= key[16 + i];
                    }
                }

                // xor with previous state
                for (int i = 0; i < 8; i++)
                {
                    block[i] ^= lastBlock[i];
                }

                // output
                writer.Write(block);
                Array.Copy(currentBlock, lastBlock, 8);
            }
        }
예제 #2
0
        public static void Decrypt(Stream source, Stream target, byte[] key, Bemani2DXEncryptionType type)
        {
            BinaryReader reader = new BinaryReader(source);
            BinaryWriter writer = new BinaryWriter(target);

            byte[] lastBlock = {0, 0, 0, 0, 0, 0, 0, 0 };
            byte[] currentBlock = { 0, 0, 0, 0, 0, 0, 0, 0 };

            while (source.Position < source.Length)
            {
                byte[] block = reader.ReadBytes(8);
                Array.Copy(block, currentBlock, 8);

                // xor with key 0
                for (int i = 0; i < 8; i++)
                    block[i] ^= key[i];

                // manipulation
                DecryptCycle(block);

                // swap first half with second half
                for (int i = 0; i < 4; i++)
                {
                    byte swap = block[i];
                    block[i] = block[i + 4];
                    block[i + 4] = swap;
                }

                if (type == Bemani2DXEncryptionType.Standard)
                {
                    // xor with key 1
                    for (int i = 0; i < 8; i++)
                        block[i] ^= key[8 + i];

                    // manipulation
                    DecryptCycle(block);

                    // xor with key 2
                    for (int i = 0; i < 8; i++)
                        block[i] ^= key[16 + i];
                }

                // xor with previous state
                for (int i = 0; i < 8; i++)
                    block[i] ^= lastBlock[i];

                // output
                writer.Write(block);
                Array.Copy(currentBlock, lastBlock, 8);
            }
        }
예제 #3
0
 public static void Encrypt(Stream source, Stream target, byte[] key, Bemani2DXEncryptionType type)
 {
 }
예제 #4
0
        static public Bemani2DX Read(Stream source)
        {
            Bemani2DX    result = new Bemani2DX();
            BinaryReader reader = new BinaryReader(source);

            byte[] key = new byte[] { };
            Bemani2DXEncryptionType encType = Bemani2DXEncryptionType.Standard;

            string headerID = new string(reader.ReadChars(4));

            switch (headerID)
            {
            case @"%eNc":
                result.Type = Bemani2DXType.IIDX9;
                key         = Bemani2DXEncryptionKeys.IIDX9;
                encType     = Bemani2DXEncryptionType.Standard;
                break;

            case @"%e10":
                result.Type = Bemani2DXType.IIDX10;
                key         = Bemani2DXEncryptionKeys.IIDX10;
                encType     = Bemani2DXEncryptionType.Standard;
                break;

            case @"%e11":
                result.Type = Bemani2DXType.IIDX11;
                key         = Bemani2DXEncryptionKeys.IIDX11;
                encType     = Bemani2DXEncryptionType.Standard;
                break;

            case @"%e12":
                result.Type = Bemani2DXType.IIDX12;
                key         = Bemani2DXEncryptionKeys.IIDX11;
                encType     = Bemani2DXEncryptionType.Partial;
                break;

            case @"%hid":
                result.Type = Bemani2DXType.IIDXHID;
                key         = Bemani2DXEncryptionKeys.IIDX11;
                encType     = Bemani2DXEncryptionType.Partial;
                break;

            case @"%iO0":
                result.Type = Bemani2DXType.IIDX16;
                key         = Bemani2DXEncryptionKeys.IIDX16;
                encType     = Bemani2DXEncryptionType.Standard;
                break;

            default:
                result.Type      = Bemani2DXType.Unencrypted;
                source.Position -= 4;
                break;
            }

            if (result.Type != Bemani2DXType.Unencrypted)
            {
                MemoryStream decodedData    = new MemoryStream();
                int          filelength     = reader.ReadInt32();
                int          fileExtraBytes = (8 - (filelength % 8)) % 8;
                byte[]       data           = reader.ReadBytes(filelength + fileExtraBytes);
                using (MemoryStream encodedDataMem = new MemoryStream(data))
                {
                    Bemani2DXEncryption.Decrypt(encodedDataMem, decodedData, key, encType);
                }
                decodedData.Position = 0;
                reader = new BinaryReader(decodedData);
            }

            // header length is at 0x10
            // sample count is at 0x14
            // offset list starts at 0x48

            reader.BaseStream.Position = 0x10;

            int headerLength = reader.ReadInt32();
            int sampleCount  = reader.ReadInt32();

            long[] sampleOffset = new long[sampleCount];

            reader.BaseStream.Position = 0x48;

            for (int i = 0; i < sampleCount; i++)
            {
                sampleOffset[i] = reader.ReadInt32();
            }

            for (int i = 0; i < sampleCount; i++)
            {
                reader.BaseStream.Position = sampleOffset[i];
                result.sounds.Add(Bemani2DXSound.Read(reader.BaseStream));
            }

            return(result);
        }
예제 #5
0
 static public void Encrypt(Stream source, Stream target, byte[] key, Bemani2DXEncryptionType type)
 {
 }