凯撒密码加密时将明文中的每个字母都按照其在字母表中的顺序向后(或向前)移动固定数目(循环移动)得到密文,解密时将密文中的每个字母都按照其在字母表中的顺序向前(或向后)移动固定数目(循环移动)得到明文。
class Caesar:
name = 'caesar'
value = ''
# flag为偏移量
def encode(self, text, flag):
for c in text:
if ord('a') <= ord(c) <= ord('z'):
self.value += chr((ord(c) - ord('a') + int(flag)) % 26 + ord('a'))
elif ord('A') <= ord(c) <= ord('Z'):
self.value += chr((ord(c) - ord('A') + int(flag)) % 26 + ord('A'))
else:
return 'Err'
return self.value
# flag为偏移量
def decode(self, text, flag):
for c in text:
if ord('a') <= ord(c) <= ord('z'):
self.value += chr((ord(c) - ord('a') - int(flag)) % 26 + ord('a'))
elif ord('A') <= ord(c) <= ord('Z'):
self.value += chr((ord(c) - ord('A') - int(flag)) % 26 + ord('A'))
else:
return 'Err'
return self.value
基于密钥的凯撒密码,给定一个密钥,将密钥的每一位转换为数字(字母表对应顺序的数字),以每一位的数字作为偏移量进行加密与解密,密钥长度不够时重复密钥来补全长度。
埃特巴什码使用字母表中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母,以此类推进行替换。
class AtbashCipher:
name = 'AtbashCipher'
value = ''
# 加密与解密使用同一个函数
def encode(self, text):
for c in text:
if ord('a') <= ord(c) <= ord('z'):
self.value += chr(ord('a') + (ord('z') - ord(c)))
elif ord('A') <= ord(c) <= ord('Z'):
self.value += chr(ord('A') + (ord('Z') - ord(c)))
else:
return 'Err'
return self.value
简单替换密码加密时,将每个明文字母替换为与之唯一对应且不同的字母,因此有26!种替换方式,一般采用词频分析破解。 在线工具:http://quipqiup.com/
对明文的每个字母使用加密函数:
E(x) = (ax + b) (mod m)
其中m为编码系统中字母的数目(一般为26),且a与m互质
易得解密函数为:
D(x) = a^-1(x - b) (mod m)
其中a^-1表示a在mod m下的乘法逆元