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); }