- 异或规则
- 异或运算
- 异或与加密
异或是一种逻辑运算符。用于二进制位运算。对整形变量(如:int a=1,b=2)进行异或操作,计算机会先将a、b编码为二进制数,在进行异或操作。
int a,b = 1, 2
fmt.Printf("%b %b\n", a, b)
01 10
a,b转为二进制为01 10,进行异或运算的即01 ^ 10,而非我们变量所赋值的字面变量。a^b结果二进制结果为11,十进制结果为3,一定要区分开。
1. 运算规则
二进制位进行异或运算时:
- 0 ⊕ 0 = 0
- 0 ⊕ 1 = 1
- 1 ⊕ 0 = 1
- 1 ⊕ 1 = 0
异或运算结果:当两个输入不相同时,结果为1,否则结果为0。在计算机中使用符号^(shift+6)表示。
想象你有一枚硬币,做如下假设:
=左边的异或运算。两次投掷动作0表示不翻转,1表示翻转。
=右边的结果。两次投掷异或运算结果0表示反面,1表示正面。
带入公式中:
- 不翻转0 ⊕ 不翻转0 = 反面0
- 不翻转0 ⊕ 翻转1 = 正面1
- 翻转1 ⊕ 不翻转0 = 反面1
- 翻转1 ⊕ 翻转1 = 正面0
以下为使用Go语言,进行异或运算的示例代码。输出格式,%b 二进制 %d 十进制
func main() {
var a = 0b0001
var b = 0b0000
fmt.Printf("a=1 b=0 xor:%b\n", a^b)
b = 0b0001
fmt.Printf("a=1 b=1 xor:%b\n", a^b)
a = 0b0000
fmt.Printf("a=0 b=1 xor:%b\n", a^b)
b = 0b0000
fmt.Printf("a=0 b=0 xor:%b\n", a^b)
}
输出为:
a=1 b=0 xor:1
a=1 b=1 xor:0
a=0 b=1 xor:1
a=0 b=0 xor:0
2. 异或运算
前面已经说了异或的规则。使用两个比较大的数字来进行异或操作。看多二进制位与单二进制是否有不同呢?
使用变量var c, d = 123, 456,转换为二进制后c = 1111011,d = 111001000,右端对齐,填充0,将c和d的二进制位数保持一致。补齐后为c=001111011。
使用c和d,进行异或操作,运算结果如下:
c = 001111011
^
d = 111001000
x = 110110011
结果: 二进制110110011
c和d相同位置上的二进制数相同时,结果为0;值不同时,结果为1。
3. 异或与加密
假设,结果上面例子想象c为明文,d为密钥,有没有办法通过在不知道密钥的情况下,仅仅通过结果,恢复到明文呢?
当已知x、d的值,可以使用x与d进行异或运算,即可得到c的值。
c = 110110011
^
d = 111001000
c = 001111011
结果: 二进制001111011。
仅知道异或结果x时,有没有办法得到c的值呢?
001111011在计算机中是一个比较小的数字,假设c是某登录系统的一个密码,该系统无安全措施的情况下,可以通过穷举的方式登录,我们知道c的十进制值为123,计算机的速度可能几秒钟就登录成功了。
所以,假设d是加密中密钥,安全性会很差,密钥选择比较复杂的密钥相比小数字更安全。
异或运算是密码学中一种基础且重要的运算方式。异或运算常用于密码学的多种场合。异或操作关注的是数据元素本身的值按照特定逻辑规则进行的变换。在实际应用中,异或通常会结合其他复杂机制来提高系统的安全性。
掌握异或运算对于学习密码学至关重要,因为它在密码学中有多种实用的应用,并且是许多加密算法的基础组件。
读完后,忍不住要加个关注!不是我吹,但你会后悔没关注的!