描述

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

1.resize(n)  p317-318
调整容器的长度大小,使其能容纳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()函数和容器的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密码相关推荐

  1. Vigenere密码(案例:Vigenere密码加密单词”explanation“,秘钥为”leg“。)

    Vigenere密码 是什么 是使用一系列凯撒密码组成密码字母表的加密算法,属于 多表密码 的一种简单形式. 为什么 针对单表代替密码容易被频率分析法破解的缺点,人们提出多表代换密码,用一系列(两个以 ...

  2. Vigenere密码(维吉尼亚密码)c语言实现

    Vigenere密码(维吉尼亚密码)c语言实现 简介 Vigenere密码是基于关键词的加密系统. 算法解释 Vigenere密码技术使用一个词组作为密钥,词组中的每一个字母都作为移位替换密码的密钥并 ...

  3. 凯撒加密, Vigenere 密码 和 一次一密加密方式(Decipher Classic Cryptography)

    经典和现代密码学 1. Classic Cryptography 1.1 Private-key Encryption 私有钥匙加密 1.11 应用场景 1.12 方法介绍 Three algorit ...

  4. 浅析加密算法二【Vigenere密码】

    文章目录 一.简介 二.原理 2.1 公式加密 2.2 查表加密 三.例题 四.代码 一.简介 维吉尼亚密码(又译 维热纳尔密码 )是使用一系列凯撒密码组成密码字母表的加密算法,属于 多表密码 的一种 ...

  5. Vigenere密码加密解密原理

    先从简单的单表代替开始说起:要知道,在CTF题中,有很多很多都是单表代替的题,比如说: BH=CWG=EO=IEI=;DEDEDEY 所有数据长成这样,神TM能够认识对吧,但是要注意,这可是CTF的比 ...

  6. openjudge 1.12.8 Vigenere密码

    OpenJudge - 08:Vigenère密码 解题思路: 1.由题可得,明文通过密匙来变成密文,题目中所给的是密匙串和密文串,那就是根据这两个串来设定明文并输出 2.观察图中的信息,明文转密文的 ...

  7. 现代密码学1.4--现代密码的三大原则

    现代密码学1.4--现代密码的三大原则 正式的定义 安全条件 错误的 正确的 攻击模型 精确的假设 严格的安全性证明 博主正在学习INTRODUCTION TO MODERN CRYPTOGRAPHY ...

  8. 密码学基础知识(三)古典密码

    说完了前面那些,想起个事,本系列依据内容主要来自<现代密码学>马春光编著.我就是学这本书的. 好了,古典密码就是古时候的密码,哈哈,逗你玩的,shannon的保密系统的通信理论发表前的都是 ...

  9. 信息安全管理——数据编码与密码基础

    1.实验目的 (1)了解常见数据编码方法.原理: (2)掌握Base64编码基本原理和应用: (3)了解古典密码常用的加密方法,如替换.置换: (4)实践部分典型的古典加密,掌握通信加密的基本过程: ...

最新文章

  1. OpenCart之商品管理教程
  2. 怎样打造高效节能的数据中心
  3. 数据库平时错误和使用经验的总结
  4. C# 系统环境变量读取
  5. 程序员面试通关的 101 道真题
  6. NYOJ--1A+B Problem(练手题)
  7. moodle安装体验
  8. 移动端app开发,原生开发与混合开发的区别
  9. H3C的发展历史和与华为的关系
  10. 【AvalonDock】布局控件使用教程
  11. 美颜SDK的出现给直播和短视频平台带来了哪些影响?
  12. Python之列表和元组
  13. Git操作 【详细】【详细】
  14. 产品经理进修第四天 产品增长怎么做
  15. python expandtabs_详解Python中expandtabs()方法的使用
  16. 题目3 求n阶方阵的和(ok)
  17. PHP新版资阁网址导航源码+网站盲盒
  18. 国有企业如何建立现代企业制度
  19. 蜘蛛中可能会用到的正则
  20. 小裙子怎样画?如何画出一条好看又自然的小短裙?

热门文章

  1. 如何保存网页背景图片
  2. IoT-For-Beginners-Lesson2-farm
  3. 学习:关于游戏用户流失分析方法
  4. windows下监控本机网络状况
  5. 护士成绩用计算机改卷,解密!2020年卫生资格/护士人机对话考试如何评分?成绩如何核算?...
  6. Middleware概述
  7. Theme与Style
  8. 好无聊啊~ 来试试用Python采集下载漫画【附原码哟~】
  9. 互斥锁的使用(CreateMutex等使用)
  10. 写给还没看过武侠小说的人