C++实现维吉尼亚密码加密
L001001012-古典密码-维吉尼亚密码实验

软件描述
VC6.0
实验环境描述
1、学生机与实验室网络直连;
2、VPC1与实验室网络直连;
3、学生机与VPC1物理链路连通;
预备知识
人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。它是由16世纪法国亨利三世王朝的布莱瑟·维吉尼亚发明的。维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。维吉尼亚密码的密钥空间大小为26m,所以即使m的值很小,使用穷尽密钥搜索方法也需要很长的时间。例如,当m=5时,密钥空间大小超过1.1*107,这样的密钥量已经超出了使用手算进行穷尽搜索的能力范验课题名称
L001001012-古典密码-维吉尼亚密码实验
实验目的与要求
维吉尼亚密码是古典密码中非常具有代表的例子。本实验要求用高级语言编写和调试一个简单的维吉尼亚密码实现及解密程序,通过本实验可以加深理解维吉尼亚密码原理。
实验环境
VPC1(虚拟PC)
Windows XP
VPC1连接要求
维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:
TO BE OR NOT TO BE THAT IS THE QUESTION
当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:
解密流程:
第一步:编号。将A-Z以编号0-25编号;
第二步:获取密钥。举例:wangyuhang;
第三步:密文处理。去掉所有空格;处理后:senxadvyyoikneqywvrekueyals;
维吉尼亚算法分析及应用

维吉尼亚算法分析及应用一.实验目的通过应用维吉尼亚算法对数据进行加解密的操作,了解维吉尼亚的加解密的机制,加深对维吉尼亚的算法理解二.试验环境安装Windows操作系统的PC机,具有C语言编译环境三.试验原理加密过程很简单,就是给定密码字母X和明文字母Y,密文字母是位于X行和Y列的那个字母。
这样就决定了加密一天消息与消息一样长的密钥字符串,通常,迷药字符串事是密钥的重复。
使用查表的方式多加密几次就能很轻易的总结出规律:将A-Z以0-25编号,那么加密过程就是,在代换表的第一行中找到消息字母,如W,然后向后移D次(即3次),所得的字母就是密文了。
如果数到末位,那么下一次移位就是从头(即A)继续也就是说,可以将A-Z看成一个环,加密过程就是找到消息字母后,将指针往环的某个特定方向移位,次数就是密钥字母所代表的数字,这其实是一个模26的过程。
扩展一下,以上加密仅能对26个字母进行加密,而且不能区分大小写,但其实英文中除了字母外,还有标点符号,还有空格。
如果考虑到大部分英文字符,那个维吉尼亚代换表将比较大,而且有点浪费空间,如果能将被加密的字符有N个如果把这N个字符建成一个环,那么加密过程即使模N的过程,即C(I)=K(I)+P(I)modN,其中,K,C,P分别代表的是密钥空间,密文空间,消息(明文)空间。
四.主要代码#include <iostream.h>#include <stdio.h>#include <string.h>char Vigenere(char m,char k){if (m==' ') return m;else{if (m>=65&&m<=90)m=m+32;m=((m-97)+(k-97));if (m>25)m=m%26;m=m+97;return m;}}void main(){char *key;char *d;char *m;m=new char[100];d=new char[100];key=new char[100];printf("please input plaintext:"); gets(m);printf("please input key:");gets(key);int len=strlen(m);int len_k=strlen(key);printf("the encode is:");for(int i=0,j=0;i<len;i++,j++){if (j>=len_k)j=j%len_k;d[i]=Vigenere(m[i],key[j]);cout<<d[i];}cout<<endl;}五.运行结果。
维吉尼亚密码学实验报告

一、实验目的1. 理解维吉尼亚密码的原理和加密解密过程。
2. 掌握维吉尼亚密码的编程实现。
3. 破解维吉尼亚密码,提高密码学应用能力。
二、实验原理维吉尼亚密码是一种多表密码,它通过将明文与密钥进行组合,实现字符的替换加密。
加密过程中,密钥的长度决定了密钥表的大小,密钥表中的每一行对应一个密钥,加密时按照密钥表中的行进行替换。
解密过程则是加密过程的逆过程。
三、实验内容1. 维吉尼亚密码的加密与解密实现(1)加密① 创建密钥表:根据密钥长度生成密钥表,密钥表中每一行对应一个密钥,密钥长度等于明文长度。
② 对明文进行加密:将明文中的每个字符按照密钥表中的行进行替换,得到密文。
(2)解密① 创建密钥表:根据密钥长度生成密钥表。
② 对密文进行解密:将密文中的每个字符按照密钥表中的行进行替换,得到明文。
2. 维吉尼亚密码的破解(1)重合指数法① 计算密文的重合指数:将密文与英文常见单词的重合指数进行比较,选择重合指数最高的密钥长度。
② 遍历密钥长度:对于每个密钥长度,遍历26个可能的偏移量,计算重合指数,选择重合指数最高的偏移量。
③ 解密密文:根据密钥长度和偏移量,对密文进行解密,得到可能的明文。
(2)暴力破解法① 遍历密钥长度:遍历所有可能的密钥长度。
② 遍历密钥:对于每个密钥长度,遍历所有可能的密钥。
③ 解密密文:根据密钥长度和密钥,对密文进行解密,得到可能的明文。
四、实验步骤1. 创建密钥表根据密钥长度生成密钥表,密钥表中每一行对应一个密钥。
2. 加密明文将明文中的每个字符按照密钥表中的行进行替换,得到密文。
3. 解密密文将密文中的每个字符按照密钥表中的行进行替换,得到明文。
4. 破解密文(1)重合指数法① 计算密文的重合指数。
② 遍历密钥长度。
③ 遍历密钥。
④ 解密密文。
(2)暴力破解法① 遍历密钥长度。
② 遍历密钥。
③ 解密密文。
五、实验结果与分析1. 加密与解密实验结果表明,维吉尼亚密码的加密和解密过程能够正确实现,密文与明文能够成功还原。
维吉尼亚(Vigenere)密码算法的VC实现

Vigenere算法实现传统加密技术对于当今的网络安全发挥不了大作用,但每一本讲述密码学的书的开头都会率先介绍它们,因为它们是密码学的基础,是密码学的历史。
Vigenere密码就是一种传统加密技术,它是多表代换密码,能够有效改进单表代换密码的词频分布特征问题。
详细介绍请参考密码学相关书籍。
几乎每一本密码学的书在讲述Vigenere密码的章节都会有这么一个《Vigenere代换表》用户讲解Vigenere密码机制:ABCDEFGHIJKLMNOPQRSTUVWXYZBCDEFGHIJKLMNOPQRSTUVWXYZACDEFGHIJKLMNOPQRSTUVWXYZABDEFGHIJKLMNOPQRSTUVWXYZABCEFGHIJKLMNOPQRSTUVWXYZABCDFGHIJKLMNOPQRSTUVWXYZABCDEGHIJKLMNOPQRSTUVWXYZABCDEFHIJKLMNOPQRSTUVWXYZABCDEFGIJKLMNOPQRSTUVWXYZABCDEFGHJKLMNOPQRSTUVWXYZABCDEFGHIKLMNOPQRSTUVWXYZABCDEFGHIJLMNOPQRSTUVWXYZABCDEFGHIJKMNOPQRSTUVWXYZABCDEFGHIJKLNOPQRSTUVWXYZABCDEFGHIJKLMOPQRSTUVWXYZABCDEFGHIJKLMNPQRSTUVWXYZABCDEFGHIJKLMNOQRSTUVWXYZABCDEFGHIJKLMNOPRSTUVWXYZABCDEFGHIJKLMNOPQSTUVWXYZABCDEFGHIJKLMNOPQRTUVWXYZABCDEFGHIJKLMNOPQRSUVWXYZABCDEFGHIJKLMNOPQRSTVWXYZABCDEFGHIJKLMNOPQRSTUWXYZABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVWYZABCDEFGHIJKLMNOPQRSTUVWXZABCDEFGHIJKLMNOPQRSTUVWXY加密过程很简单,就是给定密钥字母x和明文字母y,密文字母是位于x行和y列的那个字母。
编写古典加解密算法概要

实验报告要求
编程实现凯撒加解密算法。 在维吉尼亚密码基础上,将密钥的个数改为 由用户指定,编程实现加解密算法。 完成实验习题。
17法编程实现将密文转换成明 文,如下图所示。
• 要求:
密文由用户指定,可以出现大小写字母,长度不限。
10
实验提示
用c语言实现解密的部分代码
int t=int(str[i]-‘a’); //计算该字母在字母表中的序号 t=(t-3+26)%26; //用该字母前3个序号的字母 str[i]=(char)(t+'a'); //将该序号转换成字母 • 注意:该部分程序只是对小写字母的转换,大写字母的 转换请自行设计其算法。
•
实验所需软件及工具
编程工具不限
4
实验原理
单表代换密码
• 对于一个给定的加密密钥,明文信息空间中的每 一个元素将被代换为密文消息空间中的唯一元素。
凯撒密码
• 加密算法
Ek(m)=m+k=c mod N
• 解密算法
D(c)=c-k=m mod N
其中N=26,k=3
5
实验原理
多表代换密码
15
实验习题
写出下面加密算法对应的解密算法,并写出 明文“I AM A HACKER”对应的密文,分析 该加密算法的安全性:
• 将明文的每个字母转换为对应的7比特ASCII码; • 在每个字母对应的7比特ASCII码的最左边添加比 特0 ; • 对每个8比特表示的字母,将其前4个比特和后4 个比特交换; • 写下每4个比特对应的十六进制值。
编写古典加解密算法
西安交通大学 计算机教学实验中心
实验一 维吉尼亚

实验一维吉尼亚一、实验目的通过实验掌握维吉尼亚算法,对维吉尼亚加深认识。
二、实验要求用VC 编程实现,密钥是自己名字的全拼,明文是MINGMAXUEKECHENG,通过程序实现求出密文。
三、实验环境安装Windows操作系统的PC机,具有C语言编译环境。
四、实验内容vigenere方阵明文a b c d e f g h i j k l m n o p q r s t u v w x y za abcdefghijklmnopqrstuvwxy zb bcdefghijklmnopqrstuvwxyz ac cdefghijklmnopqrstuvwxyz a bd defghijklmnopqrstuvwxyz a b ce efghijklmnopqrstuvwxyz a b c d………z z a b c d e f g h i j k l m n o p q r s t u v w x y源代码:#include "iostream"#include "string"using namespace std;int createVigenere(char vigenere[][26]){for(int i=0;i<26;i++){if(i>0)vigenere[0][i] = vigenere[0][i-1] + 1;elsevigenere[0][i] = 'A';for(int j=1;j<26;j++){if(vigenere[j-1][i]<'Z')vigenere[j][i] = vigenere[j-1][i] +1;elsevigenere[j][i] = vigenere[j-1][i] - 25;}}return 1;}void encrepty(char vigenere[][26],char* source,char* key,char *cipher) {source = strlwr(source);//将大写转换为小写char *p = strlwr(key);char *q = source;char *s = cipher;while(*q != '\0'){while(*p !='\0'&&*q != '\0'){if(*q<'a'||*q>'z')//如果要加密的字符中不是26个字母则将其保存,不为其加密{*s = *q;q++;s++;continue;}*s = vigenere[*q-97][*p-97];//密钥*p-97,密文*q-97s++;p++;q++;}p = key;}*s = '\0';}void deciphring(char vigenere[][26],char* cipher,char* key,char *source) {cipher = strlwr(cipher);char *p = strlwr(key);char *q = cipher;char *s = source;while(*q != '\0'){while(*p !='\0'&&*q!='\0')//如果要加密的字符中不是26个字母则将其保存,不为其解密{if(*q<'a'||*q>'z'){*s = *q;q++;s++;continue;}*s = vigenere[0][(*q-*p+26)%26]+32;s++;p++;q++;}p = key;}*s = '\0';}void main(){char source[1024]={'\0'};//明文char cipher[1024]={'\0'};//密文char key[26] = "lijaixi";//密匙int index[1024] = {0};//标识明文的大小写char vigenere[26][26]={0};//vigenere加密矩阵createVigenere(vigenere);//创建加密矩阵/* for(i=0;i<26;i++)//输出加密矩阵{for(int j=0;j<26;j++){cout<<vigenere[i][j]<<" ";}cout<<endl;}*/cout<<"请输入要加密的字符串:"<<endl;gets(source);char *p = source;int i = 0;while(*p != '\0')//确定明文中大写字母的位置{if(*p>='A'&&*p<='Z'){index[i++] = 1;//如果输入的字母为大写则对应位置保存为1否则为0}else{index[i++] = 0;}p++;}encrepty(vigenere,source,key,cipher);//加密cout<<"加密结果为:";cout<<cipher<<endl;char yy[1024];cout<<"解密结果为:";deciphring(vigenere,cipher,key,yy);//解密p = yy;//加密转换后的结果却是大写i = 0;while(*p != '\0'){if(index[i++] == 1)//如果原来是小写则需要将转换都的大写转换为小写{*p = *p-32;}p++;}cout<<yy<<endl;}运行结果如下图:五、心得体会Vigenere密码比较简单,通过实验更使我明白了密码的加密和加密过程,对它的程序实现方法有了更为深刻的了解。
仿射密码算法与维基尼亚算法

仿射密码算法与维基尼亚算法实验2.1 仿射密码加密解密算法一、源程序#include#include#include#includeint gcd(int a, int b)/*辗转相除法求a,b的最大公因数*/{int k = 0;do{k = a%b;a = b;b = k;}while(k!=0);return a;}int Ni(int a, int b) /*求a相对于b的逆*/{int i = 0;while(a*(++i)%b!=1);return i;}void Affine_enc() //加密{char c[100];int length, i=0, ka=0, kb=0, tmp;printf("****************欢迎使用Affine加密算法****************\请输入明文: ");gets(c);length = strlen(c);printf("请输入密钥(2 numbers): ");scanf("%d%d", &ka, &kb);getchar();if(gcd(ka,26)!=1){printf("The value of the key is error!\Press any key to return...");return;}for(i=0; i<="" p="">{if(c[i]>96&&c[i]<123)c[i] = (ka*(c[i]-97)+kb)%26+65;else if(c[i]>64&&c[i]<91)c[i] = (ka*(c[i]-65)+kb)%26+65;}printf("经加密后的密文为: %s\", c);printf("Press any key to return...");getch();}void Affine_dec() //解密{char c[100];int length, i=0, ka=0, kb=0, tmp;printf("****************欢迎使用Affine解密算法****************请输入密文: ");gets(c);length = strlen(c);printf("请输入密钥(2 numbers): ");scanf("%d%d", &ka, &kb);getchar();if(gcd(ka,26)!=1){printf("The value of the key is error!\Press any key to return...");return;}for(i=0; i<="" p="">{if(c[i]>64&&c[i]<91){tmp = Ni(ka,26)*((c[i]-65)-kb);if(tmp<0)c[i] = tmp%26+26+97;elsec[i] = tmp%26+97;}}printf("\经解密后的原明文为:\%s\", c);printf("Press any key to return...");getch();}void main(){char i = '0';while(i!='3'){printf("\\\\\欢迎使用Affine密码系统:\\");printf("\\-------加密请输入1\解密请输入2\退出系统请输入0------\\");printf("********************Press 1~3 to choose:********************\");i = getch();if(i=='1')Affine_enc();else if(i=='2')Affine_dec();else if(i=='3')break;}}二、实验效果图2.1仿射密码加密算法效果图:2.2仿射密码解密算法效果图:实验2.2 维基尼亚算法一、源程序#include#include#includevoid main(){char c1[26],c2[26][26],str[100],k[26];int i,j,d,len,l[26],m;for(i=0;i<26;i++)c1[i]=i+65;for(i=0;i<26;i++)for(j=0;j<26;j++)c2[i][j]=(i+j)%26+65;printf("\\\\\欢迎使用Vigenere密码系统:\\");printf("\\-------加密请输入1\解密请输入2\退出系统请输入0------");do{printf("\\请选择:");scanf("%d",&d);switch(d){case 1:{printf("\请输入密钥:");scanf("%s",k);len=strlen(k);strupr(k);for(i=0;i<len;i++)< bdsfid="202" p=""></len;i++)<>for(j=0;j<26;j++)if(k[i]==c1[j])l[i]=j;printf("\请输入明文:");scanf("%s",str);strupr(str);printf("\密文为:");for(i=0;str[i]!='\\0';i++)for(j=0;j<26;j++)if(str[i]==c1[j]){m=i%len;printf("%c",c2[l[m]][j]);if(i!=0 && m==(len-1))printf(" ");break;}break;}case 2:{printf("\请输入密钥:");scanf("%s",k);len=strlen(k);strupr(k);for(i=0;i<len;i++)< bdsfid="229" p=""></len;i++)<> for(j=0;j<26;j++)if(k[i]==c1[j])l[i]=j;printf("\输入密文:");scanf("%s",str);strupr(str);printf("\明文为:");for(i=0;i< bdsfid="238" p=""><>for(j=0;j<26;j++){m=i%len;if(str[i]==c2[l[m]][j]){printf("%c",c1[j]+32);break;}}break;}case 0:exit(0);default: printf("\请重新输入:\"); }}while(d);printf("\");}二、实验效果图2.1维吉尼亚加密算法效果图:2.2维吉尼亚解密算法效果图:。
维吉尼亚密码c语言源代码

维吉尼亚密码c语言源代码#include<stdio.h> // 头文件<stdio.h> , 声明标准输入输出函数#include<string.h> // 头文件<string.h> ,声明字符串操作函数char vigenere_table[26][26]; //定义维吉尼亚表void set_vigenere_table(){int i,j;int key; //行指针for (i = 0; i < 26; i++){key=i;for(j=0;j<26;j++){vigenere_table[i][j]='A'+(key%26);key++;}}printf("初始化维吉尼亚表完毕:\n\n");}void vigenere_encrypt(char* source,char* des) //定义加密函数{int source_len=strlen(source);int key_len=strlen(des);int i;for(i=0;i<source_len;i++) //对每个字母进行加密{int source_index= source[i]-'A'; //密文指针int key_index=des[i%key_len]-'A'; //维吉尼亚表指针int des_index=vigenere_table[key_index][source_index]-'A';des[i]=des_index+'A';}des[source_len]='\0';}void vigenere_decrypt(char* source,char* des) //定义解密函数{#define MAX_LEN 26int source_len=strlen(source);int key_len=strlen(des);int i;for(i=0;i<source_len;i++) //对每个字母进行解密{int key_index=des[i%key_len]-'A'; //维吉尼亚表指针int j;for(j=0;j<MAX_LEN;j++) //从维吉尼亚表中查找密文指针{if(vigenere_table[key_index][j]==source[i]){break;}}des[i]=j+'A';}des[source_len]='\0';}int main(){char plain[]="VIGENERECIPHER";char key[]="ABCD";char result[20];char result1[20];set_vigenere_table();vigenere_encrypt(plain,result);printf("明文: %s\n密钥: %s\n密文: %s\n",plain,key,result);vigenere_decrypt(result,result1);printf("解密后: %s\n",result1);return 0;}。
c语言vigenère密码的综合题

C语言Vigenère密码的综合题一、概述Vigenère密码是一种多表密码,是由法国人布拉瓦·德维热纳于1553年发明的。
它是基于字母表的轮换和偏移来实现加密与解密的。
Vigenère密码算法的核心思想是使用一个密钥串来进行加密和解密操作,相比传统的凯撒密码,Vigenère密码更加安全可靠。
在C语言中实现Vigenère密码算法可以帮助我们更好地了解密码学和算法设计的相关知识。
二、Vigenère密码的原理Vigenère密码算法的核心原理是利用关键词对明文进行分组加密,具体步骤如下:1.确定关键词,将明文和关键词转换为阿拉伯数字表达方式。
2.将关键词复制至与明文长度相等的长度。
3.按照两者的数值进行加法计算。
4.将计算结果对26取模。
5.将计算结果转换为字符形式。
6.将加密后的字符拼接成密文。
三、Vigenère密码的具体实现在C语言中实现Vigenère密码算法需要考虑以下几个关键步骤:1. 输入明文和关键词。
2. 将明文和关键词转换为阿拉伯数字表达方式。
3. 判断明文和关键词的长度以便确定循环加密。
4. 进行加密计算。
5. 输出密文。
四、示例代码下面是一个简单的C语言示例代码,实现了Vigenère密码的加密操作:```c#include <stdio.h>#include <string.h>void encrypt(char* pl本人n, char* key) {int plen = strlen(pl本人n);int klen = strlen(key);for (int i = 0; i < plen; i++) {pl本人n[i] = ((pl本人n[i] - 'A' + key[i klen] - 'A') 26) + 'A'; }}int m本人n() {char pl本人n[100];char key[100];printf("请输入明文:");scanf("s", pl本人n);printf("请输入关键词:");scanf("s", key);encrypt(pl本人n, key);printf("加密后的密文为:s\n", pl本人n);return 0;}```五、总结Vigenère密码算法是一种经典的密码算法,通过使用关键词对明文进行分组加密,可以有效提高密码的安全性。
维吉尼亚密码实验报告

一、实验目的1. 理解维吉尼亚密码的原理和加密、解密过程。
2. 掌握使用维吉尼亚密码进行加密和解密的方法。
3. 通过实验加深对古典密码学中维吉尼亚密码的理解。
二、实验原理维吉尼亚密码是一种多表代换密码,由密钥控制明文与密文的转换。
其加密和解密过程如下:1. 加密过程:(1)将密钥与明文进行对齐,不足部分进行循环。
(2)根据密钥在密表中找到对应的列,密表中每列对应一个字母。
(3)将明文中的每个字母替换成密表中对应列的字母。
2. 解密过程:(1)将密钥与密文进行对齐,不足部分进行循环。
(2)根据密钥在密表中找到对应的列,密表中每列对应一个字母。
(3)将密文中的每个字母替换成密表中对应列的字母,还原出明文。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 工具:Jupyter Notebook四、实验步骤1. 编写加密函数```pythondef vigenere_encrypt(plain_text, key):key = key.upper()plain_text = plain_text.upper()key_length = len(key)key_list = list(key)cipher_text = ''for i, char in enumerate(plain_text):if char.isalpha():key_index = key_list[i % key_length]key_offset = ord(key_index) - ord('A')cipher_char = chr((ord(char) - ord('A') + key_offset) % 26 + ord('A'))cipher_text += cipher_charelse:cipher_text += charreturn cipher_text```2. 编写解密函数```pythondef vigenere_decrypt(cipher_text, key):key = key.upper()cipher_text = cipher_text.upper()key_length = len(key)key_list = list(key)plain_text = ''for i, char in enumerate(cipher_text):if char.isalpha():key_index = key_list[i % key_length]key_offset = ord(key_index) - ord('A')plain_char = chr((ord(char) - ord('A') - key_offset) % 26 + ord('A'))plain_text += plain_charelse:plain_text += charreturn plain_text```3. 编写主函数```pythondef main():plain_text = input("请输入明文:")key = input("请输入密钥:")cipher_text = vigenere_encrypt(plain_text, key)print("加密后的密文为:", cipher_text)decrypted_text = vigenere_decrypt(cipher_text, key)print("解密后的明文为:", decrypted_text)if __name__ == "__main__":main()```4. 运行实验程序,输入明文和密钥,观察加密和解密结果。
[教学设计]Vigenere的编程实现
![[教学设计]Vigenere的编程实现](https://img.taocdn.com/s3/m/82cb2621a22d7375a417866fb84ae45c3a35c253.png)
一、实验目的与意义1、实验目的:通过编程实现vigenere加密,更加深入的了解其原理,掌握vigenere算法。
2、实验意义:验证理论知识,更重要的是通过实验加强实验手段与实践技能,培养分析问题、解决问题、应用知识的能力和创新精神,全面提高综合素质。
十、实验环境操作系统:Windows XP调试软件名称:Microsoft Visual studio版本号:2005上机地点:综合楼208十一、实验的预习内容1、预习内容:1、vigenere cipher加密规则:1)找到一个关键字作为密钥;2)将关键字重复的写在明文上;3)根据vigenere table 找出对应的密文2、解密:1)根据vigenere table找到中对应的字母;2)再看密文字母对应的关键字字母;3)唯一的确定明文字母。
3、关键的代码(如何让3个字母实现类似vigenere table的形式)#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){char a[3]={'a','b','c'};char table[3][3];for(int i=0;i<3;i++)for(int j=0;j<3;j++)table[i][j]=a[(j+i)%3];for(int i=0;i<3;i++){for(int j=0;j<3;j++){printf("%c",table[i][j]);}printf("\n");}return 0;}2、实验思路:打出vigenere table->输入关键字->用户输入明文->进行加密>得到密文;解密原理与加密基本相同。
3、程序框图:十二、实验的步骤与调试方法1、实验步骤:(1)建立win32 console applicatio ng工作空间,名为:vigenere_20083612;(2)新建xuvi.cpp源文件;(3)按照实验思路编写源代码,完成之后进行编译、链接、执行;(4)程序执行时按提示输入关键字、明文,验证输出密文,及解密之后输出明文是否正确。
c语言实现对密码(字符串)进行加密,并解密

c语⾔实现对密码(字符串)进⾏加密,并解密 1/**习惯把密码明⽂存在本地⽂件中,这个⼩程序可以把存的密码以密⽂形式保存**/2 #include <stdio.h>3 #include <string.h>4 #include <stdlib.h>5 #include <time.h>6int chartoasc(char c);7int xor(int i);8char asctochar(int a);9int rand_num();10int encrypt(const char *org_pass,char *new_pass);11int decrypt(const char *new_pass,char *org_pass);1213int main(int argc,char *argv[])14 {15if(argc!=2)16 {17 printf("参数输⼊有误!\n");18 printf("usage:<pass flag >\nflag=1:加密;flag=2:解密\n");19return -1;20 }21int flag = 0;22int len = 0;23int i = 0;24int ret = 0;25char password[20];26char new_pass[50];27char org_pass[50];28int test1 = 0;29int test2 = 0;30char test3 = 0;31char *p = NULL;3233 bzero(password,sizeof(password));34 bzero(new_pass,sizeof(new_pass));35 bzero(org_pass,sizeof(org_pass));3637 flag = atoi(argv[1]);38if(flag == 1)39 {40 printf("请输⼊需要加密的密码:");41 scanf("%s",password);42 ret = encrypt(password,&new_pass);43if(ret)44 {45 printf("密码加密失败!\n");46return -1;47 }48 printf("新密码[%s]\n",new_pass);49 }50else if(flag ==2)51 {52 printf("请输⼊需要解密的密码:");53 scanf("%s",password);54 ret = decrypt(password,&org_pass);55if(ret)56 {57 printf("获取原密码失败!\n");58return -1;59 }60 printf("原密码[%s]\n",org_pass);61 }62else63 {64 printf("加密标志输⼊如有误!\n");65return -1;66 }6768return0;69 }7071/**将字符转换为ASCII值**/72int chartoasc(char c)73 {74int i= 0;75 i = c;76return i;77 }7879/**将ASCII进⾏异或运算,产⽣新的ASCII值**/80int xor(int i)81 {82int m = 27;83int result = 0;84if(59==i || 100==i)85 {86return i;87 }88 result = i^m;89return result;90 }9192/**将ASCII值转换为字符**/93char asctochar(int a)94 {95char c;96 c = a;97return c;98 }99100/**输⼊原密码产⽣新的密码**/101int encrypt(const char *org_pass,char *new_pass) 102 {103char org_password[50];104char new_password[50];105int len = 0;106int i = 0;107int asc = 0 ;108char ch = 0;109int x = 0;110111 bzero(org_password,sizeof(org_password)); 112 bzero(new_password,sizeof(new_password)); 113 strcpy(org_password, org_pass);114 len = strlen(org_password);115for(i=0 ; i<len ; i++)116 {117 ch = org_password[i];118 asc = chartoasc(ch);119 x = xor(asc);120 new_password[i] = asctochar(x);121 }122 strcpy(new_pass,new_password);123124return0;125 }126127/**输⼊加密后的密码返回原密码**/128int decrypt(const char *new_pass,char *org_pass) 129 {130char new_password[50];131char org_password[50];132char ch;133int a = -1;134int len =0;135int i=0;136int x = -1;137138 bzero(new_password,sizeof(new_password)); 139 bzero(org_password,sizeof(org_password)); 140141 strcpy(new_password,new_pass);142 len = strlen(new_password);143for(i=0;i<len;i++)144 {145 ch = new_password[i];146 a = chartoasc(ch);147 x = xor(a);148 org_password[i]=asctochar(x);149 }150 strcpy(org_pass,org_password);151152return0;153 }后续考虑实现界⾯程序的改进。
四种加密解密算法的源代码:移位密码、仿射密码

四种加密解密算法的源代码:移位密码、仿射密码、维吉尼亚密码以及置换密码#include <stdio.h>#include <conio.h>#include <string.h>#include <malloc.h>void Shift() /*移位密码*/{char c[100];int length, i=0, key=0;clrscr();printf("********Shift Cipher********\nPlease input primal sentence: ");gets(c);length = strlen(c);printf("Input the key(0~26): ");scanf("%d", &key);getchar();if(key<0){printf("The value of key is error!\nPress any key to return...");getch();return;}for(i=0; i<length; i++){if(c[i]>96&&c[i]<123)c[i] = (c[i]+key-97)%26+65;else if(c[i]>64&&c[i]<91)c[i] = (c[i]+key-65)%26+65;}printf("Result is: %s\n", c);for(i=0; i<length; i++){if(c[i]>64&&c[i]<91)c[i] = (c[i]-key-65+26)%26+97;}printf("\nAfter translated the sentence,we can see the primal sentence as follow:\n%s\n", c);printf("Press any key to return...");getch();}int gcd(int a, int b) /*辗转相除法求a,b的最大公因数*/{int k = 0;do{k = a%b;a = b;b = k;}while(k!=0);return a;}int Ni(int a, int b) /*求a相对于b的逆*/{int i = 0;while(a*(++i)%b!=1);return i;}void Affine() /*仿射密码*/{char c[100];int length, i=0, ka=0, kb=0, tmp;clrscr();printf("********Affine Cipher********\nPlease input primal sentence: "); gets(c);length = strlen(c);printf("Input the key(2 numbers): ");scanf("%d%d", &ka, &kb);getchar();if(gcd(ka,26)!=1){printf("The value of the key is error!\nPress any key to return..."); return;}for(i=0; i<length; i++){if(c[i]>96&&c[i]<123)c[i] = (ka*(c[i]-97)+kb)%26+65;else if(c[i]>64&&c[i]<91)c[i] = (ka*(c[i]-65)+kb)%26+65;printf("Result is: %s\n", c);for(i=0; i<length; i++){if(c[i]>64&&c[i]<91){tmp = Ni(ka,26)*((c[i]-65)-kb);if(tmp<0)c[i] = tmp%26+26+97;elsec[i] = tmp%26+97;}}printf("\nAfter translated the sentence,we can see the primal sentence as follow:\n%s\n", c);printf("Press any key to return...");getch();}void Vigenere() /*维吉利亚密码*/{char c[100], key[100];int lenc, lenk, i=0, j=0, tmp;clrscr();printf("********Vigenere Cipher********\nPlease input primal sentence: "); gets(c);lenc = strlen(c);strcpy(c, strupr(c));printf("Input the key: ");gets(key);lenk = strlen(key);strcpy(key, strupr(key));for(; i<lenc; i++){j = j%lenk;if(c[i]>64&&c[i]<91){c[i] = (c[i]-65+key[j]-65)%26+65;j++;}}printf("Result is: %s\n", c);for(i=0, j=0; i<lenc; i++)j = j%lenk;if(c[i]>64&&c[i]<91){tmp = c[i]-65-(key[j]-65);if(tmp>=0)c[i] = tmp%26+97;elsec[i] = (tmp+26)%26+97;j++;}}printf("\nAfter translated the sentence,we can see the primal sentence as follow:\n%s\n", c);printf("Press any key to return...");getch();}void Permutation() /*置换密码*/{char c[100], *q;int *key, len, m, i, j=0;clrscr();printf("********Permutation Cipher********\nPlease input primal sentence: "); gets(c);strcpy(c, strupr(c));len = strlen(c);for(i=0; i<len; i++){if(c[i]<65||c[i]>90){for(j=i; j<len-1; j++)c[j] = c[j+1];len--;}}c[len] = '\0';printf("Input the length of the key: ");scanf("%d", &m);key = (int)malloc(m*sizeof(int));q = (int)malloc(len*sizeof(int));printf("Input the key: ");for(i=0; i<m; i++)scanf("%d", key+i);key[i]--;}getchar();for(i=0; i<len; i++){j = (i/m)*m;q[i] = c[*(key+i%m)+j];}q[i] = '\0';printf("Result is: %s\n", q);for(i=0, j=0; i<len; i++){j = (i/m)*m;c[*(key+i%m)+j] = q[i]+32;}c[len] = '\0';printf("After translated the sentence,we can see the primal sentence as follow:\n%s\n", c);printf("Press any key to return...");free(key);free(q);getch();}void main(){char i = '0';clrscr();while(i!='5'){clrscr();printf("********Press 1~5 to choose:********\n");printf("1. Shift Cipher\n2. Affine Cipher\n3. Vigenere Cipher\n4. Permutation Cipher\n5. Exit\n");i = getch();if(i=='1')Shift();else if(i=='2') Affine();else if(i=='3') Vigenere(); else if(i=='4') Permutation(); else if(i=='5') break;}}。
维吉尼亚密码c++程序

table[i][j] = MINCHAR + (i + j) % CHARSUM;
}
}
return true;
}
// 加密
// key:密钥
// source:待加密的字符串
// dest:经过加密后的字符串
Encode(key, str1, str2);
cout << "加密后的字符串:" << str2 << endl;
}
else if(operation == 2)//解密
{
cout << "请输入密钥:";
else if(operation == 1)//加密
{
cout << "请输入密钥:";
cin >> key;
cout << "请输入待加密字符串:";
cin >> str1;
bool Dncode(char* key, char* source, char* dest);
int main()
{
if(!Init())
{
cout << "初始化错误!" << endl;
return 1;
}
char key[256];
#include<iostream>
using namespace std;
#define MINCHAR 32
#define CHARSUM 94
维吉利亚密码

维吉利亚密码维吉利亚(Vigenere)密码Vigenere是法国的密码学专家,Vigenere密码是以他的名字命名的。
该密码体制有一个参数n,在加密解密时,把英文字母用数字代替进行运算,并按n个字母一组进行变换。
明文空间、密文空间及密钥空间都是长度为n 的英文字母串的集合,因此可表示为P=C=K=(Z26)n。
加密变换如下: 设密钥k=(k1,k2,…,k n),明文P=(m1,m2,…,m n),加密函数为e k(P)=(c1,c2,…,c n), 其中c i=(m i+k i) (mod 26),i=1,2,…,n。
对密文c=(c1,c2,…,c n),密钥k=(k1,k2,…,k n),解密变换为d k(c)=(m1,m2,…,m n),其中m i=(c i-k i) (mod 26),i=1,2,…,n。
【例题】:设n=6,密钥是cipher,这相应于密钥k=(2,8,15,7,4,17),明文是“this cryptosystem is not secure”,试用Vigenere密码对其加密。
解:首先将明文按每6个分为一组,然后与密钥进行模26相加得t h i s c r19 7 8 18 2 172 8 15 7 4 1721 15 23 25 6 8V P X Z G Iy p t o s y24 15 19 14 18 242 8 15 7 4 170 23 8 21 22 15A X I V W Ps t e m i s18 19 4 12 8 182 8 15 7 4 1720 1 19 19 12 9U B T T M Jn o t s e c13 14 19 18 4 22 8 15 7 4 1715 22 8 25 8 19P W I Z I Tu r e20 17 42 8 1522 25 19W Z T相应的密文是“VPXZGI AXIVWP UBTTMJ PWIZIT WZT”。
维吉尼亚密码的实现

维吉尼亚密码的实现《应用密码学》课程实验报告--------------- 维吉尼亚密码的实现一、实验目的维吉尼亚密码是古典密码中非常具有代表的例子。
本实验要求用高级语言编写和调试一个简单的维吉尼亚密码实现及分析破译程序。
通过本实验可以加深理解维吉尼亚密码及其分析破译。
二、实验内容与要求(1)设计一个函数实现维吉尼亚密码;(2)在已知明文及其对应密文的基础上,分析破译维吉尼亚密码,编程求解密钥;(3)要求有程序实现,有实验结果截图,有测试例子。
(4)编程语言不限制,可以用tc2.0,vc6.0,.net或java 三、实验设备硬件环境: Intel Pentium Processor 1.8G ,512M内存,windows操作系统软件环境:VC++四、实验步骤#include<iostream>using namespace std;#define MINCHAR 32#define CHARSUM 94char 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] = MINCHAR + (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;}五、实验结果与分析密钥:AF待加密字符串:WCTHF。
密码学实验之凯撒密码和维吉尼亚密码的加解密

1.凯撒密码的加解密源代码:#include<stdafx.h>#include <stdio.h>#include <string.h>int main(){char s[100],c;int i,p,d,e;printf("请选择: A.加密B.解密Q.退出\n"); scanf("%c",&c);if(c=='a'||c=='A'){printf("输入明文:");scanf("%s",&s);p=strlen(s);printf("请设置偏移量:");scanf("%d",&d);for(i=0;i<p;i++){if(s[i]>='a' && s[i]<='z')s[i]=(s[i]-'a'+d)%26+'a';else if(s[i]>='A' && s[i]<='Z')s[i]=(s[i]-'A'+d)%26+'A';else s[i]=s[i]+d;}printf("%s",s);printf("\n\n\n");}if(c=='b'||c=='B'){printf("请输入密文:");scanf("%s",&s);p=strlen(s);printf("请输入加密的偏移变量:");scanf("%d",&d);for(i=0;i<p;i++){if(s[i]>='a' && s[i]<='z'){e=s[i]-'a'-d;if(e<=0)s[i]=(e+26)%26+'a';else s[i]=e%26+'a';}else if(s[i]>='A' && s[i]<='Z'){e=s[i]-'A'-d;if(e<0)s[i]=(e+26)%26+'A';else s[i]=e%26+'A';}else s[i]=s[i]-d;}printf("%s",s);printf("\n\n");}if(c=='q'||c=='Q')return 0;return 0;}运行结果是:2.维吉尼亚密码的加解密源代码:#include "stdafx.h"#include<iostream>using namespace std;#define MINCHAR 32#define CHARSUM 94char 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] = MINCHAR + (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复习C编程的基本知识二、实验环境Windows xp sp2Microsoft visual c++6.0三、实验原理Vigenere表:Vigenere加密法是一个很著名的多码加密法,它具有一个很有趣的历史。
多码加密法是一种替换加密法,其中的每个明文字母可以用密文中的多种字母来替代,而每个密文字母也可以表示多种明文字母。
这种加密法因为其明文与密文的对应关系可以改变,使得频率分析工具无法很好地发挥作用。
在很长的一段时间内,多码加密法成为密码使用中的一个重要内容,如Enigma机。
Vigenere加密法是基于关键词的加密系统,但不是像单码关键词加密法那样使用关键词来定义替换模式的,关键词写在明文的上面,并不断重复书写,这样每个明文字母都与一个关键词的字母关联。
例如,如果关键词为"hold",而明文为"this is the plaintext",那么,关键词——明文的关联如下所示:h o l d h o l d h o l d h o l d h ot h i s i s t h e p l a i n t e x t每个明文字母与关键词的一个字母对应。
例如,第一个明文字母"t"与关键词的字母"h"配对。
利用如下图所示的Vigenere表,在密钥字母确定的行和明文字母确定的列交叉处的字母即为用来替代明文字母的密文字母。
例如上面例子中第一对是"h--t",在下表中查找"h"行和"t"列的交叉处,即为密文字母"a"。
重复以上过程可以生成以下的密文:密钥 h o l d h o l d h o l d h o l d h o明文 t h i s i s t h e p l a i n t e x t密文 a v t v p g e k l d w d p b e h d hVigenere表:在整个密文中,”v”出现了两次,分别代替”h”和”s”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运行后先输入密钥,再输入文件名(输入文本,和输出文本的),文件名和代码在同一目录下不用加路径。
头文件: vi.h
#ifndef _VI_H
#define_VI_H
#include<iostream>
#include<string>
class vi
{
private:
std::string key;
public:
void setkey();
void job();
};
#endif
#include"vi.h"
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void vi::setkey()
{
getline(cin,key,'\n');
}
void vi::job()
{
string s,k;
cout<<"需要加密的文件名:"<<endl;
getline(cin,s,'\n');
ifstream in(s.c_str());
cout<<"存放密文的文件名:"<<endl;
getline(cin,k,'\n');
ofstream out(k.c_str());
char ch;
unsigned char n;
int i=0;
while((ch=in.get())!=EOF)
{
if(ch>='a'&&ch<='z')
{
n=ch+key[i]-97;
if(n>122)
{
n-=26;
out.put(n);
}
else out.put(n);
}
else if(ch>='A'&&ch<='Z')
{
n=ch+key[i]-65;
if(n>122)
{
n-=26;
out.put(n);
}
else out.put(n);
}
else
{
out.put(ch);
continue;
}
i=(i+1)%5;
}
}
#include"vi.h"
#include<iostream>
using namespace std;
int main(int argc, char *argv[]) { vi j;
j.setkey();
j.job();
return 0;
}。