密码学课程设计(格式)2016

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南京航空航天大学

课程设计报告

课程名称密码学课程设计

学院计算机科学与技术年级2014

学生姓名陶超权学号*********

开课时间2016 至2017 学年第一学期

总成绩

教师签名

一、实验目的

通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext )、密文(ciphertext )、加密密钥(encryption key )、解密密钥(decryption key )、加密算法(encryption algorithm)、解密算法(decryption algorithm )等。

二、实验内容

1)用C\C++语言实现单表仿射(Affine )加/解密算法;

2)用C\C++语言实现统计26个英文字母出现频率的程序;

3)利用单表仿射加/解密程序对一段较长的英文文章进行加密,再对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。

仿射变换:

加密:()26mod )(21m k k m E c k +==

解密:()26mod )(112k c k c D m k -==- 其中,k 1和k 2为密钥,k 1∈Z q ,k 2∈Z q *。

三、实验步骤

1)在main 函数中构建框架,函数主要分为三部分,加密,解密,计算字符出现频率;

2)加密函数encrypt(),首先需要输入两个密钥K1,k2,需要注意k2是和26互质的,所以这里用gcd()函数判断了k2与26的最大公约数,加解密都采用了文件操作,明文和密文都保存在文件中,这里加密时根据ascii 码,对大小字母分别加密,其他字符则保持不变;

3)解密函数decode(),和加密函数类似,需要注意解密要用到密钥K2的逆元,所以这里用函数inverse_k2()进行了逆元的求解,另外需要注意的是解密运算过程中可能出现数值为负数的情况,在模运算下应该将它们重新置为整数。

4)计算字符频率函数calculateCharFreq(),这里只对大小字母进行统计,不计其他字符。

源代码:

********************* main.cpp **********************

#include

#include

int main ()

{

void encrypt ();

void decode ();

void calculateCharFreq ();

int choice;

printf("please input your choice:\n");

printf("\t1. encrypt\n\t2.decode\n\t3.calculate character frequence\n\t4.quit&exit\n");

scanf("%d",&choice);

getchar();

while(1)

{

switch(choice)

{

case1:

encrypt();

break;

case2:

decode();

break;

case3:

calculateCharFreq();

break;

case4:

return0;

default:break;

}

printf("please input your choice:\n");

printf("\t1. encrypt\n\t2.decode\n\t3.calculate character frequence\n\t4.quit&exit\n");

scanf("%d",&choice);

getchar();

}

return0;

}

*************************** encrypt.cpp ********************* #include

#include

void encrypt()

{

int gcd(int,int);

printf("please input secret key\n");

printf("k1:");

int k1,k2;

scanf("%d",&k1);

getchar();

while(k1<0|| k1>=26)

{

printf("illegal k1!please input agian!\n"); printf("k1:");

scanf("%d",&k1);

getchar();

}

printf("k2:");

scanf("%d",&k2);

getchar();

while(gcd(k2,26)!=1)

{

printf("illegal k2!please input agian!");

printf("k2:");

scanf("%d",&k2);

getchar();

}

// char plainText[100]={'\0'};

// char cypherText[100]={'\0'};

printf("open the plain text file\n");

//scanf("%s",plainText);

FILE *fplain,*fcypher;

if((fplain =fopen("plain.txt","a+"))==NULL)

{

printf("can't open plain.txt!\n'");

exit(0);

}

if((fcypher = fopen("cypher.txt","a"))==NULL) {

printf("can't open cypher.txt!\n'");

exit(0);

}

//int i;

char plainText = fgetc(fplain);

char cypherText;

//for(i=0; plainText[i]!='\0'; i++)

// printf("%c",plainText);

相关文档
最新文档