维吉尼亚密码简介

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

维吉尼亚密码分析

明文T字符 密钥是R 对应的密文是K?从数学角度 有没有规律可寻呢?我们仔细看图,每一行每一列都是26个连续的字母,不同字母开头反正都是循环一圈,

从明文T到 密文K 是不是经历了17个单元,恰巧是密钥R在26个元素中的下标17

我们将 A—Z密钥看作0—25个数,明文字符在A—Z循环链表走过 密钥个数结点 到密文结点。说的太拗口,举个简单例子,明文是 T ,密钥是B那么 T 走1个位置 是 U ,那么 明文就T的密文 就是U。看图 查看密钥是不是。

循环链表实现方式

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define OK 1
#define ERROR 0typedef int Status;
typedef char EleType;
//双向循环链表 结点数据结构
typedef struct DulNode
{EleType data;//数据域struct DulNode* next;//后继结点指针域struct DulNode* prior;//前驱结点指针域
}DulNode, *DulLinkList;
//取了别名 DulNode* 相当于DulLInkListDulLinkList list_AZ = NULL;//创建26个英文字母双向循环链表
Status CreatDulLink(DulLinkList* list)
{if (list == NULL){return ERROR;}DulNode* head = (DulNode*)malloc(sizeof(DulNode));//创建头结点if (head == NULL){return ERROR;}DulNode* p = head;//p 移动指针,起初指向头结点p->next = p->prior = NULL;for (size_t i = 0; i < 26; i++){DulNode* node = (DulNode*)malloc(sizeof(DulNode));//创建结点node->data = 'A' + i;//下面3步将创建的node结点放到双向循环链表中node->next = p->next;//直接赋值NULL也可以node->prior = p;p->next = node;//p 始终指向链表最后一个结点p = node;}//下2步 将尾结点和第一个结点关联形成双向循环链表,越过头结点。p->next = head->next;head->next->prior = p;//循环链表指向第一个元素*list = p->next;//释放头结点free(head);return OK;
}
//进行位移
Status Caesar(DulLinkList* list, int num)
{DulLinkList tmp = *list;//双向循环链表指针往后移if (num > 0){int i = 0;//num = 1 往后移动1位, temp = temp -> nextwhile (i < num){tmp = tmp->next;i++;}*list = tmp;}//双向循环链表指针往前移if (num < 0){int i = 0;//num = -1 往前移动1位,temp = temp->priorwhile (i < num*-1){tmp = tmp->prior;i++;}*list = tmp;}return OK;
}/*
获取密文字符
num 字符移动位数
ch 字符起点
*/
char GetCipertext(int num,char ch)
{//printf("num=%d", num);DulLinkList list = list_AZ;//移动到字符位置Caesar(&list, ch - 'A');//根据密钥进行偏移Caesar(&list, num);return list->data;
}/*
维吉尼亚密码
生成随机密钥
根据随机密钥进行加密
*/Status Virginia(char* words,char** keytext,char** cipertext ,int len)
{char* key = (char*)malloc(sizeof(char)*len+1);char* ciper = (char*)malloc(sizeof(char)*len+1);memset(key, 0, len + 1);memset(ciper, 0, len + 1);srand((size_t)time(NULL));for (size_t i = 0; i < len; i++){//需要范围为 x ~ y 公式 为 rand()%(y-x)+x //如果需要 1~ 9 公式为 rand()%8+1int num = rand() % 26;key[i] = 'A' + num;ciper[i] = GetCipertext(num,words[i]);}//通过指针返回数据*cipertext = ciper;*keytext = key;return OK;
}int main(int argc, char *argv[])
{   //创建26个字母的循环链表CreatDulLink(&list_AZ);char temp[1024] = {0};while (1){printf("请输入一段明文(英文大写,0退出):");scanf("%s", temp);if (temp[0] == '0'){break;}char* key = NULL;char* ciper = NULL;Virginia(temp,&key, &ciper, strlen(temp));printf("明文:%s\n", temp);printf("密钥:%s\n", key);printf("密文:%s\n", ciper);}system("pause");return 0;
}

运行结果

对照维吉尼亚密码表 没有问题

双向循环链表:维吉尼亚密码相关推荐

  1. 维吉尼亚密码(Vigenère Cipher)

    由于频率分析法可以有效的破解单表替换密码,法国密码学家维吉尼亚于1586年提出一种多表替换密码,即维吉尼亚密码,也称维热纳尔密码.维吉尼亚密码引入了"密钥"的概念,即根据密钥来决定 ...

  2. CTF杂项之“维吉尼亚密码”

    Didi 在这次省赛上做到了一到维吉尼亚密码的题,以前没做过很懵,问了同学才知道 先上图: baby 是秘钥 glbe{pnf_njedc_js_ufjs_kmvrocz!} 是密文 在线解密 htt ...

  3. C++vigenere cipher维吉尼亚密码算法(附完整源码)

    vigenere cipher维吉尼亚密码的算法 vigenere cipher维吉尼亚密码的完整源码(定义,实现,main函数测试) vigenere cipher维吉尼亚密码的完整源码(定义,实现 ...

  4. python编写加密程序_python编写的维吉尼亚密码加解密程序

    维吉尼亚密码表 ============================================= #维吉尼亚密码 加密 key='helloworld' plaintext='whereis ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Overleaf-LaTex表格制作
  2. 荐书 | 10 本机器学习电子书,美版 Kindle 免费读
  3. password is not set 问题解决
  4. Win32 API 打开另一个进程
  5. Java百度网盘创建链接,java获取百度网盘真实下载链接的方法
  6. DL之CNN优化技术:学习卷积神经网络CNN的优化、实践经验(练习调参)、从代码深刻认知CNN架构之练习技巧
  7. SAP Leonardo机器学习训练之前的初始化操作
  8. 5 操作系统第二章 进程管理 线程介绍
  9. Git 查看帮助命令
  10. /proc/sysrq-trigger文件的强大功能 shell
  11. BUPT Summer Journey #test6 D
  12. 高端时尚简历PPT模板-优页文档
  13. 单基因gsea_又是神器!基于单基因批量相关性分析的GSEA
  14. 手机计算机怎么玩24点游戏,计算器游戏怎么玩_计算器游戏新手玩法介绍_快吧手游...
  15. 微信小程序之图片压缩
  16. python基本数据类型练习
  17. 【洛谷】p5707上学迟到 C语言
  18. 头条搜索战百度:进攻性放手,危机并存
  19. mysql自动备份脚本下载+简单解读
  20. 强大的jqGrid!

热门文章

  1. 第5课 开心的金明《聪明人的游戏:信息学探秘.提高篇》(优化空间)
  2. 4.2 算法之数论 185 反正切函数的应用 scratch
  3. NOIP2002复赛 普及组 第1题
  4. 第43课 最大公约数 动动脑 第2题《小学生C++趣味编程》
  5. java class _Java Class文件详解
  6. 博图os更新_博途TIA安装与更新
  7. 斑马打印机怎么打印二维码_万能打印机厂家是怎么改良打印机的?
  8. C++ opengl 点光源
  9. Qt工作笔记-自定义模型【继承QAbstractTableModel】
  10. python解析.pyd文件