Vigenere的编程实现
一、实验目的与意义
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 applicationg工作空间,名为:
vigenere_20083612;
(2)新建xuvi.cpp源文件;
(3)按照实验思路编写源代码,完成之后进行编译、链接、执行;
(4)程序执行时按提示输入关键字、明文,验证输出密文,及解密之后输出明文是否正确。
2、调试方法:打表时出现错误。经调整后发现是数组定义问题。
五、实验数据与实验结果
六、实验用程序清单(要有注释)#include "Stdio.h"
#include "Conio.h"
#include "string.h"
#include "malloc.h"
#define MAX 100
static int square[27][27];
char * vigenere(char key[],char word[]);
char * anti_vigenere(char key[],char * en_word);
int main(void)
{
char key[MAX],word[MAX], *en_word;
int i,j,k,m;
/*初始化vigenere方阵*/
for(i=1;i<27;i++){
for(j=1;j<27;j++){
square[i][j]=63+i+j;
if(square[i][j]>90)
square[i][j]=square[i][j]-26;
}
}
for(k=1;k<27;k++){
for(m=1;m<27;m++){
printf("%c ",square[k][m]);
}
printf("\n");
}
/**/
printf("Vigenere Cipher \nPlease input plain text:");
scanf("%s",word);
printf("input the key:");
scanf("%s",key);
en_word=vigenere(key,word);
printf("\nThe result is: %s\n",en_word);
printf("\n\tDecryption:\n");
printf("The plain text is:%s\n",anti_vigenere(key,en_word));
getch();
return 0;
}
/*加密算法*/
char * vigenere(char key[],char word[]){
char *text=(char *)malloc(MAX*sizeof(char));
int key_length=strlen(key);
int word_length=strlen(word);
int i,j,c;
for(i=0;i if((word[i]>=65&&word[i]<=90)||(word[i]>=97&&word[i]<=122)){ if(word[i]>=97&&word[i]<=122){ c=word[i]-96; } else { c=word[i]-64; } j=i%key_length; text[i]=square[key[j]-96][c]; } else text[i]=word[i]; } text[i]='\0'; return text; } /*解密算法*/ char * anti_vigenere(char key[],char * en_word){ char *word=(char *)malloc(MAX*sizeof(char)); int key_length=strlen(key); int word_length=strlen(en_word); int i,j,c,k,d; for(i=0;i if(en_word[i]>=65&&en_word[i]<=90){ c=i%key_length;/*所用密钥在所在*/ k=key[c]-96; d=en_word[i]-square[k][1]; if(d>=0){ word[i]='a'+d; }else{ word[i]='z'+d+1; } }else{ word[i]=en_word[i]; } } word[i]='\0'; return word; } 七、思考题(必需回答)写明如下问题 1.Vigenere密码的原理是什么? 答:替换。 2.Vigenere密码的主要缺陷有哪些? 答:密钥长度n小于明文的长度,即相同的明文字符可能多次被相同的密钥字符 加密,生成相同的密文字符。 3.对Vigenere密码的分析方法有哪几种? 答:IC 重合指数和Kasiski长度分析 4.对Vigenere密码的改进方法是什么? 答:autokey copher 八、结束语 通过本次试验我对vigenere加密算法有了更加全面深入的认识,以前的学习只是停留在理论层面,而这次试验课给了我实践的机会。通过实验很好的把古典密码应用于现代密码加解密技术中。在这个过程中我也学到了很多关于编程方面的知识,了解了自己需要提高编程水平。 九、参考文献 1.Richard J.Spillman:《CLASSICAL AND CONTEMPORARY CRYPTOLOGY》,清华大学出版社,2005-7 2.William Stallings: Cryptography and Network Security: Principles and Practice. 2nd ed. Prentice Hall, 1998. 3.杨波著:《现代密码学》,清华大学出版社,2003-8. 4.Wenbo Mao. Modern Cryptography: Theory and Practicce. 电子工业出版社,2004-7. 5.许主洪著:《加密与解密-密码技术剖析与实战应用》,人民邮电出版社,2002-8. 6.张焕国,刘玉珍著:《密码学引论》,武汉大学出版社,2003. 7.段钢著:《加密与解密》,电子工业出版社,2005-3. 实验成绩