XOR Encryption 异或加密
---------------------------------------------------
关于异或:
a,b不相同, 结果为1.
a,b相同, 结果为0.
即: 0^0=0, 1^0=1, 0^1=1, 1^1=0
异或运算符的特点是: 与同一个数异或两次仍为原值, 利用异或的这种特性, 可以实现无临时变量的值交换
a = a^b
b = a^b
a = a^b
-----------------------------------------------------------------------
异或加密, 字符串S, 秘钥K, 伪代码如下
WHILE (S[i] != END)
S[i] = S[i] ^ K[i % len(K)]
i++
END
可以看出异或加密是一种很简单的加密算法, 对每个字符和对应的秘钥字符进行异或运算即可。
根据异或的特性, 与同一个数异或两次仍为原值, 所以加密两次等于解密。因为加密后的长度
数据与原值长度一致,所以可以在网络传输时使用。但因为算法简单,所以破解起来也很容易。
比起加密更像是一种编码。
-------------------------------------------------------------
参考链接:
https://www.programmingalgorithms.com/algorithm/xor-encryption/c/
https://www.cnblogs.com/albertblues/p/5670528.html
https://www.cnblogs.com/shundong106/p/10213113.html
1 char *xor_encryp (const char *s, size_t sl, const char *k, size_t kl) { 2 size_t i = 0; 3 char *d = NULL; 4 5 if (!s || !k || sl == 0 || kl == 0) 6 return NULL; 7 8 d = (char *)malloc(sl + 1); 9 if (!d) 10 return NULL; 11 12 for (i = 0; i < sl; i++) { 13 d[i] = s[i] ^ k[i % kl]; 14 } 15 d[i] = 0; 16 return d; 17 } 18 19 int main (int argc, char *argv[]) { 20 const char *s = "The quick brown fox jumps over the lazy dog."; 21 const char *key = "secret"; 22 size_t sl = strlen(s), kl = strlen(key); 23 char *en = NULL, *de = NULL; 24 25 en = xor_encryp(s, sl, key, kl); 26 de = xor_encryp(en, sl, key, kl); 27 28 printf("%s\n", en); 29 printf("%s\n", de); 30 31 free(en); 32 free(de); 33 return 1; 34 }