Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >08:Vigenère密码

08:Vigenère密码

作者头像
attack
发布于 2018-04-03 10:30:43
发布于 2018-04-03 10:30:43
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

08:Vigenère密码

总时间限制: 1000ms 内存限制: 65536kB描述

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®ki,运算®的规则如下表所示:

Vigenère加密在操作时需要注意:

1. ®运算忽略参与运算的字母的大小写,并保持字母在明文M中的大小写形式;

2. 当明文M的长度大于密钥k的长度时,将密钥k重复使用。

例如,明文M=Helloworld,密钥k=abc时,密文C=Hfnlpyosnd。

明文

H

e

l

l

o

w

o

r

l

d

密钥

a

b

c

a

b

c

a

b

c

a

密文

H

f

n

l

p

y

o

s

n

d

输入输入共2行。  第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。 对于100%的数据,输入的密钥的长度不超过100,输入的密文的长度不超过1000,且都仅包含英文字母。输出输出共1行,一个字符串,表示输入密钥和密文所对应的明文。样例输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm

样例输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Wherethereisawillthereisaway

来源NOIP2012复赛 提高组 第一题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 using namespace std;
 6 char my[10001];//密钥
 7 char miwen[1001];//密文
 8 char mingwen[1001];//明文 
 9 char zd[101][101];//储存明文密文密钥的字典 
10 int yn1[1001];//是否需要-32 
11 int main()
12 {
13     scanf("%s",&my);
14     scanf("%s",&miwen);
15     int lmy=strlen(my);//密钥的长度 
16     int lmiwen=strlen(miwen);//明文的长度
17     for(int i=1;i<=26;i++)
18     {
19         char bg=(char)(i+64);
20         for(int j=1;j<=26-i+1;j++)
21         {
22             zd[i][j]=bg;
23             bg++;
24         }
25     }//建立字典 
26     for(int i=2;i<=26;i++)
27     {
28         char bg=64;
29         for(int j=26-i+1;j<=26;j++)
30         {
31             zd[i][j]=bg;
32             bg++;
33         }
34     }
35     for(int i=0;i<lmy;i++)
36     {
37         if(my[i]>=90&&my[i]<=122)
38         my[i]=my[i]-32;
39     }//将密钥全部转换为大写字母 
40     for(int i=0;i<lmiwen;i++)
41     {
42         if(miwen[i]>=97&&miwen[i]<=122)
43         {
44             miwen[i]=miwen[i]-32;    
45             yn1[i]=1;
46         }
47     }//将密文全部转换为大写字母 
48     int cs=lmiwen/lmy+1; 
49     while(cs!=1)
50     {
51         strncat(my,my,lmy);
52         cs--;
53     }//将密钥复制到足够长
54     /*for(int i=1;i<=26;i++)
55     {
56         for(int j=1;j<=26;j++)
57         {
58             cout<<zd[i][j]<<" ";
59         }
60         cout<<endl;
61     }//建立字典 */
62     for(int i=0;i<lmiwen;i++)
63     {
64         int amy=(int)my[i];//密文对应密钥的ascll码表
65         int amw=(int)miwen[i];//第i个密文的ascll码表 
66         if(amy<=amw)
67         {
68             if(yn1[i]==1)
69             {
70                 cout<<(char)(amw-amy+65+32);
71             }
72             else cout<<(char)(amw-amy+65);
73         }
74         else
75         //cout<<(char)(amy-amw+73);
76         {
77             int now=0;
78             for(int j=1;j<=26;j++)
79             {
80                 if(zd[26][j]==amw)
81                 {
82                     now=26+j;
83                     break;
84                 }
85             }
86                 if(yn1[i]==1)
87                 {
88                 cout<<char((now-(amy-64))+64+32);
89                 }
90                 else cout<<char((now-(amy-64))+64);
91         }
92     }
93     return 0;
94 } 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-03-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
维吉尼亚密码原理详解及算法实现
明文:量子通信保密技术的诞生和快速发展主要取决于以下两个因素: a、经典保密通信面临着三个难以彻底解决的关键问题,即密钥协商、身份识别和窃听检测,这些问题的有效解决需要新技术。b、在对新技术的探索中,人们发现了量子内在的安全特性及其可能的应用。 请写出你的密码机输出结果。
timerring
2022/08/03
1K0
维吉尼亚密码原理详解及算法实现
维吉尼亚密码及程序实现
凯撒加密 在密码学中,恺撒密码是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。恺撒密码通常被作为其他更复杂的加密方法中的一个步骤。恺撒密码还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,凯撒密码的密度是很低的,只需简单地统计字频就可以破译。 凯
三丰SanFeng
2018/01/16
2K0
维吉尼亚密码及程序实现
密码学实验报告
怎么说呢,我的同学们都在用C,就我在拿python写这东西,这一部分我以前用python完成过,2-1是经典单表替代密码,2-2是经典的凯撒密码,这都是很经典的密码术,前人的智慧,在这次写脚本解决的时候,都可以用暴力解决。
十二惊惶
2024/02/28
1860
华为机试题 HJ36 字符串加密
华为机试题 HJ36 字符串加密 题目描述: 描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理: 首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个, 将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。如下所示: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z T R A I L B Z E
ccf19881030
2023/02/26
6630
11:潜伏者
个人感觉这道题在字符串里面算是一个比较综合比较难的题目了 对于选手的数据查找能力有很强的要求 我在做这道题时运用了桶排的思想 不多说了,看代码吧,全网最简 11:潜伏者 总时间限制: 1000ms 内存限制: 65536kB描述 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。 历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则: 1、    S国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所的内容均由大写字母‘A’—‘Z’构成(无空格等其他字母)
attack
2018/04/03
1K0
CTF必会-古典密码与常见编码大全(全网最全)
本文属于OneTS安全团队成员flatcc的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
OneTS安全团队
2025/02/07
6740
CTF必会-古典密码与常见编码大全(全网最全)
常见密码和编码总结 CTF中Crypto和Misc必备
可以分作三部分组成 第一部分是:ASCII非打印控制字符 第二部分是:ASCII打印字符; 第三部分是:扩展ASCII打印字符
中龙技术
2022/09/30
8.2K0
常见密码和编码总结 CTF中Crypto和Misc必备
加解密
对称加密(SymmetricCryptography),以DES,AES,RC4 为代表。
tinyfisher
2019/11/20
2K0
CTF必备技能之编码大全
编码根据百度百科的解释:指的是信息从一个形式或格式传换为另一种形式的过程,也称为计算机编程语言的代码简称编码。从我们的祖先仓颉造字再到0-9的阿拉伯数字的广泛使用,信息的记录和转化的形式也越来越多样化。那么在计算机以及通信等数字化领域,以01数字为基础同样也演变出了适用计算机不同领域的编码方法。其实编码的本质就是在原有字符集的基础上根据规则进行格式的转换,在CTF中misc类型的题中少不了有编码的存在,作为ctf的基础必备技能,为此斗哥整合了目前ctf中出现的各种各样的编码,以作为新手入门的一二指南。
漏斗社区
2019/04/29
10.4K0
CTF必备技能之编码大全
单表代替密码原理及算法实现
    要了解单表替代密码就得先了解替代密码,在这里我就做一下简单的介绍:       替代是古典密码中用到的最基本的处理技巧之一 。       替代密码是指先建立一个替换表,加密时将需要加密的明文依次通过查表,替换为相应的字符,明文字符被逐个替换后,生成无任何意义的字符串,即密文,替代密码的密钥就是其替换表。       根据密码算法加解密时使用替换表多少的不同,替代密码又可分为单表替代密码和多表替代密码。       单表替代密码的密码算法加解密时使用一个固定的替换表。单表替代密码又可分为一般单表替代
Angel_Kitty
2018/04/09
3.8K0
单表代替密码原理及算法实现
四种分组密码操作模式的DES加解密算法——C语言实现
子密钥计算接受初始密钥或者上一轮的密钥作为输入,如果是初始密钥则进行 PC1 置换,然后将密钥分为左右两部分,对这两部分进行 LS 置换,置换后将结果合并并经过 PC2 置换得到此轮的子密钥。子密钥计算过程如下:
Andromeda
2023/12/03
5910
四种分组密码操作模式的DES加解密算法——C语言实现
【C++】基础:加密算法介绍与部分实现
加密就是通过密码算法对数据进行转化,使之成为没有正确密钥任何人都无法读懂的报文。而这些以无法读懂的形式出现的数据一般被称为密文。为了读懂报文,密文必须重新转变为它的最初形式——明文,而含有以数学方式转换报文的双重密码就是密钥。
DevFrank
2024/07/24
1.1K0
【C++】基础:加密算法介绍与部分实现
【kAriOJ】离散数学春季学期编程测试 1
给你n,e,和一串明文。用(n,e)加密明文。将明文字母转换成数字,按8位数字分段,不足部分补足0。明文中有非字母删除,A和a转成数字都是00, Z和z转成数字都是25。明文数字8位分段的每一段对应的密文也要求是8位,如果不足8位,前面补足0。
饶文津
2020/06/02
4850
Python 密码破解指南:15~19
直到一个文明在包括数学、统计学和语言学在内的几个学科中达到足够复杂的学术水平,密码分析才能被发明出来。
ApacheCN_飞龙
2023/10/13
1.6K0
Python 密码破解指南:15~19
初识密码学
密码学初识 首先要区分的是编码法和加密法,虽然两者都是用来加密信息的方法,但是他们是以完全不同的方式进行的。编码法就是用字、短语或数字来代替明文。例如,“bomb”可能在消息中以数字“1508”的形式出现,从码文还原明文不存在算法或秘钥。生成码文或还原码文需要一本编码簿,它列出了所有数字(或代替字符)和与之相应的明文字、短语或字母。加密法则是使用算法或秘钥来加密信息。 一 替换加密法 先来介绍一下最简单的替换加密法:凯撒加密法 凯撒使用的秘钥是移动3位。首先按顺序写下26个字母:ABCDEFGHIJKLM
安恒网络空间安全讲武堂
2018/02/06
9040
初识密码学
两个转子的转轮机原理详解与算法实现
​ 首先了解关于Rotor Machines的概念,转轮机由一个键盘和一系列转轮组成,每个转轮是26个字母的任意组合。转轮被齿轮连接起来,当一个转轮转动时,可以将一个字母转换成另一个字母。照此传递下去,当最后一个转轮处理完毕时,就可以得到加密后的字母。还有一个经典的实例——Enigma-machine。
timerring
2022/07/20
6430
两个转子的转轮机原理详解与算法实现
30余种加密编码类型的密文特征分析(建议收藏)
一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串,如图。如果出现这个范围以外的字符说明这可能是个错误的md5值,就没必要再拿去解密了。16位值是取的是8~24位。
爱国小白帽
2020/11/16
87.2K3
加密与安全_ 凯撒密码
凯撒密码是一种简单的替换加密技术,也称为移位密码。它是古典密码学中最早的密码之一,得名于古罗马军队领袖凯撒·尤利乌斯(Julius Caesar),据说他曾经使用过这种加密方法。
小小工匠
2024/05/26
3170
加密与安全_ 凯撒密码
密码学原理与实践笔记 - wuuconix's blog
移位密码。和凯撒密码原理类似。只不过移动的key不是3而可以是0~25中的任何值。所以Caesar Cipher是Shift Cipher的一种特例。
wuuconix
2023/03/13
9640
密码学原理与实践笔记 - wuuconix's blog
蓝桥杯之密钥
一种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,在方阵中找到以这两个字母为顶点的矩形(红色字体): 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
Max超
2019/01/21
7790
相关推荐
维吉尼亚密码原理详解及算法实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验