异或运算实例解析

  1. 异或规则
  2. 异或运算
  3. 异或与加密

异或是一种逻辑运算符。用于二进制位运算。对整形变量(如:int a=1,b=2)进行异或操作,计算机会先将ab编码为二进制数,在进行异或操作。

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 = 1111011d = 111001000,右端对齐,填充0,将cd的二进制位数保持一致。补齐后为c=001111011

使用cd,进行异或操作,运算结果如下:

      c = 001111011
              ^
      d = 111001000
      
      x = 110110011

结果: 二进制110110011

cd相同位置上的二进制数相同时,结果为0;值不同时,结果为1。

3. 异或与加密

假设,结果上面例子想象c为明文,d为密钥,有没有办法通过在不知道密钥的情况下,仅仅通过结果,恢复到明文呢?

当已知xd的值,可以使用xd进行异或运算,即可得到c的值。

      c = 110110011
              ^
      d = 111001000
      
      c = 001111011

结果: 二进制001111011

仅知道异或结果x时,有没有办法得到c的值呢?

001111011在计算机中是一个比较小的数字,假设c是某登录系统的一个密码,该系统无安全措施的情况下,可以通过穷举的方式登录,我们知道c的十进制值为123,计算机的速度可能几秒钟就登录成功了。


所以,假设d是加密中密钥,安全性会很差,密钥选择比较复杂的密钥相比小数字更安全。

异或运算是密码学中一种基础且重要的运算方式。异或运算常用于密码学的多种场合。异或操作关注的是数据元素本身的值按照特定逻辑规则进行的变换。在实际应用中,异或通常会结合其他复杂机制来提高系统的安全性。

掌握异或运算对于学习密码学至关重要,因为它在密码学中有多种实用的应用,并且是许多加密算法的基础组件。


读完后,忍不住要加个关注!不是我吹,但你会后悔没关注的!

原文链接:,转发请注明来源!