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); } }
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); } }
public static void Encrypt(Stream source, Stream target, byte[] key, Bemani2DXEncryptionType type) { }
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); }
static public void Encrypt(Stream source, Stream target, byte[] key, Bemani2DXEncryptionType type) { }