Vigenere的编程实现

Vigenere的编程实现
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.

实验成绩

相关主题
相关文档
最新文档