文章目录

  • 前言
  • 一、维吉尼亚密码简介
  • 二、维吉尼亚算法
    • 1.加密算法
    • 2.解密算法
    • 3.主函数
  • 总结

前言

本内容为博主学习维吉尼亚密码的笔记,如有错误,烦请指正。


一、维吉尼亚密码简介

维吉尼亚密码是一种使用多表代换的代换密码,是在凯撒密码的基础上扩展出来的多表密码。
维吉尼亚密码引入了“密钥”的概念,根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。
例子如下(密钥为deceptive):

二、维吉尼亚算法

1.加密算法

维吉尼亚密码是由d个字母序列给定的密钥ki(i∈[1,d]),ki确定第i+td(t为整数)个字母的移位次数。
现代维吉尼亚密码代换表如下,第一行为密钥,第一列为明文,某明文对应密钥加密产生的密文即为该行该列处的字母。

引入头文件

#include <stdio.h>
#include <string.h>

以下加密示例区分大小写字母,统一加密为大写字母,密钥默认小写字母,加密核心算法为移位的操作,计算相对位移从’A’开始往右移,同时要注意密钥的循环,如有其他需要如密钥为大小写混合或者加密为小写字母可进行修改,加密函数代码如下:

//加密函数:统一加密为大写字母
void encrypt(char *text, char *result, char *k)
{int i,j=0,z=0;for(i=0;i<strlen(text);i++)//在明文长度内循环{if(text[i]>='a' && text[i] <= 'z')  //小写字母result[z]=(text[i]-'a'+k[j]-'a')%26 +'A';else                               //大写字母result[z]=(text[i]-'A'+k[j]-'a')%26 +'A';j++;if(j>=strlen(k)) j=0;//以密钥长度为一个周期循环z++;}
}

2.解密算法

解密算法为逆着加密的方法移位回去即可,此处统一解密为小写字母。

//解密函数:统一解密为小写字母
void decrypt(char *text, char *result, char *k)
{int i,j=0,z=0;for(i=0;i<strlen(text);i++){if(text[i]>='a' && text[i] <= 'z')//小写字母result[z]=(text[i]-k[j]+26)%26 +'a';else                              //大写字母result[z]=(text[i]-k[j]+58)%26 +'a';j++;if(j>=strlen(k)) j=0;//以密钥长度为一个周期循环z++;}
}

3.主函数

测试主函数代码如下:

void main()
{int type;printf("欢迎来到维吉尼亚密码系统!");while(1){char text[99]="";char result[99]="";char k[99]="";printf("\n0:退出 1:加密 2:解密\n");printf("请输入你的选择:");scanf("%d",&type);if(type == 0){printf("系统退出。\n");break;}printf("请输入一段英文字母:");//默认输入为一段连续英文字母串scanf("%s",text);printf("请输入密钥:");//密钥默认小写scanf("%s",k);if(type ==1){  encrypt(text,result,k);printf("密文为:%s\n",result);//输出密文}else if(type == 2){decrypt(text,result,k);printf("明文为:%s\n",result);//输出明文}elseprintf("输入有误!请重新输入!\n");}
}

测试用例如下:


总结

维吉尼亚密码的优势在于这种密码被假定为它将不同位置的字母进行不同的加密,很多年来一直认为维吉尼亚密码是无法破解的,但19世纪50年代一位英国富人查尔斯·巴贝奇通过寻找重复的字母段破解了这个密码系统。 在任何比密钥要长得多的加密信息中,都会不可避免地出现类似这样的重复。而一个解密者应该如何才能揭示加密文件的真正面目呢?比如,如果加密文字"UPK"出现了两次,第一个"U"到下一个"U"会数21个字母,那么他就可以推断出密钥的长度是21的整除数。或者换种说法,他可以推断出21是密钥的倍数。 如果获得了足够多类似的线索,解密者就可以知道密钥的确切长度。一旦他知道了密钥长度,他就可以对加密信息进行日常频率分析。
经过学习,编程搞定了维吉尼亚密码算法,也算是比较简单的一个加密密码算法,但在过程中还是由于加解密的逻辑问题导致bug不断,不过只要多尝试及计算还是可以解决的。

密码学——维吉尼亚密码相关推荐

  1. 密码学 | 维吉尼亚密码(Vigener)

    1 单字母替换(前备知识) 在大量英文文献以及普通英文文章中,研究者发现这种文章中单词出现的频率符合一定的规律.如上表所示,例如a出现的频率在8.2%左右,e出现的频率最高,在12.4%左右.y.z频 ...

  2. 密码学之维吉尼亚密码

    密码学浅谈 密码学五元组:明文(P),密文(C),密钥(K),加密算法(E),解密算法(D),S={P,C,K,E,D} 密码学的信息安全系统目标:C,I,A C(Confidentiality):机 ...

  3. 维吉尼亚密码和一次性密码本_密码学中的一次性密码

    维吉尼亚密码和一次性密码本 The One-time Pad cipher is almost similar to the Vernam cipher, as, like the vernam ci ...

  4. 实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...

    题目: 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码"BLOCKCIPHERDESIGNPRINCIPLE", 但是它忘记了密钥是什么, 手头(爪头)只有它自己加密过 ...

  5. 密码学笔记——维吉尼亚密码

    维吉尼亚密码 一.简介 维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式. 二.加密算法 直接拿例子来说,比如我要加密一段明文        明文:THISISTO ...

  6. 密码学(二):古典密码之维吉尼亚密码的破解

    维吉尼亚密码的破解 一.引言   上一章我们介绍了维吉尼亚密码的原理,是通过移位替换的加密方法进行加密,但是因为概率论的出现这种简单的移位或替换就容易破解了,其原理很简单,英文中字母出现的频率是不一样 ...

  7. 【密码学原理与实践】(四)维吉尼亚密码 符java代码实现

    维吉尼亚密码(Vigenere Cipher) 转载请著明出处 无论是移位密码还是代换密码,一旦秘钥被选定,则每个字母对应的数字都被加密变换成对应的唯一数字.我们称这种为单表代换密码,而本篇讲的是一种 ...

  8. 几分钟学会密码学(一)——维吉尼亚密码

    1.维吉尼亚密码加密原理: 26个英文字母(a-z)对应26个个自然数(0-25),也就是a对应0,b对应1,c对应2,以此类推. 2.维吉尼亚密码加密方法: 假设明文信息是abcd,密码是ab,那么 ...

  9. python 古典密码第一弹(凯撒密码,Playfair密码,维吉尼亚密码)

    各位白嫖-漂亮大哥哥姐姐们好,在下菜鸡一枚,主要想在这和大家一起探讨学习之道,一起愉快的学习密码学基础.总所周知,密码学学的好,头发掉的少... 直接进入正题,今天我就主要讲三个密码,而且都是古典密码 ...

最新文章

  1. Springboot+vue前后端分离考试系统
  2. 未捕获ReferenceError:未定义$?
  3. vue-route+webpack部署单页路由项目,访问刷新出现404问题
  4. 【数据结构-查找】2.字符串(逐步演绎过程,超级详解KMP算法)
  5. Ubuntu: Eclipse Tensorflow不能加载CUDA( libcublas.so.10.0:cannot open shared object file:No such file )
  6. Eclipse下导入外部jar包的3种方式
  7. day_01 解析简单的程序
  8. leetcode75
  9. mysql最多多少slave_MySQL5.7主从,单slave多master
  10. kafka 消息顺序写入服务器
  11. 【2020年高被引学者】 朱松纯 北京大学
  12. java文件边读边写_[Java教程]node.js 利用流实现读写同步,边读边写
  13. Python基础(适合初学-完整教程-学习时间一周左右-节约您的时间)
  14. linux 计算标准差,shell计算均值和标准差的工具:datamash
  15. MotoSimEG-VRC软件:多机器人信号交互与PLC功能
  16. 愚公移山和加特林打僵尸(递归)
  17. 会议录音转文字(PC版)
  18. 到底是否应该重复造轮子
  19. 10驾校科目一考试系统——窗口交互
  20. REAL-TIME RENDER 4th Chapter 23 Graphics Hardware

热门文章

  1. 好奇号火星车旅行日志January 25, 2017 – Wednesday火星日1591-1592车轮检查
  2. UIImageView 作为tableHeaderView 遮挡cell,无情无耻无理取闹
  3. java inputstream write_将Java InputStream的内容写入OutputStream的简便方法
  4. html5设计礼品盒效果,30个创意包装设计例子
  5. linux 内核 sscanf,原来sscanf函数可以这么强大
  6. 求圆环的面积 C语言
  7. windows忘记开机密码怎么办
  8. 侯捷C++->虚函数与多态
  9. 使用struts2中的codebehind插件
  10. matlab根据乐谱播放音乐,科学网-[原][Matlab][04] Midi音乐键盘-王楠的博文