zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【Codeforces 933A】A Twisty Movement
    【Codeforces 996B】World Cup
    【Codeforces 469B】Chat Online
    鼠标点击后的CSS3跑马灯效果
    CSS的相对定位和绝对定位
    CSS3制作的一款按钮特效
    单元测试小结
    JS对输入判断变化屏蔽中文输入法输入时连续触发事件的方法
    jquery的load方法
    MVC视图特性
  • 原文地址:https://www.cnblogs.com/ywsswy/p/8351267.html
Copyright © 2011-2022 走看看