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