密码学基础-实验指导书

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

五邑大学本科生实验指导书《密码学基础》实验指导书课程名称:密码学基础课程编号:课程性质:专业选修课课程总学时:48实验总学时:8任课教师:高伟峰一、实验教学目的和基本要求《密码学基础》是计算科学与技术本科专业开设的一门专业选修课,本课程的主要目标是让学生学习和了解密码学的一些基本概念,理解和掌握一些常用密码算法,包括加密和解密、认证理论及算法、安全计算原理及算法,学会进行效率分析和安全性分析。密码学是信息安全的核心技术,是实现安全通信的基础,所以实验和理论一样都很重要,实验能够让学生通过多个密码算法的程序设计实现,更好地掌握密码算法设计的机理和方法,熟悉网络攻击和防范方法。同时,基于密码系统设计的基本方法和基本步骤,帮助学生理解密码学在信息安全中的地位,并引导了解密码学领域及信息安全领域的新进展、新方向。具体要求如下:1.要求学生在上机前对本次实验的原理、内容、方案进行充分准备。2.每次实验必须按要求的格式撰写《实验报告》,内容大体包括:实验目的、实验内容、实验及算法原理、程序清单、结果分析、总结。3.实验成绩作为平时成绩的一部分。二、实验内容及学时分配实验一古典密码学实验(2学时)一、实验目的通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryptionkey)、解密密钥(decryptionkey)、加密算法(encryptionalgorithm)、解密算法(decryptionalgorithm)等。二、实验内容1)用C\C++语言实现仿射变换(Affine)加/解密算法;2)用C\C++语言实现统计26个英文字母出现的频率的程序;3)利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。放射变换:加密:26mod,bammEcba解密:26mod1,bcacDmba其中a,b为密钥,25,0ba,且gcd(a,26)=1实验要求:加/解密程序对任意满足条件的a、b都能够处理。三、实验步骤(1)统计26个英文字母出现的频率的程序#includeiostream#includefstream#includevectorusingnamespacestd;voidmain(){ifstreamin(a.txt);vectorints;vectorintn(26,0);for(inti=0;i26;++i)s.push_back(97+i);for(charx;inx;)for(inti=0;i26;++i)if(int(x)==s[i]){n[i]++;}floatsum=0.0;for(intj=0;j26;++j)sum+=n[j];cout统计结果如下:endl;for(intk=0;k26;++k){//n[k]=n[k]/sum;cout''char(k+97)出现的概率为:n[k]/sumendl;//coutn[k]endl;}(2)仿射变换加/解密程序对一段较长的英文文章进行加密#includestdafx.h#includeiostream#includefstream#includevectorusingnamespacestd;//////////判断两个数是不是互素(辗转相除)////////boolgcd(inta){intf=26,g,r;g=a;do{r=f%g;f=g;g=r;}while(r);if(f==1)return1;elsereturn0;}//////////////////求逆//////intinv(inta){intx,i;for(i=1;i=30;++i)if((26*i+1)%a==0){x=(26*i+1)/a;break;}returnx;}//////////////////////////////////////////////////////////voidmain(){cout请你选择操作密码的方式:endl0-表示加密endl1-表示解密endl;intz;cinz;if(z==0||z==1){//////////////////////////////////////////cout请输入密钥a和b:endl;inta,b;cinab;if((a1||a25)||(b0||b25))couta,b的输入范围有错!endl;elseif(gcd(a)==0)cout密钥a有误,与26不互素endl;else{if(z==0)////加密算法{ifstreamin(a.txt);ofstreamout(b.txt);vectorints;for(charx;inx;)s.push_back(int(x));for(inti=0;is.size();++i){s[i]=(a*(s[i]-97)+b)%26;outchar(s[i]+97);}coutendl;cout加密成功!明文请见\b.txt\endl;}else////解密算法{ifstreamin(b.txt);ofstreamout(a.txt);vectorints;for(charx;inx;)s.push_back(int(x));for(inti=0;is.size();++i){s[i]=inv(a)*(s[i]-97-b+26)%26;outchar(s[i]+97);}outendl;cout解密成功!密文请见\a.txt\endl;}}////////////////////////////////////////}elsecout所选操作无效!endl;}四、实验结果及分析该程序是对文件进行操作,结果如下:(1)统计26个英文字母出现的频率的程序(2)仿射变换加/解密程序对一段较长的英文文章进行加密下面是文本内容:实验二AES密码的实现(4学时)一、实验目的通过实现AES密码算法,理解对称密码机制。二、实验内容1)在深入理解AES加密/解密算法理论的基础上,设计一个AES加密/解密软件系统;2)完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特(16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;3)程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值;4)要求提供所设计系统的报告及完整的软件。三、实验步骤1.字节替换SubBytes()变换是一个基于S盒的非线性置换,它用于将输入或中间态的每一个字节通过一个简单的查表操作,将其映射为另一个字节。映射方法是把输入字节的高四位作为S盒的行值,低四位作为列值,然后取出S盒中对应的行和列的元素作为输出。unsignedcharsubbytes(unsignedcharstate[4][4]){printf(aftersubbyte:\n);//取出中间态state映射到S盒中的值赋给中间态statefor(i=0;i4;i++){for(j=0;j4;j++)state[i][j]=sbox[state[i][j]];}for(i=0;i4;i++)//输出到屏幕显示state{for(j=0;j4;j++)printf(\t\t%02x,state[i][j]);printf(\n);}printf(\n);return0;}2.行移位ShiftRows()完成基于行的循环移位操作,变换方法是第0行不动,第一行循环左移一个字节,第二位循环左移两个字节,第三行循环左移三个字节。unsignedcharshiftrows(unsignedcharstate[4][4]){printf(aftershiftrows:\n);//在中间态的行上,k=state[1][0];//第0行不变state[1][0]=state[1][1];//第一行循环左移一个字节state[1][1]=state[1][2];//第二行循环左移两个字节state[1][2]=state[1][3];//第三行循环左移三个字节state[1][3]=k;k=state[2][0];state[2][0]=state[2][2];state[2][2]=k;k=state[2][1];state[2][1]=state[2][3];state[2][3]=k;k=state[3][0];state[3][0]=state[3][3];state[3][3]=state[3][2];state[3][2]=state[3][1];state[3][1]=k;for(i=0;i4;i++)//输出到屏幕显示state{for(j=0;j4;j++)printf(\t\t%02x,state[i][j]);printf(\n);}printf(\n);return0;}3.列混合MixColumns()实现逐列混合,方法是s’(x)=c(x)*s(x)mod(x^4+1)unsignedcharmixcolumns(unsignedcharstate[4][4]){printf(aftermixcolumns:\n);//实现(02030101)与中间态state分别相乘后异或得相应值for(i=0;i4;i++)//(01020301){//(01010203)k=state[0][i];//(03010102)temp[0]=state[0][i]^state[1][i]^state[2][i]^state[3][i];temp[1]=state[0][i]^state[1][i];temp[1]=xtime(temp[1]);state[0][i]^=temp[1]^temp[0];temp[1]=state[1][i]^state[2][i];temp[1]=xtime(temp[1]);state[1][i]^=temp[1]^temp[0];temp[1]=state[2][i]^state[3][i];temp[1]=xtime(temp[1]);state[2][i]^=temp[1]^temp[0];temp[1]=state[3][i]^k;temp[1]=xtime(temp[1]);state[3][i]^=temp[1]^temp[0];}for(i=0;i4;i++)//输出到屏幕显示state{for(j=0;j4;j++)printf(\t\t%02x,state[i][j]);printf(\n);}printf(\n);return0;}4.轮密钥加AddRoundKey()用于将输入或中间态S的每一列与一个密钥字ki进行按位异或,每一个轮密钥由Nb个字组成。unsignedcharaddroundkey(unsignedcharstate[4][4],unsignedcharw[4][4]){printf(addroundkey%d:\n,round++);//将中间态state中的每一列与一个密钥字(w[4][4]中的一列)进行按位异或for(i=0;i4;i++)//完了又赋值给state{for(j=0;j4;j++)state[i][j]^=w[i][j];}for(i=0;i4;i++)//输出到屏幕显示出来state{for(j=0;j4;j++)printf(\t\t%02x,state[i][j]);printf(\n);}printf(\n);return0;}5.密钥扩展通过生成器产生Nr+1个轮密钥,每个轮密钥由Nb个字组成,共有Nb(Nr+1)个字。在加密过程中,需要Nr+1个轮密钥,需要构造4(Nr+1)个3

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功