鱼C论坛

 找回密码
 立即注册
查看: 2786|回复: 0

[技术交流] 【Cryptography】Playfair

[复制链接]
发表于 2014-4-11 14:09:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ~风介~ 于 2015-1-12 21:57 编辑
  1. def create_letter_list(miyao):#补全25个字母
  2.     l = []
  3.     l += miyao.upper()#把输入的密钥变为大写
  4.     for i in range(97,122):
  5.         if chr(i).upper() not in miyao.upper():#把A到Y中不在密钥中的字母补全进去
  6.             l.append(chr(i).upper())
  7.             
  8.     l.reverse()#逆置生成的字母表
  9.     l1 = []    #以下把字母表分割成二维数组
  10.     l2 = []
  11.     i = 0
  12.     while i < 25 :
  13.         l1 += l.pop()
  14.         i = i + 1
  15.         if i % 5 == 0:
  16.             l2.extend([l1])   
  17.             l1 = []
  18.             
  19.     print('生成的矩阵是:')
  20.     for i in range(len(l2)):#输出矩阵
  21.         print(l2[i])

  22.     return l2


  23. def creat_plaintext():#生成明文
  24.     l1 = list(input('请输入明文<位数必须是偶数>:'))#接受输入
  25.     l2 = []
  26.     for i in range(len(l1)):#把明文中的小写变为大写
  27.         if ord(l1[i]) >= 97:
  28.             l1[i] = l1[i].upper()
  29.             
  30.         l2.append(l1[i])
  31.         
  32.     return l2

  33.    
  34. def dingwei(x):#定位明文在矩阵中的坐标
  35.     l1 = []
  36.     for i in range(len(x)):  
  37.         for j in range(5):
  38.             for k in range(5):
  39.                 if letter_list[j][k] == x[i]:
  40.                     l1.append([j,k])                    
  41.     return l1

  42.         
  43. def jiami():#加密函数
  44.     l2 = []
  45.     y = dingwei(plaintext)
  46.     i = 0
  47.     while i < (len(y)-1):
  48.         j = i + 1
  49.         if y[i][0] == y[j][0]:#如果在同一行
  50.            y[i][1] = (y[i][1] + 1)%5
  51.            y[j][1] = (y[j][1] + 1)%5
  52.         elif y[i][1] == y[j][1]:#如果在同一列
  53.            y[i][0] = (y[i][0] + 1)%5
  54.            y[j][0] = (y[j][0] + 1)%5
  55.         else:
  56.             temp = y[i][1]
  57.             y[i][1] = y[j][1]
  58.             y[j][1] = temp
  59.   
  60.         l2.append(y[i])
  61.         l2.append(y[j])

  62.         i += 2
  63.         
  64.     print('加密后的密文是: ',end='')
  65.     printout(l2)#输出函数
  66.     return l2

  67.            
  68. def jiemi(x):#解密函数
  69.     l3 = []
  70.     l5 = []
  71.    
  72.     for i in range(len(x)):#接收加密后的密文
  73.         l5.append(letter_list[x[i][0]][x[i][1]])
  74.         
  75.     y = dingwei(l5)
  76.     i = 0
  77.     while i < (len(y)-1):
  78.         j = i + 1
  79.         if y[i][0] == y[j][0]:#如果在同一行
  80.            y[i][1] = (y[i][1] - 1 + 5 )%5
  81.            y[j][1] = (y[j][1] - 1 + 5 )%5
  82.         elif y[i][1] == y[j][1]:#如果在同一列
  83.            y[i][0] = (y[i][0] - 1 + 5)%5
  84.            y[j][0] = (y[j][0] - 1 + 5)%5
  85.         else:
  86.             temp = y[i][1]
  87.             y[i][1] = y[j][1]
  88.             y[j][1] = temp
  89.   
  90.         l3.append(y[i])
  91.         l3.append(y[j])

  92.         i += 2
  93.         
  94.     print('解密后的明文是: ',end='')
  95.     printout(l3)#输出
  96.    
  97. def printout(z):#输出函数
  98.     l4 = []
  99.     for i in range(len(z)):
  100.         l4.append(letter_list[z[i][0]][z[i][1]])
  101.         
  102.     print(l4)
  103. #主函数      
  104. letter_list = create_letter_list(input('请输密钥:'))
  105. plaintext = creat_plaintext()
  106. print('处理前的明文是:',plaintext)
  107. jiemi(jiami())

复制代码

截图如下:
QQ截图20140411140352.png
P.S.完整版后继补充~先去睡觉了~




评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
小甲鱼 + 5 + 5 + 3 替换密码哈,不错~

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 04:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表