Vigen#232;re密码
来源 NOIP2012复赛 提高组 第一题
- 描述
-
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行,一个字符串,表示输入密钥和密文所对应的明文。
- 样例输入
-
CompleteVictory Yvqgpxaimmklongnzfwpvxmniytm
- 样例输出
-
Wherethereisawillthereisaway
分析:
观察运算®的规则表格发现该表格是左下和右上对称的,也就是说:可以认为加密时行标题是明文、列标题是密钥;也可以认为加密时行标题是密钥,列标题是明文。这里我们把行标题看做明文,列标题看做密钥。
然后还可以发现:加解密运算规则表格的每一列其实是把行标题加上一个对应值就可以转换出来的。例如:表格中的第0列(即密钥为A的那一列)是把行标题各字母分别加0转换而来;表格中的第1列(密钥为B的那一列)是把行标题各字母分别加1转换而来;……以此类推,我们可以发现一个规律:
明文字母 = (密文字母-A - (密钥字母 - A) + 26 ) mod 26 + A
上面公式里面加或减A是为了求得对应的密文字母或密钥字母在26个英文字母表当中的序号(0~25),所以需要讨论密文字母和密钥字母的大小写然后再决定是减去(或加上)大写A或小写a。具体的讨论可以看代码。
1 #include <stdio.h> 2 int main() 3 { 4 char k[102],c[1002]; 5 int i,j; 6 char temp; 7 8 scanf("%s",k); 9 getchar(); 10 scanf("%s",c); 11 12 for(i=0,j=0;c[j]!='\0';j++) 13 { 14 15 if(c[j]>='A'&&c[j]<='Z') 16 { 17 if(k[i]>='A'&&k[i]<='Z') 18 temp=(c[j]-'A'-(k[i]-'A')+26)%26+'A'; 19 else temp=(c[j]-'A'-(k[i]-'a')+26)%26+'A'; 20 } 21 else 22 { 23 if(k[i]>='A'&&k[i]<='Z') 24 temp=(c[j]-'a'-(k[i]-'A')+26)%26+'a'; 25 else temp=(c[j]-'a'-(k[i]-'a')+26)%26+'a'; 26 } 27 printf("%c",temp); 28 i++; 29 if(k[i]=='\0') i=0; 30 } 31 return 0; 32 }
当然,简单不费脑力的做法也可以实现,即:直接手工或者写代码构造出一个二维数组存储的运算表格,然后解密时用密钥确定列,用密文确定行即可得到明文。
Vigen#232;re密码相关推荐
- java文件加密解密实验报告_《网络信息安全技术》_实验报告_破译vigenamp#232;re_密码加密的密文...
<<网络信息安全技术>_实验报告_破译vigen&#232;re_密码加密的密文>由会员分享,可在线阅读,更多相关<<网络信息安全技术>_实验报 ...
- uni-app实战开发
1.项目引见.mp4 2.课程更新阐明.mp4 3.开发环境搭建.mp4 4.创立uniapp项目.mp4 5.安卓真机调试配置.mp4 6.IOS真机调试配置.mp4 7.微信小程序调试配置.mp4 ...
- 最新uni-app实战仿糗事百科app开发教程完整版
课程概述: 本季度为uni-app实战项目第一季度,将实战开发仿糗事百科app,其中会包括发布到安卓端app,IOS端app.微信小程序和支付宝小程序. 章节1项目介绍(买前必看) 课时1项目介绍(买 ...
- Android逆向之路---Faceu的登录功能真的只提交了用户名和密码吗
问题 几乎99%的软件都有登录功能,而登录这一个动作真的将我们的用户名和密码上传到了服务器吗,会不会有个人隐私呢.根据我们这个问题,我们用FaceU这个软件,逆向来看看他的登录功能到底都传了什么数据. ...
- 使用JNA解决自动化测试无法做密码输入操作的问题
https://blog.csdn.net/bolg_hero/article/details/50072859 在做页面自动化(以使用selenium为例)的时候,很常见的一个场景就是输入密码.往往 ...
- 多台Linux服务器SSH相互访问无需密码--转
一.环境配置 1.系统:CentOS release 5.6 IP:192.168.4.200 主机名:JW01 2.系统:CentOS release 5.9 IP:192.168.4. ...
- linux 生成密码本,Linux下CentOS7使用OTPW实现双因子密码本登录
otpw优点: 1.前缀密码+一次性随机码,相当于双重加密.就算随机码列表泄露,没有前缀密码也是无法登录. 2.如果一次没登录成功,会启用三重随机码. 3.用户目录下保存密码的文件可通用,适合批量部署 ...
- linux 无密码登录另一台服务器,ECS Linux服务器ssh免密码登录另外一台服务器的具体设置...
若有多台linux服务器,为方便起见,服务器之前可设置免密码ssh登录,具体操作参考如下所示: 1 .登录其中一个服务器,执行ssh-keygen -t rsa,按3次回车,将会生成公钥和私钥文件id ...
- 多台Linux服务器SSH相互访问无需密码
一.环境配置 1.系统:CentOS release 5.6 IP:192.168.4.200 主机名:JW01 2.系统:CentOS release 5.9 IP:192.168.4. ...
最新文章
- 修改表字段类型长度_PG修改字段
- 直击3.15 安防行业如何维护消费者权益
- Mac下运行git报错xcrun: error: invalid active developer path ..
- 白银T+D [Ag(T+D)]业务介绍
- Android 系统(206)---Android 学习网站汇总
- 查看指定进程io状态的iotop命令
- mysql解释命令,MySQL中EXPLAIN解释命令
- php购物车点击删除,求助 购物车 用session删除 列表的一条
- 局域网下搭建项目管理服务器,如何低成本快速搭建局域网地图服务器
- QMS-云质-质量管理软件-企业数字化质量管理解决方案
- 旅游日记——2000元北京6天5夜游
- 程序闪退崩溃的几种原因
- 百度快照劫持的表现及解决方法
- uni-app中使用腾旭位置服务,实现周边搜索功能,并获取到前往对应位置所需的时间(步行或驾车)
- arduino的基本函数
- 串口编程之一: WIN32 API 中串口DCB 结构的介绍
- 阿里云智能身份证OCR文字识别
- 泡泡机市场前景分析及行业研究报告
- Python实现ARMA模型
- 微信公众平台网页授权