P1778 vigenere密码
描述
16世纪法国外交家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-'A'+ki-'A')mod26+'A',运算?的规则如下表所示:
Vigenere加密在操作时需要注意:
1. ?运算忽略参与运算的字母的大小写,并保持字母在明文M中的大小写形式;
2. 当明文M的长度大于密钥k的长度时,将密钥k重复使用。
格式
输入格式
输入共2行。
第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。
输出格式
输出共1行,一个字符串,表示输入密钥和密文所对应的明文。
样例1
样例输入1[复制]
CompleteVictory Yvqgpxaimmklongnzfwpvxmniytm
样例输出1[复制]
Wherethereisawillthereisaway
调整容器的长度大小,使其能容纳n个元素。
如果n小于容器的当前的size,则删除多出来的元素。
否则,添加采用值初始化的元素。
resize(n,t)
多一个参数t,将所有新添加的元素初始化为t。
而reserver()的用法只有一种
2.reserve(n)
预分配n个元素的存储空间。
了解这两个函数的区别,首先要搞清楚容器的capacity(容量)与size(长度)的区别。
size指容器当前拥有的元素个数;
而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。也可以说是预分配存储空间的大小。
resize()函数和容器的size息息相关。调用resize(n)后,容器的size即为n。
至于是否影响capacity,取决于调整后的容器的size是否大于capacity。
调用reserve(n)后,若容器的capacity<n,则重新分配内存空间,从而使得capacity等于n。
如果capacity>=n呢?capacity无变化。
从两个函数的用途可以发现,容器调用resize()函数后,所有的空间都已经初始化了,所以可以直接访问。
而reserve()函数预分配出的空间没有被初始化,所以不可访问。
#include<iostream>
#include<string>
#include<vector>
#include<cctype>
using namespace std;int main()
{string s1, s2;cin >> s1 >> s2;vector<int> v;for (int i = 0; i <= s2.size() - 1; i++){if (isupper(s2[i]))v.push_back(i);}for (int i = 0; i <= s1.size() - 1; i++)s1[i] = tolower(s1[i]);for (int i = 0; i <= s2.size() - 1; i++)s2[i] = tolower(s2[i]);string s3;s3.resize(s2.size());//不能用reservefor (int i = 0; i <= s2.size() - 1; i++){if (i <= s1.size() - 1){for (char c = 'a'; c <= 'z'; c++)if (s2[i] == (c - 'a' + s1[i] - 'a') % 26 + 'a')s3[i] = c;}if (i > s1.size() - 1){int m = i%s1.size();//译文长度可能超过密匙两倍还多for (char c = 'a'; c <= 'z'; c++)if (s2[i] == (c - 'a' + s1[m] - 'a') % 26 + 'a')s3[i] = c;}}for (auto it = v.begin(); it != v.end(); it++)s3[*it] = toupper(s3[*it]);cout << s3 << endl;return 0;
}
P1778 vigenere密码相关推荐
- Vigenere密码(案例:Vigenere密码加密单词”explanation“,秘钥为”leg“。)
Vigenere密码 是什么 是使用一系列凯撒密码组成密码字母表的加密算法,属于 多表密码 的一种简单形式. 为什么 针对单表代替密码容易被频率分析法破解的缺点,人们提出多表代换密码,用一系列(两个以 ...
- Vigenere密码(维吉尼亚密码)c语言实现
Vigenere密码(维吉尼亚密码)c语言实现 简介 Vigenere密码是基于关键词的加密系统. 算法解释 Vigenere密码技术使用一个词组作为密钥,词组中的每一个字母都作为移位替换密码的密钥并 ...
- 凯撒加密, Vigenere 密码 和 一次一密加密方式(Decipher Classic Cryptography)
经典和现代密码学 1. Classic Cryptography 1.1 Private-key Encryption 私有钥匙加密 1.11 应用场景 1.12 方法介绍 Three algorit ...
- 浅析加密算法二【Vigenere密码】
文章目录 一.简介 二.原理 2.1 公式加密 2.2 查表加密 三.例题 四.代码 一.简介 维吉尼亚密码(又译 维热纳尔密码 )是使用一系列凯撒密码组成密码字母表的加密算法,属于 多表密码 的一种 ...
- Vigenere密码加密解密原理
先从简单的单表代替开始说起:要知道,在CTF题中,有很多很多都是单表代替的题,比如说: BH=CWG=EO=IEI=;DEDEDEY 所有数据长成这样,神TM能够认识对吧,但是要注意,这可是CTF的比 ...
- openjudge 1.12.8 Vigenere密码
OpenJudge - 08:Vigenère密码 解题思路: 1.由题可得,明文通过密匙来变成密文,题目中所给的是密匙串和密文串,那就是根据这两个串来设定明文并输出 2.观察图中的信息,明文转密文的 ...
- 现代密码学1.4--现代密码的三大原则
现代密码学1.4--现代密码的三大原则 正式的定义 安全条件 错误的 正确的 攻击模型 精确的假设 严格的安全性证明 博主正在学习INTRODUCTION TO MODERN CRYPTOGRAPHY ...
- 密码学基础知识(三)古典密码
说完了前面那些,想起个事,本系列依据内容主要来自<现代密码学>马春光编著.我就是学这本书的. 好了,古典密码就是古时候的密码,哈哈,逗你玩的,shannon的保密系统的通信理论发表前的都是 ...
- 信息安全管理——数据编码与密码基础
1.实验目的 (1)了解常见数据编码方法.原理: (2)掌握Base64编码基本原理和应用: (3)了解古典密码常用的加密方法,如替换.置换: (4)实践部分典型的古典加密,掌握通信加密的基本过程: ...
最新文章
- OpenCart之商品管理教程
- 怎样打造高效节能的数据中心
- 数据库平时错误和使用经验的总结
- C# 系统环境变量读取
- 程序员面试通关的 101 道真题
- NYOJ--1A+B Problem(练手题)
- moodle安装体验
- 移动端app开发,原生开发与混合开发的区别
- H3C的发展历史和与华为的关系
- 【AvalonDock】布局控件使用教程
- 美颜SDK的出现给直播和短视频平台带来了哪些影响?
- Python之列表和元组
- Git操作 【详细】【详细】
- 产品经理进修第四天 产品增长怎么做
- python expandtabs_详解Python中expandtabs()方法的使用
- 题目3 求n阶方阵的和(ok)
- PHP新版资阁网址导航源码+网站盲盒
- 国有企业如何建立现代企业制度
- 蜘蛛中可能会用到的正则
- 小裙子怎样画?如何画出一条好看又自然的小短裙?