Playfair 加密
题目真的好长但是意思很简单
89.加密 (15分)
C时间限制:3 毫秒 | C内存限制:3000 Kb
题目内容:
一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中
其他字母一起填入至一个5x5的方阵中,填入方法如下:
1.首先按行填入密钥串。
2.紧接其后,按字母序按行填入不在密钥串中的字母。
3.由于方阵中只有25个位置,最后剩下的那个字母则不需变换。
如果密钥为youandme,则该方阵如下:
y o u a n
d m e b c
f g h i j
k l p q r
s t v w x
在加密一对字母时,如am,在方阵中找到以这两个字母为顶点的矩形:
o u a
m e b这对字母的加密字母为该矩形的另一对顶点,如本例中为ob。
请设计程序,使用上述方法对输入串进行加密,并输出加密后的串。
另外有如下规定:
1、一对一对取字母,如果最后只剩下一个字母,则不变换,直接放入加密串中;
2、如果一对字母中的两个字母相同,则不变换,直接放入加密串中;
3、如果一对字母中有一个字母不在正方形中,则不变换,直接放入加密串中;
4、如果字母对出现在方阵中的同一行或同一列,如df或hi,则只需简单对调这两个字母,即变换为fd或ih;
5、如果在正方形中能够找到以字母对为顶点的矩形,假如字母对为am,则该矩形的另一对顶点字母中,与a同行的字母应在前
面,在上例中应是ob;同样若待变换的字母对为ta,则变换后的字母对应为wo;
6、本程序中输入串均为小写字母,并不含标点、空格或其它字符。
解密方法与加密相同,即对加密后的字符串再加密,将得到原始串。
输入描述
从控制台输入两行字符串,第一行为密钥单词(长度小于等于25,字母不重复,且都为小写字母),第二行为待加密字符串(长度
小于等于50),两行字符串末尾都有一个回车换行符,并且两行字符串均为小写字母,不含其它字符。输出描述
在标准输出上输出加密后的字符串。输入样例
youandme
welcometohangzhou输出样例
vbrmmomvugnagzguu
样例解释:
y o u a n
d m e b c
f g h i j
k l p q r
s t v w x
welcometohangzhou
(一对一对找)找到对应的矩阵,输出另一个对角上面的字母,
如果其中一个字母不在矩阵中,原样输出
如果在同行或者同列,位置对调
如果剩最后一个字母,原样输出
we --> vb lc-->rm om -->mo et-->mv oh-->ug an-->na gz-->gz ho-->gu u-->u
#include <stdio.h>
#include <string.h>
char s1[];
char str[];
char s[][]; //加密矩阵
int a[];
typedef struct{
int x, y; //记录字母的横纵坐标
}P;
P p[];
int main(){
scanf("%s%s", s1, str);
memset(a, , sizeof a);
int i = ;
while(s1[i]){
int d = s1[i] - 'a';
a[d] = ;
i++;
}
int k = , len = strlen(s1);
int f = ;
for(int i = ; i < ; i++){
for(int j = ; j < ; j++){
if(k < len){
s[i][j] = s1[k];
k++;
}else{
while(a[f] && f <= ){ //循环结束时 a[f] = 0
f++;
}
char c = f + 'a';
s[i][j] = c;
f++;
}
}
} memset(a, , sizeof a);
for(int i = ; i < ; i++){
for(int j = ; j < ; j++){
int d = s[i][j] - 'a';
p[d].x = i; p[d].y = j;
a[d] = ;//判断是否出现过
}
} i = ; len = strlen(str);
while(str[i]){
if(i == len - ){//最后一个单着
printf("%c", str[i]);
i++;
}else{
//找到横纵坐标
int d1 = str[i] - 'a';
int d2 = str[i+] - 'a';
if(a[d1] && a[d2]){//就是都在加密矩阵中
int x1 = p[d1].x, y1 = p[d1].y;
int x2 = p[d2].x, y2 = p[d2].y;
//如果在同一列
if(y1 == y2){
printf("%c%c", str[i+], str[i]);
} else{
printf("%c%c", s[x1][y2], s[x2][y1]);
}
}else{
printf("%c%c", str[i], str[i+]);
}
i += ;
}
}
return ;
}
Playfair 加密的更多相关文章
- Playfair加密
前面讲的不管是单码加密还是多码加密都属于单图加密,什么是单图加密和多图加密呢,简单来说单图加密就是一个字母加密一个字母,而多图加密就是一个字符组加密一个字符组.比如双图加密就是两个字母加密两个字母,这 ...
- 信息安全-1:python之playfair密码算法详解[原创]
转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...
- CTF中那些脑洞大开的加密(1)
0x01 目录 各种文本加密 Shell 1 2 3 4 5 6 7 8 9 10 11 12 换位加密: 1.栅栏密码(Rail-fence Cipher) ...
- hiho #1361 Playfair密码表
题目1 : Playfair密码表 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho经常用Playfair密码表加密自己的代码. 密码表是按以下步骤生成的. ...
- CTF中那些脑洞大开的编码和加密
0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进 ...
- python playfair
#########################Playfair密码######################### #约定1:若明文字母数量为奇数,在明文末尾添加一个'Z' #约定2:'I'作为 ...
- javascript实现playfair和hill密码算法
时至期末,补习信息安全概论作业.恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础. pl ...
- 密码学笔记——playfair密码
Playfair密码(Playfair cipher 或 Playfair square)一种替换密码,1854年由查尔斯·惠斯通(Charles Wheatstone)的英国人发明. 例题: 某种 ...
- java实现Playfair 密码
一种 Playfair 密码变种加密方法如下:首先选择一个密钥单词(称为 pair)(字母不重复,且都为小写字母), 然后与字母表中其他字母一起填入至一个 5x5 的方阵中,填入方法如下: 1.首先按 ...
随机推荐
- 从壹开始微服务 [ DDD ] 之四 ║让你明白DDD的小故事 & EFCore初探
缘起 哈喽大家好哟,今天又到了老张的周二四放送时间了,当然中间还有不定期的更新(因为个人看papi酱看多了),这个主要是针对小伙伴提出的问题和优秀解决方案而写的,经过上周两篇DDD领域驱动设计的试水, ...
- 《前端之路》之三 数组的属性 && 操作方法(下)
咱们 接着上篇来讲- 7.slice() 从某个已有的数组返回选定的元素 经常用来将类数组转化成数组,这样做一方面可以利用现有的数组方法更加方便的处理,另一方面是处于性能的考虑 var f = fun ...
- unity+xlua开发中的问题笔记
转载请标明出处:http://www.cnblogs.com/zblade/ 一.概述 整理遇到的一些较难处理的bug,总结相关经验 二.主要问题 2.1 material类型的依赖修改 对于mate ...
- LVS(五)LVS的持久连接
什么是持久链接 把某个客户端的请求始终定向到同一应用服务器上.对于LVS来说持久连接和算法没有关系.也就是使用任何算法LVS都可以实现同一客户端的请求转发到之前选定的应用服务器,以保持会话.而且还能实 ...
- [翻译]Protocol Buffer 基础: C++
目录 Protocol Buffer Basics: C++ 为什么使用 Protocol Buffers 在哪可以找到示例代码 定义你的协议格式 编译你的 Protocol Buffers Prot ...
- 从零开始搭建Prometheus自动监控报警系统
从零搭建Prometheus监控报警系统 什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开 ...
- windows环境设置mysql自动备份(测试成功)
00.背景介绍 最近做了个小程序,使用的是mysql数据库,涉及到将程序数据备份的事:虽然大部分数据库客户端工具都具有备份功能,但并不能做到定期自动备份:在Windows环境下,手工备份MySQL是很 ...
- [Nodejs] node的fs模块
fs 模块 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作 API. Node 导入文件系统模块(fs).Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如 ...
- android 资源
在进行APP开发的过程当中,会用到许多资源,比如:图片,字符串等.现对android资源知识进行简单记录. 具体的详细信息及用法,点击查看官方文档 分类 一般android资源分为可直接访问 ...
- eclipse中集成maven
一.环境 eclipse mar jdk 1.7 apache-maven-3.3.3 注意: 1> eclipse mar 已集成maven插件,我们只需要配置成自己的maven即可,类似ec ...