700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 凯撒/摩斯/栅栏/维吉尼亚/元音密码加解密的Python实现

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

时间:2024-09-25 17:47:59

相关推荐

凯撒/摩斯/栅栏/维吉尼亚/元音密码加解密的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 += iprint(ret)return ret

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

def caesar_de(s, n="/", alp=True):"""凯撒密码 解密alp 表示是否只处理字母默认只处理字母,n从0试到25"""ret = ""s = str(s)n = str(n)if n.isdigit(): # 如果指定nn = int(n)if alp: # and not s.isalpha():for i in s:if not i.isalpha():ret += ielse: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, 25else:start, end = -26, 26elif n[0] == "/":if alp:start = 0else:start = -26end = int(n[1:])elif n[-1] == "/":start = int(n[:-1])if alp:end = 25else:end = 26else: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 += ielse: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 = Falsefor ch in s:if ch in codes:ret.append(codes[ch])else:ret.append(ch)err = Trueret = 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%nd = l//nfor 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%nd = l//nprint("%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 += iprint(ret)return ret

5. 元音密码

加密

def vowel_en(s, mode=0, sign="."):"""元音密码 加密"""if mode != 0 and mode != 1:print("仅有模式0和1")returns = 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 = Falsefor i in s:if i in codes[0]:ret.append(codes[mode][i])else:err = Trueret.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 = Falseret = ""if mode == 0:s = cut(s, 2)elif mode == 1:s = s.split(sign)else:print("仅有模式0和1")returnfor i in s:if i in codes:ret += codes[i]else:err = Trueret += iprint(ret)if err:print("有错误!")return ret

6. 维吉尼亚密码

加密

def virginia_en(s, k):"""维吉尼亚密码 加密s: 明文k: 密钥"""s = s.upper()k = k.upper() # 也可以都转小写,注意把65一起改为97k = 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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。