python playfair加密(如有错误,请留言指正)


 1 import numpy
 2 key_word = str.upper(input('请输入秘钥:'))
 3 key_set = set()
 4 for i in key_word:
 5     if i.isalpha():
 6         key_set.add(i)
 7 key_set = list(key_set)
 8 key_set.sort(key=key_word.index)
 9 for i in range(26):
10     ch = chr(i+0x41)
11     if ch not in key_set:
12         key_set.append(ch)
13 key_set.remove('J')
14 
15 table = numpy.array(key_set)
16 table = numpy.reshape(table,(5,5))
17 model = int(eval(input('请输入填充模式(0:按列,1:按行):')))
18 if model == 0:
19     table = table.T#by column
20 else:
21     pass
22 print(r'''密钥矩阵(i/j同位):
23 {}'''.format(table))
24 
25 mes = str.upper(input('请输入明文:'))
26 M = []
27 for i in mes:
28     if i.isalpha():
29         M.append(i)
30 try:
31     M[M.index('J')] = 'I'
32 except:
33     pass
34 
35 def yjudge(table,ra,ca,rb,cb):
36     if ra == rb:
37         return 1
38     elif ca == cb:
39         return 2
40     else:
41         return 3
42 
43 
44 i = 0
45 C = ''
46 while True:
47     len_m = len(M)
48     left = len_m - i
49     if left == 0:
50         break
51     elif left == 1:
52         M.append('X')
53     elif M[i] == M[i+1]:
54         M.insert(i+1,'X')
55     else:
56         pass
57     ra,ca = numpy.where(table == M[i])
58     ra = ra[0]
59     ca = ca[0]
60     rb,cb = numpy.where(table == M[i+1])
61     rb = rb[0]
62     cb = cb[0]
63     #print(table[ra,ca],table[rb,cb])
64     ytype = yjudge(table,ra,ca,rb,cb)
65     #print(ytype)
66     if ytype == 1:#同行在右侧
67         C = C+table[ra,(ca+1)%5]
68         C = C+table[rb,(cb+1)%5]
69     elif ytype == 2:#同列在下侧
70         C = C+table[(ra+1)%5,ca]
71         C = C+table[(rb+1)%5,cb]
72     else:#不同行不同列,取同行的那个角
73         C = C+table[ra,cb]
74         C = C+table[rb,ca]
75     i += 2
76 print(r'''密文:{}'''.format(C))

测试样例(同wikipedia):

请输入秘钥:playfair example
请输入填充模式(0:按列,1:按行):1
密钥矩阵(i/j同位):
[['P' 'L' 'A' 'Y' 'F']
 ['I' 'R' 'E' 'X' 'M']
 ['B' 'C' 'D' 'G' 'H']
 ['K' 'N' 'O' 'Q' 'S']
 ['T' 'U' 'V' 'W' 'Z']]
请输入明文:Hide the gold in the tree stump
密文:BMODZBXDNABEKUDMUIXMMOUVIF
优质内容筛选与推荐>>
1、GitHub Pages和每个项目绑定自定义域名(支持多个和顶级域名)
2、umlの活动图
3、OSI七层模型介绍
4、java从基础知识(九)I/O
5、软件测试安装的工作软件


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号