异或密码

简单异或密码(英语:simple XOR cipher)是密码学中一种简单的加密算法,它按照如下原则进行运算:

A 0 = A
A A = 0
(A B) C = A (B C)
(B A) A = B 0 = B

其中逻辑异或(XOR)运算的符号。按这种逻辑,文本串行的每个字符可以通过与给定的密钥进行按位异或运算来加密。如果要解密,只需要将加密后的结果与密钥再次进行按位异或运算即可。

例如,字符串“Wiki”(8位ASCII:01010111 01101001 01101011 01101001) 可以按如下的方式用密钥11110011进行加密:

01010111 01101001 01101011 01101001
11110011 11110011 11110011 11110011
= 10100100 10011010 10011000 10011010

此种加密方法类似对称加密,故解密的方式如下:

10100100 10011010 10011000 10011010
11110011 11110011 11110011 11110011
= 01010111 01101001 01101011 01101001

异或运算符常作为更为复杂的加密算法的组成部分。对于其本身来说,如果使用不断重复的密钥,利用频率分析就可以破解这种简单的异或密码。如果消息的内容被猜出或知道,密钥就会泄露。异或密码值得使用的原因主要是其易于实现,而且计算成本小。简单重复异或加密有时用于不需要特别安全的情况下来隐藏资讯。

如果密钥是随机的(不重复),而且与消息长度相同,异或密码就会更为安全。当密钥流由伪随机数发生器生成时,结果就是流密码。若密钥是真正随机的,结果就是一次性密码本,这种密码在理论上是不可破解的。

在这些密码的任何部分中,密钥运算符在已知明文攻击下都是脆弱的,这是因为明文 密文 = 密钥

代码示例

C语言

加密:

  while (done < len) {
  	tmp_ch = *buffer;
  	for(int i = 0; i < key_len; i++)
  		tmp_ch ^= key[i];
  	*crypted = tmp_ch;
  	crypted++; buffer++; done++;
  }

解密:

  while (done <= len) {
  	tmp_ch = *buffer;
  	for(int i = key_len-1; i >= 0; i--)
  		tmp_ch ^= key[i];
  	*decrypted = tmp_ch;
  	decrypted++; buffer++; done++;
  }

golang

func XOR(input []byte, key []byte) []byte { //解密時僅需將原本的output改到input,key不變即可
	output := make([]byte, len(input))
	for i := range input {
		output[i] = input[i] ^ key[i%len(key)] //當input比key長時會不斷使用key對每一個byte加密
	}
	return output
}

Python

#!/usr/bin/env python

from __future__ import print_function
from os import urandom

def o(x): # Python 2 and 3 compatibility with bytes
    if isinstance(x, str):
        return ord(x)
    else:
        return x

def genkey(length):
    """Generate key"""
    return urandom(length)

def xor_strings(s,t):
    """xor two strings together"""
    return "".join(chr(o(a)^o(b)) for a,b in zip(s,t))

message = 'This is a secret message'
print('message:', message)

key = genkey(len(message))
print('key:', key)

cipherText = xor_strings(message, key)
print('cipherText:', cipherText)
print('decrypted:', xor_strings(cipherText,key))

# verify
if xor_strings(cipherText, key) == message:
    print('Unit test passed')
else:
    print('Unit test failed')

参见

外部链接