前面讲的不管是单码加密还是多码加密都属于单图加密,什么是单图加密和多图加密呢,简单来说单图加密就是一个字母加密一个字母,而多图加密就是一个字符组加密一个字符组。比如双图加密就是两个字母加密两个字母,这种加密的好处在于更加难被破解,单图对于一个字母加密最多26种(26个字母),而双图加密就有26*26种。Playfair就是一种经典的双图加密法。

Playfair先将密钥去除重复的字母和 j ,接着依次填入一个5*5的矩阵中,如矩阵还有空,则按字母表的顺序(除去 j )填满矩阵,比如密钥“telegream”形成下面的矩阵。

t e l g r
a m b c d
f h i k n
o p q s u
v w x y z

加密是要遵循下述规则:

  1. 若明文出现相同字母在一组,则在重复的明文字母中插入一个填充字母(一般为x,q)进行分隔后重新分组
  2. 若分组到最后一组时只有一个字母,则补充字母
  3. 若明文字母在矩阵中同行,则循环取其右边下一个字母为密文
  4. 若明文字母在矩阵中同列,则循环取其下边下一个字母为密文
  5. 若明文字母在矩阵中不同行不同列,则取其同行且与同组另一字母同列的字母为密

下面是python实现版本,写得有点乱

#对Playfair进行初始化
def init(key):
table = [[0 for i in range(5)]for j in range(5)]
index = [[0 for i in range(2)] for i in range(26)]
sign = [0 for i in range(26)]
colum = 0
j = 0
for i in range(len(key)):
if(key[i] == 'j' or sign[ord(key[i]) - 97] == 1):
continue
table[colum][j] = key[i]
index[ord(key[i]) - 97][0] = colum
index[ord(key[i]) - 97][1] = j
sign[ord(key[i]) - 97] = 1
j += 1
if(j == 5):
j = 0
colum += 1
i = 0
while colum < 5:
while j < 5:
while sign[i] == 1 or i == 9:
i += 1
table[colum][j] = chr(i + 97)
index[i][0] = colum
index[i][1] = j
j += 1
i += 1
colum += 1
j = 0
return table,index
#进行加密
def encrypt(tab,index,str):
ciphertext = ''
while str[0] == 'j':
str = str[:len(str)]
for i in range(1,len(str),1):
if(str[i] == 'j'):
str = str[:i] + 'i' + str[i + 1:]
continue
if(str[i - 1] == str[i]):
if(str[i - 1] == 'q'):
str = str[:i] + 'x' + str[i:]
str = str[:i] + 'q' + str[i:]
if(len(str) % 2):
str += 'x'
for i in range(0,len(str),2):
temp1 = ord(str[i]) - 97
temp2 = ord(str[i + 1]) - 97
x1 = index[temp1][0]
x2 = index[temp2][0]
y1 = index[temp1][1]
y2 = index[temp2][1]
if(x1 != x2 and y1 != y2):
ciphertext += tab[x1][y2]
ciphertext += tab[x2][y1]
elif x1 == x2:
if y1 == 4:
ciphertext += tab[x1][0]
else:
ciphertext += tab[x1][y1 + 1]
if y2 == 4:
ciphertext += tab[x2][0]
else:
ciphertext += tab[x2][y2 + 1]
else:
if x1 == 4:
ciphertext += tab[0][y1]
else:
ciphertext += tab[x1 + 1][y1]
if x2 == 4:
ciphertext += tab[0][y2]
else:
ciphertext += tab[x2 + 1][y2]
return ciphertext
#用telegram作为密钥加密明文s
def main():
tab,index = init('telegram')
s = 'nexttimejaytrysomethingdifferent'
print(encrypt(tab,index,s)) main()

参考资料

经典密码学与现代密码学

Playfair加密的更多相关文章

  1. Playfair 加密

    题目真的好长但是意思很简单 89.加密 (15分)C时间限制:3 毫秒 | C内存限制:3000 Kb题目内容:一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重 ...

  2. 信息安全-1:python之playfair密码算法详解[原创]

    转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...

  3. CTF中那些脑洞大开的加密(1)

    0x01 目录 各种文本加密             Shell   1 2 3 4 5 6 7 8 9 10 11 12 换位加密:     1.栅栏密码(Rail-fence Cipher)    ...

  4. hiho #1361 Playfair密码表

    题目1 : Playfair密码表 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho经常用Playfair密码表加密自己的代码. 密码表是按以下步骤生成的. ...

  5. CTF中那些脑洞大开的编码和加密

    0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进 ...

  6. python playfair

    #########################Playfair密码######################### #约定1:若明文字母数量为奇数,在明文末尾添加一个'Z' #约定2:'I'作为 ...

  7. javascript实现playfair和hill密码算法

    时至期末,补习信息安全概论作业.恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础. pl ...

  8. 密码学笔记——playfair密码

     Playfair密码(Playfair cipher 或 Playfair square)一种替换密码,1854年由查尔斯·惠斯通(Charles Wheatstone)的英国人发明. 例题: 某种 ...

  9. java实现Playfair 密码

    一种 Playfair 密码变种加密方法如下:首先选择一个密钥单词(称为 pair)(字母不重复,且都为小写字母), 然后与字母表中其他字母一起填入至一个 5x5 的方阵中,填入方法如下: 1.首先按 ...

随机推荐

  1. Zookeeper入门(四)之Leader选举

    让我们分析如何在ZooKeeper集合中选举leader节点.考虑一个集群中有N个节点.leader选举的过程如下: 所有节点创建具有相同路径 /app/leader_election/guid_ 的 ...

  2. Python自动化之ajax返回表单验证的错误信息和序列化扩展

    form内置序列化错误 如果使用form提交数据的时候,可以直接返回错误信息到模板里面进行渲染 但是如果使用ajax处理呢 from django import forms from django.f ...

  3. route(windows)

    1.route delete 0.0.0.0 mask 0.0.0.0 10.33.31.254----------删除默认到内网网关的默认路由:2.route add -p 10.33.0.0 ma ...

  4. Linux下如何查看分区文件系统类型

    1,fdisk -l fdisk -l 只能列出硬盘的分区表.容量大小以及分区类型,但看不到文件系统类型. 2,df -h df 命令是用来查看文件系统磁盘空间使用量的.但df 命令只会列出已挂载的文 ...

  5. spring cloud gateway之filter篇

    转载请标明出处: https://www.fangzhipeng.com 本文出自方志朋的博客 在上一篇文章详细的介绍了Gateway的Predict,Predict决定了请求由哪一个路由处理,在路由 ...

  6. ios学习路线—Objective-C(深浅拷贝)

    在ObjC中,什么是深浅拷贝?  深浅拷贝分别指深拷贝和浅拷贝,即 mutableCopy 和 copy 方法.  copy复制一个不可变对象,而 mutableCopy 复制一个 mutable 可 ...

  7. MAC上安装GCC失败

    问题 在用brew安装GCC时, 报了如下错误. ➜ ~ brew install gcc ==> Installing dependencies for gcc: isl, mpfr and ...

  8. Go语言中的常量

    1 概述 常量,一经定义不可更改的量.功能角度看,当出现不需要被更改的数据时,应该使用常量进行存储,例如圆周率.从语法的角度看,使用常量可以保证数据,在整个运行期间内,不会被更改.例如当前处理器的架构 ...

  9. 使用开源软件 enfuse 做照片的曝光合成

    使用开源软件 enfuse 做照片的曝光合成 所谓曝光合成就是对同一场景用不同的曝光量拍摄多张照片,然后将这些照片再合成为一张照片.之所以我们要这么做是因为现在的相机感光的动态范围相比人眼实在是太小了 ...

  10. Webpack之Code Splitting 代码分块

    如何实现代码分块 默认情况webpack会将资源文件打包成一个js文件,比如app.bundle.js 实际情况我们需要按需加载 方法如下: require.ensure(dependencies, ...