凯撒/摩斯/栅栏/维吉尼亚/元音密码加解密的Python实现

注: 1. 采用了return ,可以去掉ret, += 的语句改为print
2. 无介绍,各种密码的介绍请自行百度
3. 仅是一种实现,不一定最优

1. 凯撒密码

加密

def caesar_en(s, n):
	ret = ''
	for i in s:
		if i.isalpha():
			if i.islower():
				ret += chr(97+(ord(i)-97+n)%26)
			else:
				ret += chr(65+(ord(i)-65+n)%26)
		else:
			ret += i
	print(ret)
	return ret

解密+“爆破”(这个写复杂了,见到的例子都是只处理字母的,,,)

def caesar_de(s, n="/", alp=True):
	"""凯撒密码 解密
		alp 表示是否只处理字母
		默认只处理字母,n从0试到25
	"""
	ret = ""
	s = str(s)
	n = str(n)
	if n.isdigit():  # 如果指定n
		n = int(n)
		if alp:  # and not s.isalpha():
			for i in s:
				if not i.isalpha():
					ret += i
				else:
					if i.islower():
						ret += chr(97+(ord(i)-97-n)%26)
					else:
						ret += chr(65+(ord(i)-65+n)%26)
		# elif alp:
		# 	for i in s:
		# 		if i.islower():
		# 			ret += chr(97+(ord(i)-97+n)%26)
		# 		else:
		# 			ret += chr(65+(ord(i)-65+n)%26)
		else:
			for i in s:
				ret += chr(ord(i)+n)
		print(repr(ret))
	elif '/' in n:  # 否则范围求解
		if n == "/":
			if alp:
				start, end = 0, 25
			else:
				start, end = -26, 26
		elif n[0] == "/":
			if alp:
				start = 0
			else:
				start = -26
			end = int(n[1:])
		elif n[-1] == "/":
			start = int(n[:-1])
			if alp:
				end = 25
			else:
				end = 26
		else:
			start, end = [int(i) for i in n.split("/")]
		ret = []
		for n in range(start, end+1):
			print("偏移量%3d"%n, end=": ")
			retp = ""
			if alp:  # and not s.isalpha():
				for i in s:
					if not i.isalpha():
						retp += i
					else:
						if i.islower():
							retp += chr(97+(ord(i)-97-n)%26)
						else:
							retp += chr(65+(ord(i)-65-n)%26)
			# elif alp:
			# 	for i in s:
			# 		if i.islower():
			# 			retp += chr(97+(ord(i)-97+n)%26)
			# 		else:
			# 			retp += chr(65+(ord(i)-65+n)%26)
			else:
				for i in s:
					retp += chr(ord(i)+n)
			print(repr(retp))  # repr 为了将不可见字符输出
			ret.append(retp)
	else:
		print("invalued n")
	return ret
2. 摩斯密码

加密

def morse_en(s, sh=".", lo="-", sign="/"):
	"""摩斯密码 加密"""
	codes = {
		'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.',
		'f': '..-.', 'g': '--.', 'h': '....', 'i': '..', 'j': '.---',
		'k': '-.-', 'l': '.-..', 'm': '--', 'n': '-.', 'o': '---',
		'p': '.--.', 'q': '--.-', 'r': '.-.', 's': '...', 't': '-',
		'u': '..-', 'v': '...-', 'w': '.--', 'x': '-..-', 'y': '-.--', 'z': '--..',
		'0': '-----', '1': '.----', '2': '..---', '3': '...--', '4': '....-',
		'5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.',
		'?': '..--..', '/': '-..-.', '.': '.-.-.-', '@': '.--.-.',
		'-': '-....-', '(': '-.--.', ')': '-.--.-', ':': '---...', ',': '--..--', 
		';': '-.-.-.', '=': '-...-', "'": '.----.', '"': '.-..-.', '_': '..--.-',
		'!': '-.-.--', '$': '...-..-'
	}
	s = s.lower().replace(' ', '')
	ret = []
	err = False
	for ch in s:
		if ch in codes:
			ret.append(codes[ch])
		else:
			ret.append(ch)
			err = True
	ret = sign.join(ret).replace(".",sh).replace("-",lo)
	print(ret)
	if err:
		print("注意:有不能识别字符(原样输出在结果中)")
	return ret

解密

def morse_de(s, sh=".", lo="-", sign="/"):
	"""摩斯密码 解密
	"""
	codes = {'.-': 'a', '-...': 'b', '-.-.': 'c', '-..': 'd', '.': 'e',
	 	'..-.': 'f', '--.': 'g', '....': 'h', '..': 'i', '.---': 'j', 
	 	'-.-': 'k', '.-..': 'l', '--': 'm', '-.': 'n', '---': 'o', 
	 	'.--.': 'p', '--.-': 'q', '.-.': 'r', '...': 's', '-': 't', 
	 	'..-': 'u', '...-': 'v', '.--': 'w', '-..-': 'x', '-.--': 'y', 
	 	'--..': 'z', '-----': '0', '.----': '1', '..---': '2', '...--': '3', 
	 	'....-': '4', '.....': '5', '-....': '6', '--...': '7', '---..': '8', 
	 	'----.': '9', '..--..': '?', '-..-.': '/', '.-.-.-': '.', '.--.-.': '@', 
	 	'-....-': '-', '-.--.': '(', '-.--.-': ')', '---...': ':', '--..--': ',', 
	 	'-.-.-.': ';', '-...-': '=', '.----.': "'", '.-..-.': '"', '..--.-': '_',
	 	 '-.-.--': '!', '...-..-': '$'
	}
	if not s:
		print()
		return ""
	s = s.split(sign)
	ret = ""
	err = []
	for i in s:
		if i in codes:
			ret += codes[i]
		else:
			err.append(i)
	print(ret)
	if err:
		print("不能识别的摩斯密码:")
		print("/".join(err))
	return ret
3. 栅栏密码

加密

def fence_en(s, n):
	"""栅栏密码 加密"""
	s = s.replace(" ", '')  # 去除空格
	ret = "".join([s[i::n] for i in range(n)])
	print(ret)
	return ret

解密+“爆破”

def fence_de(s, n=0):
	"""栅栏密码 解密"""
	ret = ""
	l = len(s)
	if n:  # 若指定n则按指定的
		r = l%n
		d = l//n
		for i in range(d):
			for j in range(n):
				ret += s[j*(d+1)+i if j<r else r*(d+1)+(j-r)*d+i]
		for j in range(r):
			ret += s[j*(d+1)+d]
		print(ret)
		return ret
	# 否则遍历破解
	ret = []
	for n in range(2, len(s)):  # 一般都会在2到len(s)/2里找到结果,这里全输出一下
		retp = ""
		r = l%n
		d = l//n
		print("%sn=%2d"%('*'*(r == 0), n), end=": ")
		for i in range(d):
			for j in range(n):
				retp += s[j*(d+1)+i if j<r else r*(d+1)+(j-r)*d+i]
		for j in range(r):
			retp += s[j*(d+1)+d]
		ret.append(retp)
		print(retp)
	return ret
4. 埃特巴什码
def atbash(s):
	"""埃特巴什码 加密==解密"""
	codes = {'a': 'z', 'b': 'y', 'c': 'x', 'd': 'w', 'e': 'v', 'f': 'u', 'g': 't', 'h': 's', 'i': 'r', 'j': 'q', 'k': 'p', 'l': 'o', 'm': 'n', 'n': 'm', 'o': 'l', 'p': 'k', 'q': 'j', 'r': 'i', 's': 'h', 't': 'g', 'u': 'f', 'v': 'e', 'w': 'd', 'x': 'c', 'y': 'b', 'z': 'a', 'A': 'Z', 'B': 'Y', 'C': 'X', 'D': 'W', 'E': 'V', 'F': 'U', 'G': 'T', 'H': 'S', 'I': 'R', 'J': 'Q', 'K': 'P', 'L': 'O', 'M': 'N', 'N': 'M', 'O': 'L', 'P': 'K', 'Q': 'J', 'R': 'I', 'S': 'H', 'T': 'G', 'U': 'F', 'V': 'E', 'W': 'D', 'X': 'C', 'Y': 'B', 'Z': 'A'}
	ret = ""
	for i in s:
		if i in codes:
			ret += codes[i]
		else:
			ret += i
	print(ret)
	return ret
5. 元音密码

加密

def vowel_en(s, mode=0, sign="."):
	"""元音密码 加密"""
	if mode != 0 and mode != 1:
		print("仅有模式0和1")
		return
	s = s.upper()
	codes = [{'A': '10', 'B': '11', 'C': '12', 'D': '13', 'E': '20', 'F': '21', 'G': '22', 'H': '23', 'I': '30', 'J': '31', 'K': '32', 'L': '33', 'M': '34', 'N': '35', 'O': '40', 'P': '41', 'Q': '42', 'R': '43', 'S': '44', 'T': '45', 'U': '50', 'V': '51', 'W': '52', 'X': '53', 'Y': '54', 'Z': '55'},
		{'A': '1', 'B': '11', 'C': '12', 'D': '13', 'E': '2', 'F': '21', 'G': '22', 'H': '23', 'I': '3', 'J': '31', 'K': '32', 'L': '33', 'M': '34', 'N': '35', 'O': '4', 'P': '41', 'Q': '42', 'R': '43', 'S': '44', 'T': '45', 'U': '5', 'V': '51', 'W': '52', 'X': '53', 'Y': '54', 'Z': '55'}]
	ret = []
	err = False
	for i in s:
		if i in codes[0]:
			ret.append(codes[mode][i])
		else:
			err = True
			ret.append(i)
	if mode == 0:
		ret = "".join(ret)
	else:
		ret = sign.join(ret)
	print(ret)
	if err:
		print("有错误!")
	return ret

解密

def cut(o, s):
	return [o[i:i+s] for i in range(0,len(o),s)]

def vowel_de(s, mode=0, sign="."):
	"""元音密码 解密"""
	codes = {'1': 'A', '10': 'A', '11': 'B', '12': 'C', '13': 'D', '2': 'E', '20': 'E','21': 'F', '22': 'G', '23': 'H', '3': 'I', '30': 'I','31': 'J', '32': 'K', '33': 'L', '34': 'M', '35': 'N', '4': 'O', '40': 'O', '41': 'P', '42': 'Q', '43': 'R', '44': 'S', '45': 'T', '5': 'U', '50': 'U','51': 'V', '52': 'W', '53': 'X', '54': 'Y', '55': 'Z'}
	err = False
	ret = ""
	if mode == 0:
		s = cut(s, 2)
	elif mode == 1:
		s = s.split(sign)
	else:
		print("仅有模式0和1")
		return
	for i in s:
		if i in codes:
			ret += codes[i]
		else:
			err = True
			ret += i
	print(ret)
	if err:
		print("有错误!")
	return ret
6. 维吉尼亚密码

加密

def virginia_en(s, k):
	"""维吉尼亚密码 加密
	s: 明文
	k: 密钥
	"""
	s = s.upper()
	k = k.upper()  # 也可以都转小写,注意把65一起改为97
	k = k*(len(s)//len(k)+1)
	ret = ""
	for i in range(len(s)):
		ret += chr((ord(s[i])+ord(k[i])-65*2)%26+65)
	print(ret)
	return ret

解密,只改了倒数第三行和函数名

def virginia_de(s, k):
	"""维吉尼亚密码 解密"""
	s = s.upper()
	k = k.upper()
	k = k*(len(s)//len(k)+1)
	ret = ""
	for i in range(len(s)):
		ret += chr(((ord(s[i])-65)-(ord(k[i])-65))%26 + 65)
	print(ret)
	return ret

你可能感兴趣的:(python,算法)