异或运算在很多密码学算法中都有不同程度的应用,其运算特定在于一个数和另一个数连续异或两次仍得到原来的数。在实际使用中,因为要加密的信息和所使用的密钥在大多数情况下是不等长的,所以经常需要循环使用密钥。
def crypt1(source, key):
'''source是要加密或解密的字符串,key是密钥字符串'''
#result用来存放最终结果
#index表示当前使用的密钥字符索引
result = ''
index = 0
#遍历字符串中的每个字符
for ch in source:
#循环使用密钥字符串中的每个字符
#如果已到最后一个字符,再从0重新开始
if index == len(key):
index = 0
#异或运算
result += chr(ord(ch) ^ ord(key[index]))
index = index + 1
return result
#也可以写成下面更简洁的形式
def crypt2(source, key):
from itertools import cycle
result = ''
temp = cycle(key)
for ch in source:
result += chr(ord(ch) ^ ord(next(temp)))
return result
source = '中国,Shandong 2016'
key = 'Dong Fuguo'
#测试
for func in (crypt1, crypt2):
print('function name:', func.__name__)
print('plain text:', source)
c = func(source, key)
print('crypted text:', c)
m = func(c, key)
print('decrypted text:', m)
print('='*30)
上面的代码运行结果为: