本文包括如下几个内容:
异或是数字逻辑中的基本概念,也是每种编程语言都支持的基本运算。基本原理就是,对于数字1和0有如下的运算公式:
1 ^ 1 = 0 0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1
更常见的是字节一级或整数的异或运算,可以参考相应的编程语言的相关介绍。
异或加密是最简单的一种加密方法,简单来讲,假定有一串码流A,然后可以用key进行加密,把加密后的数据保存或发送出去。而在读取加密数据之后,再用key进行解密。
直接用代码更容易理解,如下示例:
#include <stdio.h> #include <stdlib.h> static void xor_encrypt(char *data, char *key, int len) { int i = 0; for (i = 0; i < len; i++) { data[i] ^= key[i]; } } static void dumphex(const unsigned char *data, int len) { int i; for (i = 0; i < len; i++) { printf("%02X", data[i]); } printf("\n"); } static unsigned char* get_random_key(int len) { int i = 0; unsigned char* buffer = (unsigned char*)malloc(len); for (i = 0; i < len; i++) { buffer[i] = rand() % 10 + '0'; } return buffer; } int main() { unsigned char data[] = "hello, xor!"; int len = sizeof(data); unsigned char *key; key = get_random_key(len); printf("original data: %s\n", data); printf("original data (hex): "); dumphex(data, len); xor_encrypt(data, key, len); printf("encrypted data: %s\n", data); printf("encrypted data (hex): "); dumphex(data, len); xor_encrypt(data, key, len); printf("original data: %s\n", data); printf("original data (hex): "); dumphex(data, len); free(key); return 0; }
运行结果:
original data: hello, xor! original data (hex): 68656C6C6F2C20786F722100 encrypted data: [S[Y\JVC7 encrypted data (hex): 5B535B595C19164A56431337 original data: hello, xor! original data (hex): 68656C6C6F2C20786F722100
有些TX在面试的时候,可能会遇到这个问题,即:
有两个整数a和b,如何在不引入第三个变量的情况下,交换两个整数的值?
#include <stdio.h> void swap(int &x, int &y) { x ^= y; y ^= x; x ^= y; } int main() { int x = 55555; int y = 33333; printf("first, x = %d, y = %d\n", x, y); swap(x, y); printf("and now, x = %d, y = %d\n", x, y); return 0; }
flying-bird@flying-bird:~/docs/The_Road_to_Cpp/src$ g++ swap_ints.cc flying-bird@flying-bird:~/docs/The_Road_to_Cpp/src$ ./a.out first, x = 55555, y = 33333 and now, x = 33333, y = 55555 flying-bird@flying-bird:~/docs/The_Road_to_Cpp/src$
前面谈到异或加密的时候,提到的密钥key。如果是远程通信,发送方是把加密后的数据发出去的,那么接收方势必要用原始的密钥key才能解密。那么接收方如何才能拿到这个密钥呢?有关这方面,可以参考《Core Java》卷二关于加密一章的讨论。——老外的书总是深入浅出,通过一个个例子&故事,引出一系列高深的专题。推荐TXs能够好好阅读几遍。
这里再给出一种简单的数据&密钥发送发生,也是很多项目采用的方法。即:
当然了,可能这个也比较简单。那么可以在此基础上进一步引入其他的算法,比如:
维基百科的异或加密介绍:http://zh.wikipedia.org/wiki/%E5%BC%82%E6%88%96%E5%8A%A0%E5%AF%86
原文地址:http://blog.csdn.net/a_flying_bird/article/details/38443945