密码学课程设计(格式)2016
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);