记录学习python的基础学习3--敲一个playfair密码加密

playfair密码的原理请参照

https://blog.csdn.net/qq_44827634/article/details/124215535

首先是构造密码表,涉及到5行5列的矩阵,即二维字符数组的建立

key_table=[([0] * 5) for i in range(5)]#第一个5是列数,第二个5是行数

面对重复的字母需要删除,即如果删除数组指定位置的元素

del key[i]

复制数组的元素到另外一个数组

keytable=key#这两个都是数组名

在数组尾部添加元素

keytable.append(97)#将97添加到keytable的最后

在数组指定位置插入元素

str.insert( 1,'k')#在数组str的位置1中插入字符k

悟到了以后写代码最好搞个流程图

这是完整代码

def buildkey(key):#本方案采用将i和j视为同一个字母
    key = list(key)
    i=0
    while i<=len(key)-1:
        if ord(key[i])>=97 and ord(key[i])<=122:
            j=i+1
            while j<=len(key)-1:#注意len(key)是变化的,一删除就变
                if key[i]==key[j]:
                    del key[j]
                    j=j-1
                j=j+1
        else:
            del key[i]
            i=i-1
        i=i+1
    keytable=key
    for k in range(97,123,1):
        if k!= ord('j'):
            tem0=0#用来判断这个字母是否重复
            for l in key:
                if k != ord(l):
                    tem0+=1
            if tem0==len(key):
                keytable.append(chr(k))
    return keytable

def playfairencode(str,key):
    keytable=buildkey(key)
    str=list(str)
    for i in range(len(str)):
        if str[i]=='j':
            str[i]='i'#将明文中的j改成i方便加密
    j=0
    while j<=len(str)-2:
        if str[j]==str[j+1]:
            if str[j]=='i':
                str.insert(j + 1,'k')
            else:
                str.insert(j+1,chr(ord(str[j])+1))
        j+=2
    if len(str) % 2 != 0:
        if ord(str[len(str) - 1]) + 1 > 122:
            str.append('a')
        elif str[len(str) - 1]=='i':
            str.append('k')
        else:
            str.append(chr(ord(str[len(str) - 1]) + 1))
    # 至此明文填充完毕
    i=0
    while i<=len(str)-2:
        row1=(keytable.index(str[i]))//5#row=0,1,2,3,4分别对应第1,2,3,4,5行
        column1=(keytable.index(str[i])+1)%5#column=1,2,3,4分别对应第1,2,3,4列,column=0代表第5列
        location1=keytable.index(str[i])
        row2=(keytable.index(str[i+1]))//5
        column2 = (keytable.index(str[i+1]) + 1) % 5
        location2=keytable.index(str[i+1])
        if column1 == 0:
            column1 = 5
        if column2 == 0:
            column2 = 5
        if row1==row2:#同行
            if column1==5:
                str[i] = keytable[(location1 -4)%25]
                str[i + 1] = keytable[(location2+1)%25]
            elif column2==5:
                str[i] = keytable[(location1 + 1)%25]
                str[i + 1] = keytable[(location2-4)%25]
            else:
                str[i]=keytable[(location1+1)%25]
                str[i+1]=keytable[(location2+1)%25]
        elif column1==column2:#同列
            if row1==4:
                str[i] = keytable[(column1-1)%25]
                str[i + 1] = keytable[((row2+1)*column2-1)%25]
            elif row2 == 4:
                str[i] = keytable[((row1 + 1) * column1 - 1)%25]
                str[i + 1] = keytable[(column2 - 1)%25]
            else:
                str[i] = keytable[((row1 + 1) * column1 - 1)%25]
                str[i + 1] = keytable[((row2 + 1) * column2 - 1)%25]
        else:#不同行不同列时,取与自己同行与对方同列的数
                str[i] = keytable[(row1*5 + column2 - 1)%25]
                str[i + 1] = keytable[(row2*5 + column1 - 1)%25]
        i+=2
    return str
if __name__ == '__main__':
    a=buildkey('playfair is a digram cipher')
    c=playfairencode('playfaircipher','playfair is a digram cipher')
    print(a)
    print(c)

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值