/** * Encrypts the given signature * * @param input input data * @param msSinceStart time since start * @return encrypted signature */ public static byte[] Encrypt(byte[] uncryptedSignature, uint msSinceStart) { try { Rand rand = 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)rand.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); } output[output_size - 1] = 0x23; Encrypt_cipher(output, output_size); return(output); } catch (Exception) { return(null); } }
/** * Encrypts the given signature * * @param input input data * @param msSinceStart time since start * @return encrypted signature */ public static byte[] Encrypt(byte[] input, uint msSinceStart) { try { object[] key = TwoFish.MakeKey(KEY); Rand rand = new Rand(msSinceStart); byte[] iv = MakeIv(rand); int blockCount = (input.Length + 256) / 256; int outputSize = (blockCount * 256) + 5; byte[] 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); } }