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
  • 相关阅读:
    TSQL--按某字段列分组,在将各组中某列合并成一行
    疑难杂症--SQL SERVER 2012下数据库内存异常回收
    TSQL--删除登陆相关的用户
    杂谈--一次”失败“问题处理过程
    layer.open如何关闭自身弹出窗口
    简单的Http请求数据保存到Hdfs
    layui栅格布局问题
    redis单机版安装
    redis详细配置文件
    批量修改mysql数据库引擎
  • 原文地址:https://www.cnblogs.com/ywsswy/p/8351267.html
Copyright © 2011-2022 走看看