普莱费尔密码的编写方法通常分为三个步骤,即编制密码表,整理明文,编写译文,下面以明文:pishoupideweinasi和密钥“culture”为例讲解。

1、编制密码表

我们需要一个5×5的方表,而用到的是密钥“culture”与英文字母表:

(1)整理密钥字母culture,去掉后面重复的字母,得到字母串:cultre;

(2)用上一步得到的字母自上而下填补5×5方表的纵列(也可横排),之后空白按照相同的顺序用字母表中剩余的字母依次填补完成,得到如下的方格(也叫棋盘密码):

C E G M S
U A H N V
L B I O W
T D J P X
R F K Q Y

这一步需要注意的是:整理密钥字母时,如果出现z,则需要去除,因为在英文里z的使用频率最低。

2、整理明文

我们需要遵循的原则是“两个一组”,得到若干个两两成对的字母段,用到的是明文pishoupideweinasi和字母“x”:

(1)将明文两两一组按顺序排开,得到pi,sh,ou,pi,de,we,in,as,i

(2)对于末尾的单个字母要加上一个“x”使之成对:pi,sh,ou,pi,de,we,in,as,ix

这一步需要注意的是:对于相连字母相同者,每个后面都要加x,如tomorrow,需要写成:to,mo,rx,rx,ow

3、编写密文

我们要得到的密文,对于每个字母对,要严格遵循如下的原则:

(1)如果两个字母在同一行,则要用它右邻的字母替换,如果已在最右边,则用该行最左边的替换,如明文“ce”,按照上表,应替换为“eg”;

(2)如果两个字母在同一列,则要用它下边的字母替换,如果已在最下边,则用该行最上边的替换,如明文“oq”,按照上表,应替换为“pm”;

(3)如果两个字母在不同的行和列,则应在密码表中找到两个字母使四个字母组成一个矩形,明文占据两个顶点,需用另外两个顶点的字母替换,如明文为“hx”,可以替换为“vj”或“jv”。

按照上述规则,将明文加以加密,得到密文:jo gv ln jo fa bs oh ve wj。

该密码的解法只需反其道而行之即可。

相关代码:

//创建棋盘密码
void CreateTable(string in_key) {int i=0,j,sum=0;int hash[26]= {0};char temp[26]= {0};int len = in_key.length();while(sum<len) {char ch = in_key[sum];if(hash[ch-'a']==0&&ch!='z') {temp[i] = ch;hash[ch-'a'] = 1;i++;}sum++;}for(j=0; j<26; j++) {if(hash[j]==0&&j+'a'!='z') {temp[i] = j+'a';hash[j]=1;i++;}}for(i=0; i<5; i++) {for(j=0; j<5; j++) {playfair_table[i][j] = temp[5*i+j];}}
}//整理明文
string Arrange(string s) {int len = s.length();string str="";int i=0;if(len==1) {str += s[0]+'x';return str;}if(len>1) {while(i<len&&i+1<len) {if(s[i]!=s[i+1]) {str =str + s[i]+s[i+1];}if(s[i]==s[i+1]) {str =str + s[i]+'x'+s[i+1]+'x';}i+=2;}if(i<len) {str =str + s[len-1]+'x';}}return str;
}

字母定位:

//获取某个字符的位置
void GetPosition(char c, int *x,int *y) {int i,j;for(i=0; i<5; i++) {for(j=0; j<5; j++) {if(playfair_table[i][j]==c) {*x = i;*y = j;return ;}}}
}//获取该位置上的字符
char GetKey(int x,int y) {return playfair_table[x%5][y%5];
}

加密代码:

//加密
string Encrypt(string input) {string output="";int len = input.length();int sum=0;int ax,ay,bx,by;char pair[2]= {0};while(sum+1<len) {pair[0] = input[sum];pair[1] = input[sum+1];GetPosition(pair[0],&ax,&ay);GetPosition(pair[1],&bx,&by);if(ax==bx) {output = output+GetKey(ax,ay+1)+GetKey(bx,by+1);} else if(ay==by) {output = output + GetKey(ax+1,ay)+GetKey(bx+1,by);} else {output = output +GetKey(bx,ay)+ GetKey(ax,by);}sum+=2;}return output;
}

解密代码:

//解密
string Decrypt(string input) {string output = "";int len = input.length();int sum=0;int ax,ay,bx,by;char pair[2]= {0};while(sum+1<len) {pair[0] = input[sum];pair[1] = input[sum+1];GetPosition(pair[0],&ax,&ay);GetPosition(pair[1],&bx,&by);if(ax==bx) {output = output+GetKey(ax,ay-1)+GetKey(bx,by-1);} else if(ay==by) {output = output + GetKey(ax-1,ay)+GetKey(bx-1,by);} else {output = output +GetKey(bx,ay)+ GetKey(ax,by);}sum+=2;}return output;
}

普莱费尔密码加密解密相关推荐

  1. 加密解密工具 之 普莱费尔密码

    普莱费尔密码(英文:Playfair Cipher 或 Playfair Square)是一种使用一个关键词方格来加密字符对的加密法,1854年由一位名叫查尔斯·惠斯通(Charles Wheatst ...

  2. 古典密码(单表密码,维吉尼亚密码,普莱费尔密码,一次一密)

    古典密码 1.单表密码(仿射加密) 仿射加密变化是:y=ax+b 算法: 仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母. A B C ...

  3. 普莱菲尔密码矩阵生成算法

    python提供了普莱菲尔密码的加解密包:pycipher 下载地址:https://pypi.python.org/pypi/pycipher 安装:python setup.py install ...

  4. python中字符移位加密_1.1 移位密码加密解密python实现

    例题1.1 移位密码加密解密 1.1.使用穷尽密钥搜索法破译如下利用移位密码加密的密文: ESPESTCOPIPCNTDPYPPODACZRCLXXTYR. 1.1答案: K=11,明文序列为: th ...

  5. php加密密码解析,php密码加密解密

    php密码加密解密 龙行    PHP    2020-3-19    1002    0评论 function MD5PWD($data) { $pwd = md5($data); //把密码分割成 ...

  6. 维吉尼亚密码加密/解密在线工具

    维吉尼亚密码加密/解密在线工具,工具链接:http://www.atoolbox.net/Tool.php?Id=856 维吉尼亚密码是在凯撒密码基础上产生的一种加密方法,它将凯撒密码的全部25种位移 ...

  7. 凯撒密码加密解密C语言详细代码

    凯撒密码加密解密C语言详细代码 凯撒密码 又叫循环移位密码.它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代.它的加密过程可以表示为下面的函数: E(m)=(m+k) mod ...

  8. 凯撒密码加密解密——Java代码(密码学)

    凯撒密码加密解密--Java代码(密码学) 凯撒密码: 恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文 ...

  9. VIP品会密码加密解密与登录

    上班都快一周了,一直想更新,奈何小伙还没有从假期的快乐中缓过来,今天终于耐下心来更新一小篇.抠一下某品会的JS代码,接着使用抠取的JS代码加密密码进行登录.友情提示:为避免不必要的纠纷,本文中所有网址 ...

最新文章

  1. python flask web开发_Python Flask web后端开发
  2. cannot open file mfc42u.lib的问题解决
  3. 【面试总结】2021Java春招面试经历
  4. react 组件引用组件_React Elements VS React组件
  5. 二层冗余网络引起的问题
  6. 【计算机科学基础】ASCII码表知识总结
  7. android pdf重排软件,PDF拆分重排(paper for kindle)
  8. Atitit.跨语言异常转换机制 java c# php到js的异常转换
  9. python-基于UDP通信的套接字,socketserver模块的使用
  10. PPC莫名死机,上周末为此hard reset了两次重装,这几天又历史重演,今天再次硬复位。想我那个Palm TT...
  11. Java并发编程学习笔记(二)——对象的共享
  12. spring 定时器_细数那些使用过的定时器
  13. win10怎么打开无线网络服务器,win10系统打开无线网络服务的操作方法
  14. 计算机while语句知识点总结,while循环使用方法
  15. datatables 动态表格行合并
  16. Mysql 10位 13位时间戳对比现在时间 时间对比查询
  17. 极狐gitlib的安装和使用
  18. linux attach 指令,Docker attach 命令
  19. 用最少的箭射爆全部气球
  20. HC-SRF04超声波测距传感器+Proteus仿真(附源码与仿真电路)

热门文章

  1. leetcode第121题——买股票的最佳时机
  2. python 图形界面开发
  3. 调用百度API实现图像风格转换
  4. FingerprintJS 浏览器端实现指纹识别
  5. freemaker导出pdf供下载
  6. 机器学习精简教程之一——线性代数知识
  7. uln2003资料,ULN2003中文资料详解
  8. python 删除字典中的键和值del()_从OrderedDict中删除键和值 - python
  9. 芋道源码的周八(2018.01.20)
  10. 在mac上使用第三方输入法沿用CapsLock(中/英)切换输入法的一种方法