一本通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 ... 
随机推荐
- 009.Oracle数据库 , between关键字判断日期在两者之间
			/*Oracle数据库查询日期在两者之间*/ SELECT PKID, OCCUR_DATE, ATA FROM LM_FAULT WHERE ( OCCUR_DATE BETWEEN to_date ... 
- 007-PHP变量和函数相互转换
			<?php function write($text) //定义function write()函数 { print($text); //打印字符串 } function writeBold($ ... 
- 获取选中行中的数据提取并且保存到txt
			function getchcount(query: TADOQuery): Integer;var i:integer;begin i:=0; with Query do begin Query.F ... 
- 数据结构——KMP(串)
			KMP一个非常经典的字符串模式匹配算法,虽然网上有很多kmp算法的博客,但是为了更好的理解kmp我还是自己写了一遍(这个kmp的字符串存储是基于堆的(heap),和老师说的定长存储略有不同,字符串索引 ... 
- 一个web项目中web.xml<context-param>的作用
			转 <context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置 ... 
- 云时代架构阅读笔记九——web应用存在的问题及解决办法
			web应用通常存在的10大安全问题 1.SQL注入 拼接的SQL字符串改变了设计者原来的意图,执行了如泄露.改变数据等操作,甚至控制数据库服务器, SQL Injection与Command Inje ... 
- ES6 之 Reflect 的方法总结
			1. 概述 将 Object 对象的一些明显属于语言内部的方法(比如 Object.defineProperty ),放到 Reflect 对象上. 修改某些 Object 方法的返回结果,让其变得更 ... 
- Python MySQL Limit
			章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ... 
- vue学习(十二)vue全家桶 Vue-router&Vuex
			一 vue-router的安装 二 vue-router的基本使用 三 命名路由 四 动态路由的匹配和路由组件的复用 一 vue-router的安装 NPM npm install vue-route ... 
- tab选项卡,带自动播放
			<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ... 
