学习目标:

维吉尼亚密码是古典密码中非常具有代表的例子。本实验要求用高级语言编写和调试一个简单的维吉尼亚密码实现及解密程序,通过本实验可以加深理解维吉尼亚密码原理。


预备知识:

人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。它是由16世纪法国亨利三世王朝的布莱瑟•维吉尼亚发明的。维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。维吉尼亚密码的密钥空间大小为26m,所以即使m的值很小,使用穷尽密钥搜索方法也需要很长的时间。例如,当m=5时,密钥空间大小超过1.1*107,这样的密钥量已经超出了使用手算进行穷尽搜索的能力范围。

维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:

TO BE OR NOT TO BE THAT IS THE QUESTION

当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:

密钥:RELAT IONSR ELATI ONSRE LATIO NSREL

明文:TOBEO RNOTT OBETH ATIST HEQUE STION

密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY

历史上以维吉尼亚密表为基础又演变出很多种加密方法,其基本元素无非是密表与密钥,并一直沿用到二战以后的初级电子密码机上。

加密流程:

(1)编号。将A-Z以编号0-25编号;

(2)选取密钥。举例:wangyuhang;

(3)明文处理。去掉所有空格;举例:明文为we are discovered save yourself;处理后:wearediscoveredsaveyourself;

(4)密钥处理。将密钥重复排列;处理后:wangyuhangwangyuhangwangyuh;

(5)加密。举例:明文第一个字母W编码为22,密钥第一个字母为W编码为22;22+22=44,因为44>26,所以44-26=18;18对应字母为Q,故将W加密为Q;明文第二个字母E编码为4,密钥第二个字母为A编码为0;4+0=4,4对应字母为E,故将E加密为E;以此类推;

(6)输出密文。举例:senxadvyyoikneqywvrekueyals。

解密流程:

(1)编号。将A-Z以编号0-25编号;

(2)获取密钥。举例:wangyuhang;

(3)密文处理。去掉所有空格;处理后:senxadvyyoikneqywvrekueyals;

(4)密钥处理。将密钥重复排列;处理后:wangyuhangwangyuhangwangyuh;

(5)解密。举例:密文第一个字母Q编码为18,密钥第一个字母为W编码为22;18-22=-4,因为-4<0,所以-4+26=22;22对应字母为W,故将Q解密为W;密文第二个字母E编码为4,密钥第二个字母为A编码为0;4-0=4,4对应字母为E,故将E解密为E,以此类推;

(6)明文处理。根据相关语言释读,按照正确的语言格式整理明文;举例:we are discovered save yourself。


实验代码:

#include <iostream>
#include <cstring>
using namespace std;
#define MINCHAR 97
#define CHARSUM 26
char table[CHARSUM][CHARSUM];
bool Init();
bool Encode(char* key, char* source, char* dest);
bool Dncode(char* key, char* source, char* dest);
int main()
{if(!Init()){cout << "初始化错误!" << endl;return 1;}char key[256];char str1[256];char str2[256];int operation;while(1){do{cout << "请选择一个操作:1. 加密;2. 解密;-1. 退出\n";cin >> operation;}while(operation != -1 && operation != 1 && operation != 2);if(operation == -1)return 0;else if(operation == 1)//加密{cout << "请输入密钥:";cin >> key;cout << "请输入待加密字符串:";cin >> str1;Encode(key, str1, str2);cout << "加密后的字符串:" << str2 << endl;}else if(operation == 2)//解密{cout << "请输入密钥:";cin >> key;cout << "请输入待解密字符串:";cin >> str1;Dncode(key, str1, str2);cout << "解密后的字符串:" << str2 << endl;}cout << endl;}return 0;
}
// 初始化维吉尼亚方阵
bool Init()
{int i, j;for(i = 0; i < CHARSUM; i++){for(j = 0; j < CHARSUM; j++){table[i][j] = 65 + (i + j) % CHARSUM;}}return true;
}
// 加密
// key:密钥
// source:待加密的字符串
// dest:经过加密后的字符串
bool Encode(char* key, char* source, char* dest)
{char* tempSource = source;char* tempKey = key;char* tempDest = dest;do{*tempDest = table[(*tempKey) - MINCHAR][(*tempSource) - MINCHAR];tempDest++;if(!(*(++tempKey)))tempKey = key;}while(*tempSource++);dest[strlen(source)] = 0;return true;
}
// 解密
// key:密钥
// source:待解密的字符串
// dest:经过解密后的字符串
bool Dncode(char* key, char* source, char* dest)
{char* tempSource = source;char* tempKey = key;char* tempDest = dest;char offset;do{offset = (*tempSource) - (*tempKey);offset = offset >= 0 ? offset : offset + CHARSUM;*tempDest = MINCHAR + offset;tempDest++;if(!(*(++tempKey)))tempKey = key;}while(*++tempSource);dest[strlen(source)] = 0;return true;
}

实验结果:

思考:

1.维吉尼亚密码属于单表密码还是多表密码?

2.维吉尼亚密码中加密密钥和解密密钥相同吗?

答案:

1.多表密码。

2.相同。

古典密码之维吉尼亚密码实验相关推荐

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

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

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

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

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

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

  4. 古典密码之“维吉尼亚密码”

    简述 维吉尼亚密码是在代换密码(即单表代换)基础上,衍生出来的多表代换密码. 与单表代换相同,维吉尼亚密码也采用明文字母与密钥字母(即26字母表)间建立一一对应关系. 但是不同的是,单表代换密码中一旦 ...

  5. Java实现凯撒密码、维吉尼亚密码、双换位密码、RC4算法加密

    文章目录 前言 一.凯撒密码 二.维吉尼亚密码 三.双换位密码 四.RC4算法加密 前言 本博文为信息安全与支付课程的课程作业. 一.凯撒密码 文件有:Caesar.java.输入文件input1.t ...

  6. MTALAB实现多表代替密码(维吉尼亚密码)

    维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式. 设d为一固定的正整数,d个位移代换表π=(π1,π2,-,πd),由密钥序列K=(k1,k2 ...

  7. 古典密码之维吉尼亚密码破解思路

    首先要说一句,这是我第一次用python coding,所以很多地方都不太懂,吐槽自己竟然用sum当变量名,之后有用sum()函数,然后报了错还不知道为什么.不知道用ascii码要做chr()转化,等 ...

  8. java维吉尼亚密码_维吉尼亚密码java完整版

    package cn.longxuzi; import org.junit.Test; public class Chi_SquareUtils { private static final ICUt ...

  9. 古典密码(单表密码,维吉尼亚密码,普莱费尔密码,一次一密)

    古典密码 1.单表密码(仿射加密) 仿射加密变化是:y=ax+b 算法: 仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母. A B C ...

最新文章

  1. HTML5 Canvas translate与rotate应用
  2. Shadow of Survival
  3. P3865 【模板】ST 表【又称RMQ】
  4. Mysql Order By 注入总结
  5. angular 动画_如何在Angular 6中使用动画
  6. Qt图形界面编程入门(基本窗口及控件)
  7. java tlv协议_看懂通信协议:自定义通信协议设计之TLV编码应用
  8. MVPArms MVP快速集成框架
  9. (01)f103,4pin四脚的 oled(01)
  10. NCRE教材笔记 第一章操作系统概论
  11. 《Python编程:从入门到实践》中的小练习(1)
  12. hibernate学习之四——Query和Criteria接口
  13. Guessing Game
  14. 网络攻防学习心得一(20159320)学习小结
  15. 第六天----数据结构笔记
  16. 响应式织梦模板玩具动漫类网站
  17. Java-ZZH1-78面试题
  18. echarts实现双y轴,并且实现制定数据使用y轴
  19. 使用signal函数自定义信号处理方式
  20. gpib linux 驱动下载,自动化测试—GPIB工具实现

热门文章

  1. Unity Shader总结(八)——光源类型和光照衰减
  2. [Vue Router warn]: Discarded invalid param(s) “id“ when navigating. Seexxxxxxxfor more details
  3. 解决AD导入dxf文件时报some entities were discarded during import?的问题
  4. lumia手机邮件hotmail服务器设置,采用Windows10Mobile系统的Lumia手机用户手册-Microsoft.PDF...
  5. swftools工具将pdf文件转换为swf文件 文字丢失
  6. 英特尔重磅亮相中国开源顶会,分享开源心经:开源开放、生态共赢
  7. html5 text align,CSS属性参考 | text-align
  8. 深入java--与MySQL连接时的时间类问题以及Calendar的用法
  9. 真皮商务笔记本【无忧币礼品】
  10. Ribbon的介绍和使用(一)