Golang 中的 XOR 运算

1/22/2023 golang

# 原理

XOR 实际上是一种或运算,一般使用 ^ 进行运算,但只有两个值不同时才会为 true,运算值表如下/

运算
0 ^ 0 0
0 ^ 1 1
1 ^ 0 1
1 ^ 1 0

按表进行 16 xor 5 运算

16 xor 5 
= 00010000 xor 00000101
= 00010000
  00000101
= 00010101
= 21
1
2
3
4
5
6

# 运算定律

# 任何值与自身进行异或,值总是等于0

x ^ x = 0
1

原理

5 xor 5 
= 00000101 xor 00000101
= 00000101
  00000101
= 00000000
= 0
1
2
3
4
5
6

# 任何值与0进行异或,值总是等于自身

x ^ 0 = x
1

原理

5 xor 0
= 00000101 xor 00000000
= 00000101
  00000000
= 00000101
= 5
1
2
3
4
5
6

# 可交换性

x ^ y = y ^ x
1

原理

无论运算子谁在前,按位异或的结果也总是一致

# 在 Go 中使用异或

go 也使用 ^ 运算符进行异或运算

func Sum[T int | int64 | int8 | int32 | byte](a T, b T) T {
    return a ^ b
}
1
2
3

# 加解密

可以使用 XOR 进行简单的加解密,实际上 AES 和 DES 等算法的本质也是多次和更为复杂的异或运算

func Encode(bs []byte, key string) []byte {
	var result []byte
	for i, c := range bs {
		result = append(result, Sum(c, key[i%len(key)]))
	}

	return result
}
1
2
3
4
5
6
7
8

测试

text := []byte("Hello World")
key := "123456"
encode := xor.Encode(text, key)

fmt.Println("text:  ", text)
fmt.Println("key:   ", key)
fmt.Println("encode:", encode)
fmt.Println("decode:", xor.Encode(encode, key))
1
2
3
4
5
6
7
8

运行

text:   [72 101 108 108 111 32 87 111 114 108 100]
key:    123456
encode: [121 87 95 88 90 22 102 93 65 88 81]
decode: [72 101 108 108 111 32 87 111 114 108 100]
1
2
3
4
Last Updated: 2/11/2023, 2:30:05 AM