private static unsafe void Xor(byte[] data, byte[] key) {
int i, k;
fixed (byte* bd = data, bk = key) {
ulong* ld = (ulong*)bd, lk = (ulong*)bk;
int td = data.Length / 8, tk = key.Length / 8;
for (i = 0, k = 0; i < td; i++, k++) {
ld[i] ^= lk[k == tk ? (k = 0) : k];
}
}
for (i *= 8, k *= 8; i < data.Length; i++, k++) {
if (k == key.Length) k = 0;
data[i] ^= key[k];
}
}
#else