题目真的好长但是意思很简单

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 加密的更多相关文章

  1. Playfair加密

    前面讲的不管是单码加密还是多码加密都属于单图加密,什么是单图加密和多图加密呢,简单来说单图加密就是一个字母加密一个字母,而多图加密就是一个字符组加密一个字符组.比如双图加密就是两个字母加密两个字母,这 ...

  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. Java数据结构和算法 - OverView

    Q: 为什么要学习数据结构与算法? A: 如果说Java语言是自动档轿车,C语言就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从1档开到4档,而且未必 ...

  2. Python开发:Python2和Python3的共存和切换使用

    从python2到python3,这两个版本可以说是从语法.编码等多个方面上都有很大的差别.为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容,也就是说许多针对早期Python2版 ...

  3. Kubernetes 笔记 10 Job 机器人加工厂

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...

  4. 中文分词实战——基于jieba动态加载字典和调整词频的电子病历分词

    分词是自然语言处理中最基本的一个任务,这篇小文章不介绍相关的理论,而是介绍一个电子病历分词的小实践. 开源的分词工具中,我用过的有jieba.hnlp和stanfordnlp,感觉jieba无论安装和 ...

  5. Kubernetes的污点和容忍(下篇)

    背景 继上一篇<Kubernetes的污点和容忍(上篇)>,这是https://kubernetes.io/docs/concepts/configuration/taint-and-to ...

  6. KnockoutJS-绑定元素

    工作变更,又走回了WPF,一个来月没有接触web开发了,之前的KnockoutJS却不想放弃,继续进行知识的巩固,下个月开始重新走回web开发之路,还是得用回一些习惯了的工具.本次开始接触各绑定元素功 ...

  7. 前端笔记之JavaScript面向对象(二)内置构造函数&相关方法|属性|运算符&继承&面向对象

    一.复习 1.1复习上下文 函数的调用方式 上下文 fun() window obj.fun() obj box.onclick = fun box setInterval(fun,1000) set ...

  8. Hexo优化 | 创建sitemap站点地图并向Google提交

    前言 站点地图是一种文件,您可以通过该文件列出您网站上的网页,从而将您网站内容的组织架构告知Google和其他搜索引擎.Sitemap 可方便管理员通知搜索引擎他们网站上有哪些可供抓取的网页.搜索引擎 ...

  9. vue + element 动态渲染、移除表单并添加验证

    博客地址:https://ainyi.com/66 又接到新需求了吧~~ 背景 在一个大表单里,有可能会出现这种需求,用户可以自己操作动态添加.移除表单,更加个性化的效果. 常见于填写个人信息.附加内 ...

  10. Eureka的工作原理以及它与ZooKeeper的区别

    1.Eureka 简介: Eureka 是 Netflix 出品的用于实现服务注册和发现的工具. Spring Cloud 集成了 Eureka,并提供了开箱即用的支持.其中, Eureka 又可细分 ...