一本通1402 Vigenère密码
【题目描述】
6世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码。Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。在密码学中,我们称需要加密的信息为明文,用M表示;称加密后的信息为密文,用C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k。 在Vigenère密码中,密钥k是一个字母串,k=k1k2…kn。当明文M=m1m2…mn时,得到的密文C=c1c2…cn,其中ci=mi®ki,运算®的规则如下表所示:
Vigenère加密在操作时需要注意:
1.®运算忽略参与运算的字母的大小写,并保持字母在明文M中的大小写形式;
2.当明文M的长度大于密钥k的长度时,将密钥k重复使用。
例如,明文M=Helloworld,密钥k=abc时,密文C=Hfnlpyosnd。
【输入】
第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。
第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。
对于100%的数据,输入的密钥的长度不超过100,输入的密文的长度不超过1000,且都仅包含英文字母。
【输出】
输出共1行,一个字符串,表示输入密钥和密文所对应的明文。
【输入样例】
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
【输出样例】
Wherethereisawillthereisaway
1.真的我一开始看到题真的是崩溃的,
这***什么东西啊,
有好多题是一看就不想做的,
还有好多题是看都不想看的,
这题就属于这种。
2.硬着头皮做吧...
我们先看看能找到什么信息。
最重要的应该是最上面那张图,
是用密文和密钥输出明文的关键。
仔细分析一下,
能发现如果密钥为A,则密文所在的字母表不变,
密钥为B,则密文所在的字母表向右退一位,
既然涉及到了字母表中的顺序变换,
那就请出老朋友ASCII码表。
3.设计一下程序吧
首先要区分大小写,
可以用大写的“Z”来做分界线,
好像密钥有可能比密文长哈,
这时候也要想想怎么实现密钥的重复利用。
最后再输出个字符串(明文)就行了。
4.让我们看看正解。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void turn(char &x);
int main()
{
char key[1000],secret[1000];
int len1,len2;
int i,j;
gets(key);//输入密钥
gets(secret);//输入密文
len1=strlen(key);//求密钥长度
len2=strlen(secret);//求密文长度
for(i=0; i<len1; i++) //将密钥转换为大写字母
turn(key[i]);
for(i=0,j=0; i<len2; i++) //从头开始解密
{
if(secret[i]<='Z')//大写的情况
{
secret[i]=secret[i]-(key[j]-'A');//按规则解密
j++;
if(secret[i]<'A')//若明文小于A
secret[i]='Z'-('A'-secret[i])+1;//从字母表倒序转换
}
else//小写的情况
{
secret[i]=secret[i]-(key[j]-'A');//按规则解密
j++;
if(secret[i]<'a')//若明文小于a
secret[i]='z'-('a'-secret[i])+1;//从字母表倒序转换
}
if(j>len1-1)//若明文长度大于密钥长度,重复使用密钥
j=0;
}
cout<<secret<<endl;
return 0;
}
void turn(char &x)
{
if((x>='a')&&(x<='z'))
x-=32;
}
嗯对就是这样
5.这个题真的不怎么好做,
题干真是让人抓狂,
做起来太累了,
但并是不能做嘛,
面对难题,
难受可以,抓狂可以,
难受抓狂结束以后,
还是要分析题目条件,
寻找突破口,
为代码实现创造条件。
一本通1402 Vigenère密码的更多相关文章
- Vigenère密码
来源 NOIP2012复赛 提高组 第一题 描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法--Vigenère密码.Vigenère密码的加密解密算法简单易用 ...
- [NOIP2012] 提高组 洛谷P1079 Vigenère 密码
题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...
- NOIp 2012 #1 Vigenère 密码 Label:模拟
题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...
- Vigenère 密码(luogu 1079)
题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...
- Vigenère 密码NOIP 2012 提高组 第一天 第一题
题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...
- NOIP2012 Vigenère 密码
1.Vigenère 密码 (vigenere.cpp/c/pas) [问题描述] 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法——Vigenère 密码.V ...
- [字符串][NOIP2012]Vigenère密码
Vigenère密码 题目描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère密码的加密解密算法简单易用,且破译难度比较高, ...
- 08:Vigenère密码
08:Vigenère密码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法— ...
- 80.Vigenère密码(模拟)
Vigenère密码(文件名vigenere.cpp vigenere.in vigenere.out) 题目描述 Description 16 世纪法国外交家Blaise de Vigen ...
随机推荐
- java.io.IOException: Error: JSP Buffer overflow
错误 jsp页面报错如下: Stacktrace: org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java ...
- lamp-module
要求: (1) 三者分离于两台主机: (2) 一个虚拟主机用于提供phpMyAdmin:另一个虚拟主机用于提供wordpress: (3) xcache (4) 为phpMyAdmin提供htt ...
- P1046 划拳
P1046 划拳 转跳点:
- CAD转PDF再由pdf转jpg图片
免费的PDF转JPG图片 https://www.gaitubao.com/pdf-to-jpg/
- netty权威指南学习笔记六——编解码技术之MessagePack
编解码技术主要应用在网络传输中,将对象比如BOJO进行编解码以利于网络中进行传输.平常我们也会将编解码说成是序列化/反序列化 定义:当进行远程跨进程服务调用时,需要把被传输的java对象编码为字节数组 ...
- Redis 详解 (四) redis的底层数据结构
目录 1.演示数据类型的实现 2.简单动态字符串 3.链表 4.字典 5.跳跃表 6.整数集合 7.压缩列表 8.总结 上一篇博客我们介绍了 redis的五大数据类型详细用法,但是在 Redis 中, ...
- 对plotTree的解释
1.>>>a = 1/2/2 >>>a >>>0.25 2.def plotMidText(cntrPt,parentPt,txtString ...
- jupiter的@TempDir 等不生效
jupiter与junit是 完全独立的测试组件,要严防在测试中将二者混用.最好在依赖引入jupiter 时 就将junit的依赖干掉,以防在写测试用例时将二者混用.不会报错,但是会导致 jupite ...
- (java) webdriver 启动firefox driver时,加载firebug的扩展
去网上下载一个firebug.xpi(对应版本, 我的ff是17,可以使用firebug-1.11.4.xpi,最好使用非firefox浏览器下载,不然提示你直接安装到firefox) @Before ...
- exctern C
在C++中调用C语言 因为C++扩展了函数重载.编译时会将函数名修改,所以直接条用会出错. #ifdef __cplusplusextern "C" {#endif // __cp ...