// How to implement? // Oh, yes, here you are: // public byte[] Encrypt(byte[] uncryptedSignature, uint msSinceStart) { var rnd = new Rand(msSinceStart); object[] key = TwoFish.MakeKey(KEY); var xor_byte = new byte[TwoFish.BLOCK_SIZE]; for (int i = 0; i < TwoFish.BLOCK_SIZE; ++i) { xor_byte[i] = (byte)rnd.Next(); } int block_count = (uncryptedSignature.Length + 256) / 256; int output_size = 4 + (block_count * 256) + 1; var output = new byte[output_size]; output[0] = (byte)(msSinceStart >> 24); output[1] = (byte)(msSinceStart >> 16); output[2] = (byte)(msSinceStart >> 8); output[3] = (byte)msSinceStart; Array.Copy(uncryptedSignature, 0, output, 4, uncryptedSignature.Length); output[output_size - 2] = (byte)(256 - uncryptedSignature.Length % 256); for (int offset = 0; offset < block_count * 256; offset += TwoFish.BLOCK_SIZE) { for (int i = 0; i < TwoFish.BLOCK_SIZE; i++) { output[4 + offset + i] ^= xor_byte[i]; } byte[] block = TwoFish.blockEncrypt(output, offset + 4, key); Array.Copy(block, 0, output, offset + 4, block.Length); Array.Copy(output, 4 + offset, xor_byte, 0, TwoFish.BLOCK_SIZE); } // ------------------------------------- NEW CODE START HERE GUYS // Integrity byte is 0x23 since 05/01/2017. output[output_size - 1] = 0x23; // This new "on top" encryption is there since 05/01/2017. encrypt_cipher(output, output_size); return(output); }
/** * Encrypts the given signature * * @param input input data * @param msSinceStart time since start * @return encrypted signature */ public byte[] Encrypt(byte[] input, uint msSinceStart) { try { object[] key = TwoFish.MakeKey(KEY); var rand = new Rand(msSinceStart); var iv = MakeIv(rand); var blockCount = (input.Length + 256) / 256; var outputSize = (blockCount * 256) + 5; var output = new byte[outputSize]; output[0] = (byte)(msSinceStart >> 24); output[1] = (byte)(msSinceStart >> 16); output[2] = (byte)(msSinceStart >> 8); output[3] = (byte)msSinceStart; Array.Copy(input, 0, output, 4, input.Length); output[outputSize - 2] = (byte)(256 - input.Length % 256); for (int offset = 0; offset < blockCount * 256; offset += TwoFish.BLOCK_SIZE) { for (int i = 0; i < TwoFish.BLOCK_SIZE; i++) { output[4 + offset + i] ^= iv[i]; } byte[] block = TwoFish.blockEncrypt(output, offset + 4, key); Array.Copy(block, 0, output, offset + 4, block.Length); Array.Copy(output, 4 + offset, iv, 0, TwoFish.BLOCK_SIZE); } output[outputSize - 1] = MakeIntegrityByte(rand); return(output); } catch (Exception) { return(null); } }