Playfair密码加密--------Python语言实现

程序函数设置

 

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))

 

 

 

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ukihio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值