private void Encrypt(byte[] data)
        {
            BootLoaderCryptoAlgorithm algorithm = new BootLoaderCryptoAlgorithm();

            algorithm.Obfuscate(data);

            // Encrypt one block at a time
            byte[] block = new byte[BootLoaderCryptoAlgorithm.EncryptedBlockSize];
            for (int i = 0; i < BlockCount; i++)
            {
                Array.Copy(data, i * BootLoaderCryptoAlgorithm.DecryptedBlockSize, block, 0, BootLoaderCryptoAlgorithm.DecryptedBlockSize);
                block[50] = 0x15;

                byte[] encryptedBlock = algorithm.Encrypt(block);
                Array.Copy(encryptedBlock, 0, encryptedData, i * BootLoaderCryptoAlgorithm.EncryptedBlockSize, encryptedBlock.Length);
            }
        }
        public byte[] Decrypt()
        {
            // Allocate memory for decrypted data
            byte[] decryptedData = new byte[BlockCount * BootLoaderCryptoAlgorithm.DecryptedBlockSize];
            BootLoaderCryptoAlgorithm algorithm = new BootLoaderCryptoAlgorithm();
            int offset = 0;

            // Decryption one block at a time
            foreach (byte[] encryptedBlock in Blocks)
            {
                byte[] decryptedBlock = algorithm.Decrypt(encryptedBlock);

                // Copy everything except last fixed byte (0x15)
                Array.Copy(decryptedBlock, 0, decryptedData, offset, decryptedBlock.Length - 1);
                offset += BootLoaderCryptoAlgorithm.DecryptedBlockSize;
            }

            // Deobfuscate all blocks in one go
            algorithm.Deobfuscate(decryptedData);

            return(decryptedData);
        }