目录

1、原理

2、流程图

3、编程实现

4、总结


1、原理

        维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。

1508年时,约翰尼斯·特里特米乌斯《隐写术》中发明的表格法成为了维吉尼亚密码的关键部分。这一加密技术也称为特里特米乌斯密码。这一方法真正出现是在吉奥万·巴蒂斯塔·贝拉索于1553年所著的书《吉奥万·巴蒂斯塔·贝拉索先生的算术》中。他以特里特米乌斯的表格法为基础,同时引入了密钥的概念。布莱斯·德·维吉尼亚于1586年亨利三世时期发明了更为简单却又更有效的自动密钥密码(autokey cipher)。之后,19世纪时贝拉索的方法被误认为是由维吉尼亚首先发明的,所以被称为维吉尼亚密码

在凯撒密码中,每一个字母会有一定的偏移量变成另外一个字母,而维吉尼亚密码就是有多个偏移量不同的凯撒密码组成。维吉尼亚密码加密需要一个表格。表格是一个26*26的矩阵,每一行由26个英文字母组成,每一行由前一行向左偏移一位得到。加密时,明文字母作为列,对应的密钥字母作为行,所确定的坐标上的字母即为对应的密文字母,以此类推,循环使用密钥,得到密文。

用数字0-25代替字母A-Z,维吉尼亚密码加密算法为:

​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

解密算法为:

​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

2、流程图

3、编程实现

可以打表密码表,也可以取模计算,这也使用取模计算来加解密。

具体代码如下:

默认输入为小写英文字母可以带空格

        主函数wjnyCipher.cpp

#include"wjny.h"int main() {while (1) {show();     //菜单界面keyDown();    //按键处理system("pause");system("cls");}
}

 wjny.h  

#pragma once
#include<cstdio>
#include<iostream>
#include<cstring>
#include<Windows.h>
using namespace std;
void init();
void show();
void keyDown();
void readFile();
void saveFile();
void encrypt();
void decrypt();

        wjny.cpp  

#include "wjny.h"string fileStr = "";
string finalStr = "";void init()//初始化
{fileStr = "";finalStr = "";
}void show()
{cout << "***************维吉尼亚密码***************" << endl;cout << "\t\t1.加密文件" << endl;cout << "\t\t2.解密文件" << endl;cout << "\t\t3.退出" << endl;cout << "******************************************" << endl;}void keyDown()//按键处理
{int userkey = 0;cin >> userkey;switch (userkey) {case 1:cout << "-----------------加密文件-----------------" << endl;readFile();encrypt();saveFile();init();break;case 2:cout << "-----------------解密文件-----------------" << endl;readFile();decrypt();saveFile();init();break;case 3:exit(0);break;}
}void readFile()//读取文件
{cout << "请输入文件名:" << endl;string fileName;cin >> fileName;FILE* fp = fopen(fileName.c_str(), "r+");if (fp == nullptr) {cout << "未找到相关文件" << endl;return;}else {cout << "成功打开文件" << endl;}char ch;int pos = 0;while ((ch = fgetc(fp)) != EOF) {fileStr += ch;}cout << endl << "待处理的文件为:" << endl;cout << fileStr << endl;fclose(fp);
}void saveFile()//保存文件
{string fileName;cout << endl << "请输入要保存信息的文件名:" << endl;cin >> fileName;FILE* fp = fopen(fileName.c_str(), "w+");if (fp == nullptr) {cout << endl << "保存文件失败" << endl;return;}else {cout << endl << "保存成功" << endl;}fprintf(fp, "%s", finalStr.c_str());fclose(fp);}void encrypt()//加密文件
{string key;cout << endl << "请输入密钥:" << endl;cin >> key;cout << endl << "按下任意键进行加密" << endl;char ch = getchar(); ch = getchar();int pos = 0;for (char ch : fileStr) {if (ch == ' ') {finalStr += ' ';}else {finalStr += (ch - 'a' + key[pos] - 'a') % 26 + 65;pos = (pos + 1) % key.size();}}cout << endl << "得到的密文为:" << endl;cout << finalStr << endl;
}void decrypt()//解密文件
{string key;cout << endl << "请输入密钥:" << endl;cin >> key;cout << endl << "按下任意键进行解密" << endl;char ch = getchar(); ch = getchar();int pos = 0;for (char ch : fileStr) {if (ch == ' ') {finalStr += ' ';continue;}else {finalStr += (ch + 32 - 'a' - (key[pos] - 'a') + 26) % 26 + 97;pos = (pos + 1) % key.size();}}cout << endl << "得到的明文为:" << endl;cout << finalStr << endl;
}

4、总结

对包括维吉尼亚密码在内的所有多表密码的破译都是以字母频率为基础的,但直接的频率分析频率分析却并不适用。例如,如果P是密文中出现次数最多的字母,则P很有可能对应E(前提是明文的语言为英语)。原因在于E是英语中使用频率最高的字母。然而,由于在维吉尼亚密码中,E可以被加密成不同的密文,因而简单的频率分析在这里并没有用。

破译维吉尼亚密码的关键在于它的密钥是循环重复的。如果我们知道了密钥的长度,那密文就可以被看作是交织在一起的凯撒密码,而其中每一个都可以单独破解。使用卡西斯基试验弗里德曼试验来得到密钥的长度。(百度百科上面抄的)

维吉尼亚密码 (原理+代码)相关推荐

  1. 维吉尼亚密码原理、代码

    1.使用维吉尼亚密码的原因 (1)单表代换密码的安全性不高,一个原因是一个明文字母只有一个密文字母代替 (2)构造多个密文字母表,在密钥的控制下用相应密文字母表中的一个字母来代替明文字母表中的一个字母 ...

  2. 维吉尼亚密码原理图解

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

  3. 维吉尼亚密码破解(Python完整详细源码)

    维吉尼亚密码破解(Python完整详细源码) 欢迎大家访问我的GitHub博客 https://lunan0320.github.io/ 文章目录 维吉尼亚密码破解(Python完整详细源码) 1.写 ...

  4. 维吉尼亚密码详解及C语言实现

    维吉尼亚密码详解及C语言实现 文章目录 维吉尼亚密码详解及C语言实现 0x01 维吉尼亚密码 0x02 维吉尼亚密码原理 0x03 维吉尼亚密码CTF题目 0x04 C语言实现 图片地址:https: ...

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

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

  6. 维吉尼亚c语言编码原理,维吉尼亚密码的C语言实现

    维吉尼亚密码的C语言实现 2016春 密码学原理 软件学院 密码学原理作业报告 作业1:古典密码体制的实践与分析 姓名 查志华 院系 软件学院 学号 1133710313 任课教师 刘绍辉 指导教师 ...

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

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

  8. 信息安全——维吉尼亚密码算法(C++实现)

    信息安全导论课程学习的实验一,维吉尼亚密码算法C++的实现. 维吉尼亚密码算法是一种代换密码算法,直观上来说,密钥一般短于明文长度,因此加密时需要将明文根据密钥长度进行分组,每一组明文根据密钥对应(0 ...

  9. 维吉尼亚密码加解密与破解

    实验目的 1.进一步理解维吉尼亚密码的加解密原理 2.进一步理解维吉尼亚密码的缺陷和利用方法 3.提高编程实践能力 实验要求 1.实现维吉尼亚加解密函数 2.破解维吉尼亚加密的密文 实验步骤 1.维吉 ...

最新文章

  1. 如何把a1的图纸变成a0_「云顶之弈装备解析」面对回蓝——青龙刀与大天使究竟该如何取舍...
  2. imx6 休眠 功耗 电流_无线物联网和可穿戴设备的低功耗电源测量挑战
  3. invalid currency could not be saved in AG3
  4. Ubuntu gerrit 安装配置
  5. wordpress创建_如何创建WordPress儿童主题
  6. 排除包_冷水机压缩机压缩机常见故障和排除方法
  7. nginx 与fastcgi通信方式
  8. 实现人人网爬去数据(opener)
  9. Ubuntu下利用QSS、WPS破解wpa/wpa2加密
  10. ABAQUS盾构隧道开挖模型Cae文件,一环7片,含螺栓,配筋。 (此模型用的㎜单位制)
  11. 在三维空间中表示平面和直线
  12. c语言中malloc的作用,malloc函数-malloc函数,详解
  13. 中国农业大学计算机专业硕士研究生,中国农业大学计算机专业2020考研复试分数线...
  14. 狂神 redis笔记 docker
  15. Win10 AMD610显卡驱动安装出现错误206安装失败
  16. 实验吧天网管理系统Writeup
  17. 我的折腾日记-- Ubuntu 16.04
  18. Transformers预训练模型使用:文本摘要 Summarization
  19. WEB漏洞之:海洋CMS代码执行(CNVD-2020-22721)
  20. 一文搞清楚Web和WWW是什么?

热门文章

  1. SecureCRT SSH窗口防断开之全局设置
  2. <<视觉问答AAAI>>2022:An Empirical Study of GPT-3 for Few-Shot Knowledge-Based VQA
  3. 家用机器人扫机外毛刷_家用扫地机毛刷的选择技巧
  4. 删除未完全卸载的公式编辑器的注册表
  5. java使用inputStream_Java使用InputStream读写文件
  6. 详解Spring循环依赖
  7. JZOJ4248.【五校联考7day1】n染色
  8. Python 进程池 回调函数
  9. Kerberos协议探索系列之扫描与爆破篇
  10. grep报Binary file standard input matches