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)