文章目录

  • 一、简介
  • 二、原理
  • 三、例题
  • 四、代码

一、简介

playfairplayfairplayfair 加密算法经莱昂·普莱费尔提倡在英国军地和政府使用。
它有一些不太明显的特征:密文的字母数一定是偶数;任意两个同组的字母都不会相同,如果出现这种字符必是乱码和虚码。

它使用方便而且可以让频度分析法变成瞎子,在 185418541854 到 185518551855 年的克里米亚战争和 189918991899 年的布尔战争中有广泛应用。但在 191519151915 年的一战中被破译了。

编写分三步:

  • 1.编制密码表
  • 2.整理明文
  • 3.编写密文

构成部分:

  • 1.密钥
  • 2.明文
  • 3.密文
  • 4.注明的某个字母代替的另一个字母

二、原理

它依据一个 5×55\times 55×5 的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言字母超过 252525 个,可以去掉使用频率最少的一个。如,法语一般去掉w或k,德语则是把i和j合起来当成一个字母看待。英语中z使用最少,可以去掉它。

下面是其加密规则:

  1. 密钥(关键字) 除去重复出现的字母,将剩下的字母逐个逐个加入 5×55 \times 55×5 的矩阵内,剩下的空间由未加入的英文字母依 a−z(A−Z)a-z \ (A-Z)a−z (A−Z) 的顺序加入。注意,将 q(Q)q \ (Q)q (Q) 去除,且将 iii 和 jjj 视作同一字 (注意这里为了简化我们的操作,这里的密钥字符串保证 不存在 字母 q (Q),但是密钥矩阵是存在字母 q 的 ,为了统一流程是我们将所有的字母 j替换为 字母i
  2. 将要加密的明文分成两个一组。若组内的字母相同,将 (q)Q(q)\ Q(q) Q加到该组的 第一个字母 后,重新分组。若剩下一个字,也加入 q(Q)q\ (Q)q (Q) (例如:eec分组为: eq ec
  3. 在加密的过程中,我们从前往后挑选出一组字母,并找出这一组中两个字母的位置:
    1. 若两个字母不同行也不同列,在矩阵中找出另外两个字母( 组中 第一个字母对应 优先),使这四个字母成为一个长方形的四个角
    2. 若两个字母同行,那么就分别选取两个字母右边的第一个字母作为加密的的词,如果有一个字母在在字母表的 最右边 那么它的下一个字母就是该行的 第一个字母(解密反向)
    3. 若两个字母同列,那么就分别选取两个字母下面的第一个字母作为加密的词,如果有一个字母在字母表的 最下面 那么它的下一个字母就是该列的 第一个字母 (解密反向)

这里为了方便理解,我举个栗子:

如果我们构建了这样的矩阵:

[PLAYFI/JRSDGMCHEBKNOQTUVWXZ]\begin{bmatrix} P \ L \ A \ Y \ F\\ I/J \ R \ S \ D \ G \\ M \ C \ H \ E B \\ K \ N \ O \ Q \ T \\ U \ V \ W \ X \ Z \\ \end{bmatrix} ⎣⎢⎢⎢⎢⎡​P L A Y FI/J R S D GM C H EBK N O Q TU V W X Z​⎦⎥⎥⎥⎥⎤​

我们的明文分组为:

明文分组 pl ay fa ir ci ph er
加密密文 LA YF PY RS MR AM CD

我们注意看第三个组fa,我们能看到f是第一行的末尾,说明这个词中有一个字母是在最右边的,而我们的加密的结果是PY ,其实这个 P 就是F 的下一个位置的字母或者说是右边的字母(想象成一个环形),而这个 Y就是 A 的下一个位置的字母,或者说是右边的字母,那么此时这个Playfair 加密就很简单啦

例如:

P = wearefamily
K = SouthwestPetroleumUniversity
得到:
C = EPDWLBGAYPIZ

P = Hidethegoldinthetreestump
K = Playfairexample
得到:
C = BMODZBXDNABEKUDMUIXOMOUVIF


三、例题

题目链接:http://acm.mangata.ltd/p/SWPU7
该题是playfair的魔改版

四、代码

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
char key[30][30];
map<char,bool> vis;//标记这个字母是否被用过
map<char,pair<int,int>> pos;//每个字母对应的矩阵位置
unordered_set<char> Set;string Playfair(string ming,string secret){int n = secret.size();int x = 0,y = 0;for(int i = 0;i < n; ++i) {char c = secret[i];if(c == 'J') c = 'I';if(vis[c] == false) {vis[c] = true;pos[c]={x,y};key[x][y] = c;x += (++y/5);y %= 5;}}vis['J'] = true;for(int i = 0;i < 26; ++i) {char c = char(i + 'A');if(!vis[c]) {vis[c] = true;pos[c]={x,y};key[x][y] = c;x += (++y/5);y %= 5;}}//以上部分是通过密钥构造字母矩阵vector<pair<char,char>> V;int loc = 0;n = ming.size();while(true){if(loc + 1 >= n) break;//将两者放在一组if(ming[loc] == 'J') ming[loc] = 'I';if(ming[loc+1] == 'J') ming[loc+1] = 'I';if(ming[loc] == ming[loc+1])V.push_back({ming[loc],'Q'}),loc++;elseV.push_back({ming[loc],ming[loc+1]}),loc+=2;}//如果出来的时候发现还有一位明文,那么补齐qif(loc == n-1)V.push_back({ming[loc],'Q'});string ans = "";int m = V.size();for(int i = 0;i < m; ++i) {char a = V[i].first,b = V[i].second;int xa = pos[a].first,ya = pos[a].second;int xb = pos[b].first,yb = pos[b].second;if(xa != xb && ya != yb) {ans += key[xa][yb];ans += key[xb][ya];} else {if(xa == xb) {//如果同一行ans += key[xa][(ya + 1) % 5];ans += key[xb][(yb + 1) % 5];}else if(ya == yb) {//如果同一列ans += key[(xa + 1) % 5][ya];ans += key[(xb + 1) % 5][yb];}}}return ans;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);string ming,secret;//不超过 1e5吧cin>>ming>>secret;transform(ming.begin(),ming.end(),ming.begin(), ::toupper);transform(secret.begin(),secret.end(),secret.begin(), ::toupper);string ans = Playfair(ming,secret);cout<<ans<<endl;return 0;
}

浅析加密算法三【Playfair密码】相关推荐

  1. 加密算法学习(一、中、1)——传统加密算法(playfair密码)

    本博文借鉴自书本<密码编码学与网络安全--原理与实践(第七版)>,由William Stallings著,王后珍.李莉等译. 参考博客:信息安全-1:python之playfair密码算法 ...

  2. playfair密码和凯撒密码加密算法的Java实现

    文章目录 一.实现广义的凯撒密码加密算法 二.实现广义的playfair密码的加密算法 总结 加密原理: 一.实现广义的凯撒密码加密算法 //实现广义的凯撒密码//凯撒密码的加密String plai ...

  3. Playfair密码

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

  4. python 古典密码第一弹(凯撒密码,Playfair密码,维吉尼亚密码)

    各位白嫖-漂亮大哥哥姐姐们好,在下菜鸡一枚,主要想在这和大家一起探讨学习之道,一起愉快的学习密码学基础.总所周知,密码学学的好,头发掉的少... 直接进入正题,今天我就主要讲三个密码,而且都是古典密码 ...

  5. PlayFair密码原理、代码

    1.引入PlayFair密码的原因 (1).因为单表代替的密钥量很小,不能抵抗穷尽搜索攻击 (2).单表代替密码没有将明文字母出现的概率隐藏起来.很容易收到频率分析的攻击 综上所述,我们会引入Play ...

  6. Playfair密码(原理+代码)

    目录 1.原理 2.流程图 3.编程实现 4.总结 1.原理         Playfair密码是一种使用一个关键词方格来加密字符对的加密算法,是一种多表代换的对称加密技术. 它依据一个5*5的正方 ...

  7. 08:vigenère密码_密码技术:Vigenére密码,Playfair密码,Hill密码

    08:vigenère密码 1)Vigenére密码 (1) Vigenére Cipher) This technique is an example of Polyalphabetic Subst ...

  8. C语言:编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。)

    C语言:编写代码实现,模拟用户登录情景,并且只能登录三次.(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序.) #include<stdio.h> #incl ...

  9. Python入门记录(6)输入三次密码

    # 项目名:pythonProject2 # NAME:demo9 # 开发时间:2021/4/7 16:47 '''输入三次密码''' i = 0 while i < 3 :pwd = inp ...

最新文章

  1. 破4!《我想进大厂》之Java基础夺命连环16问
  2. 如何在“首选项”摘要中显示Android首选项的当前值?
  3. 30分钟从工作电脑入侵公司内网!Win11:更新强制要求有TPM2.0,知道为啥了吧?...
  4. ROS 2 index翻译(七)——用Colcon编译功能包(package)
  5. 几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!
  6. linux软连接与硬链接
  7. cordova监听事件中调用其他方法_Laravel模型事件的实现原理详解
  8. 交换机跟计算机系统有关系,网速跟交换机有关系吗
  9. 从资深遥控器在家工作的5个技巧
  10. Java实训项目5:GUI学生信息管理系统 - 实现步骤 - 创建数据库与表
  11. SuperSlidev2.1 轮播图片和无缝滚动
  12. spring boot session超时设置
  13. Python安装教程:
  14. 什么是静态分析?代码分析工具
  15. 转:nginx allow 多个ip ipv4的网段表示方法解析
  16. 蓝牙加密方案,蓝牙方案,蓝牙usbkey,蓝牙key,蓝牙U盾,蓝牙智能卡(公交卡等CPU卡),蓝牙身份认证产品分享,蓝牙公交卡,蓝牙会员卡
  17. Photoshop之渐变工具使用
  18. 区块链是什么通俗解释_区块链是什么?1个例子通俗解释,小白秒懂!
  19. linux dns权重设置,权重及权重配置
  20. iOS 程序员、架构师、技术经理、技术总监和CTO有啥区别?

热门文章

  1. 电脑桌面便签怎么设置待办事项完成删除或完成隐藏?
  2. H3CNE-rip协议
  3. Codefoece Educational Codeforces Round 83 (Rated for Div. 2)题解,(ABCDE)
  4. Cloudera Manager部署StreamSets
  5. Axhub Charts学习记录贴-渐变色
  6. mimikatz bypass360全家桶
  7. HTML5布局—div布局和table布局
  8. go语言处理html文件,golang解析html网页的方法
  9. 汕头大学计算机软件专业研究生就业,月薪6800:汕头大学2019毕业研究生就业,这个学院平均工资最高...
  10. NY8A051G 内置MOS版本6 I/O 8-bit EPROM-Based MCU台湾九齐