最近在看密码学的书籍,对二进制运算提起了兴趣,今晚总结了一下感觉别有所获.
A,B两个数进行位运算,情况如下:
A
B | 0 | 1 | ||||||
或 | 与 | 异或 | 或 | 与 | 异或 | |||
0 | 0 | 0 | 0 | 1 | 0 | 1 | ||
1 | 1 | 0 | 1 | 1 | 1 | 0 |
由上表总结一下两个比特流AB二进制运算的规律:
A|B,B比特位为1的位置对应的A处比特用1代替,其余比特不变;
A&B,B比特位为0的位置对应A处比特用0代替,其余比特不变;
A^B,B比特位为1的位置对应A处比特取反,其余比特不变;
显然AB交换顺序不影响运算结果,但三种运算之间顺序不能交换.
如果把AB之间的运算看作数据的加密,那么或和与操作都损失了一部分信息,是不可恢复的(因为原文A中一些比特被覆盖了).而且”与”和”或”丢失的那部分信息正好可以互补,也就是
A|B+A&B-B=A
这可以用来设计加密算法,计算A|B+A&B的值作为密文C,而B作为密钥K,解密时用C-K即可获得明文A.由于B是随机的,所以算法也是安全的.异或则是可逆的,所以最常用来加密信息.因为异或只是反转了明文中的某些比特位而已,要想恢复A则只需异或两次即可
A^B^B=A
A^0=A
A^0xFF=~A(假设A为单字节)
另外偶数个1异或为0,奇数个1异或为1,0比特对异或运算是透明的