程序函数设置
1.mes_init(mes)函数
对明文进行初始化处理,删除明文中的空格、逗号、冒号等特殊符号,利用string.replace函数进行替代;
对明文中字母进行分组,两个一组,如果一组内字母重复,在第一个字母后面加z;
判断明文长度是否为偶数,如果不是,在最后加z。
2.mes_encryption(mes)函数
判断每组明文字母在密匙矩阵中的位置,判断每组字母的位置关系:同一行、同一列、其他。按规则对其进行相应的操作。
3.repeat(list_mes)函数
处理明文中的重复字母,返回值list_mes和flag,其中flag作为循环结束的判断,如果明文不重复字母的组数等于明文长度的一半时(两个一组),即所有组中没有重复字母,循环结束。
4.其他
upper(mes)小写统一转大写,mes_location(ch)判断明文字母在矩阵中位置。
#密匙矩阵
keys=[["M","O","N","A","R"],
["C","H","Y","B","D"],
["E","F","G","J","K"],
["L","P","Q","S","T"],
["U", "V", "W", "X", "Z"]]
def upper(mes):
mes=mes.upper()
return mes
#初始化明文
def mes_init(mes):
# 将mes中空格、.、,消除
mes=mes.replace(' ','')
mes = mes.replace(',', '')
mes = mes.replace('.', '')
mes = mes.replace(':', '')
#字符串变列表
list_mes=list(mes)
flag=False
#两个一组 重复加Z
while not flag:
list_mes = repeat(list_mes)[0]
flag = repeat(list_mes)[1]
if len(list_mes)%2==1:
list_mes.append("Z")
return list_mes
#字符在字母表中位置获取
def mes_location(ch):
if ch=="I":
ch="J"
for i in range(len(keys)):
for j in range(len(keys[i])):
if ch ==keys[i][j]:
return i, j
def repeat(list_mes):
count=0
flag=False
for i in range(len(list_mes)):
if(i%2==1):
if(list_mes[i]==list_mes[i-1]):
list_mes.insert(i,"Z")
break
if(list_mes[i]!=list_mes[i-1]):
count+=1
if count==int(len(list_mes)/2):
flag=True
return list_mes, flag
def mes_encryption(mes):
print(mes)
list_pwd=[]
list_mes=mes_init(mes)
print(list_mes)
for i in range(len(list_mes)-1):
if(i%2==0):
former=upper(list_mes[i])
latter=upper(list_mes[i+1])
_former=mes_location(former)
_latter=mes_location(latter)
if _former[0]==_latter[0]:
former_pwd=keys[_former[0]][(_former[1]+1)%5]
latter_pwd=keys[_latter[0]][(_latter[1]+1)%5]
if _former[1]==_latter[1]:
former_pwd=keys[(_former[0]+1)%5][_former[1]]
latter_pwd=keys[(_latter[0]+1)%5][_latter[1]]
else:
former_pwd=keys[_former[0]][_latter[1]]
latter_pwd=keys[_latter[0]][_former[1]]
list_pwd.append(former_pwd)
list_pwd.append(latter_pwd)
return list_pwd
if __name__=="__main__":
mes=input("请输入明文:")
print("密文:%s"%mes_encryption(mes))