密码学基础实验指导书.doc

上传人:文库蛋蛋多 文档编号:4193006 上传时间:2023-04-09 格式:DOC 页数:26 大小:231.50KB
返回 下载 相关 举报
密码学基础实验指导书.doc_第1页
第1页 / 共26页
密码学基础实验指导书.doc_第2页
第2页 / 共26页
密码学基础实验指导书.doc_第3页
第3页 / 共26页
密码学基础实验指导书.doc_第4页
第4页 / 共26页
密码学基础实验指导书.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《密码学基础实验指导书.doc》由会员分享,可在线阅读,更多相关《密码学基础实验指导书.doc(26页珍藏版)》请在三一办公上搜索。

1、五邑大学本科生实验指导书密码学基础实验指导书课程名称:密码学基础课程编号:课程性质:专业选修课课程总学时:48实验总学时:8任课教师:高伟峰一、实验教学目的和基本要求密码学基础是计算科学与技术本科专业开设的一门专业选修课,本课程的主要目标是让学生学习和了解密码学的一些基本概念,理解和掌握一些常用密码算法,包括加密和解密、认证理论及算法、安全计算原理及算法,学会进行效率分析和安全性分析。密码学是信息安全的核心技术,是实现安全通信的基础,所以实验和理论一样都很重要,实验能够让学生通过多个密码算法的程序设计实现,更好地掌握密码算法设计的机理和方法,熟悉网络攻击和防范方法。同时,基于密码系统设计的基本

2、方法和基本步骤,帮助学生理解密码学在信息安全中的地位,并引导了解密码学领域及信息安全领域的新进展、新方向。具体要求如下:1要求学生在上机前对本次实验的原理、内容、方案进行充分准备。2每次实验必须按要求的格式撰写实验报告,内容大体包括:实验目的、实验内容、实验及算法原理、程序清单、结果分析、总结。3实验成绩作为平时成绩的一部分。二、实验内容及学时分配 实验一 古典密码学实验(2学时)一、实验目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(

3、encryption algorithm)、解密算法(decryption algorithm)等。二、实验内容 1)用CC+语言实现仿射变换(Affine)加/解密算法;2)用CC+语言实现统计26个英文字母出现的频率的程序;3)利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。 放射变换:加密:解密:其中a, b为密钥,且gcd(a, 26)=1实验要求:加/解密程序对任意满足条件的a、b都能够处理。三、实验步骤(1)统计26个英文字母出现的频率的程序#include#include#includeusing

4、namespace std;void main() ifstream in(a.txt); vector s; vector n(26,0); for(int i=0;ix; ) for(int i=0;i26;+i) if(int(x)=si) ni+; float sum=0.0; for(int j=0;j26;+j) sum+=nj; cout统计结果如下:endl; for(int k=0;k26;+k)/ nk=nk/sum; cout char(k+97)出现的概率为:nk/sumendl; /coutnkendl; (2)仿射变换加/解密程序对一段较长的英文文章进行加密#inc

5、lude #include#include#includeusing namespace std;/判断两个数是不是互素(辗转相除)/bool gcd(int a)int f=26,g,r;g=a;dor=f%g;f=g;g=r;while(r);if(f=1)return 1;elsereturn 0;/求逆/int inv(int a)int x,i;for(i=1;i=30;+i)if(26*i+1)%a=0)x=(26*i+1)/a;break;return x;/void main()cout请你选择操作密码的方式:endl 0-表示加密 endl 1-表示解密 z;if(z=0|z

6、=1) /cout请输入密钥a和b:ab;if(a25)|(b25)couta,b的输入范围有错!endl;elseif(gcd(a)=0)cout密钥a有误,与26不互素endl;elseif(z=0)/加密算法 ifstream in(a.txt); ofstream out(b.txt); vector s; for(char x;inx; ) s.push_back(int(x); for(int i=0;is.size();+i) si=(a*(si-97)+b)%26; outchar(si+97); coutendl; cout加密成功!明文请见b.txtendl; else/解

7、密算法ifstream in(b.txt); ofstream out(a.txt); vector s; for(char x;inx; ) s.push_back(int(x); for(int i=0;is.size();+i) si=inv(a)*(si-97-b+26)%26; outchar(si+97);outendl;cout解密成功!密文请见a.txtendl;/elsecout所选操作无效!endl;四、实验结果及分析该程序是对文件进行操作,结果如下:(1) 统计26个英文字母出现的频率的程序(2) 仿射变换加/解密程序对一段较长的英文文章进行加密下面是文本内容:实验二 A

8、ES密码的实现(4学时)一、实验目的 通过实现AES密码算法,理解对称密码机制。二、实验内容 1)在深入理解AES加密/解密算法理论的基础上,设计一个AES加密/解密软件系统;2)完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特(16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;3) 程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值;4) 要求提供所设计系统的报告及完整的软件。三、实验步骤1.字节替换SubBytes()变换是一个基于S盒的非线性置换,它用于将输入或中间态的每一个字节通过一个简单的查表操作,将其映射为另

9、一个字节。映射方法是把输入字节的高四位作为S盒的行值,低四位作为列值,然后取出S盒中对应的行和列的元素作为输出。unsigned char subbytes(unsigned char state44) printf(after subbyte:n); /取出中间态state映射到S盒中的值赋给中间态statefor(i=0;i4;i+)for(j=0;j4;j+)stateij=sboxstateij; for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij); printf(n);printf(n); return

10、0; 2行移位ShiftRows()完成基于行的循环移位操作,变换方法是第0行不动,第一行循环左移一个字节,第二位循环左移两个字节,第三行循环左移三个字节。unsigned char shiftrows(unsigned char state44) printf(after shiftrows:n); / 在中间态的行上, k=state10; / 第0行不变 state10=state11; / 第一行循环左移一个字节 state11=state12; / 第二行循环左移两个字节 state12=state13; / 第三行循环左移三个字节 state13=k; k=state20; sta

11、te20=state22; state22=k; k=state21; state21=state23; state23=k; k=state30; state30=state33; state33=state32; state32=state31; state31=k; for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij); printf(n); printf(n); return 0; 3列混合MixColumns()实现逐列混合,方法是s(x)=c(x)*s(x)mod(x4+1)unsigned char m

12、ixcolumns(unsigned char state44) printf(after mixcolumns:n);/ 实现 (02 03 01 01) 与中间态state分别相乘后异或得相应值for(i=0;i4;i+) / (01 02 03 01) / (01 01 02 03) k=state0i; / (03 01 01 02) temp0 = state0i state1i state2i state3i ; temp1 = state0i state1i ; temp1 = xtime(temp1); state0i = temp1 temp0 ; temp1 = state

13、1i state2i ; temp1 = xtime(temp1); state1i = temp1 temp0 ; temp1 = state2i state3i ; temp1 = xtime(temp1); state2i = temp1 temp0 ; temp1 = state3i k ; temp1 = xtime(temp1); state3i = temp1 temp0 ; for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij); printf(n); printf(n);return 0;4轮密钥加A

14、ddRoundKey()用于将输入或中间态S的每一列与一个密钥字ki进行按位异或,每一个轮密钥由Nb个字组成。unsigned char addroundkey(unsigned char state44,unsigned char w44)printf(addroundkey %d:n,round+); /将中间态state中的每一列与一个密钥字(w44中的一列)进行按位异或for(i=0;i4;i+) /完了又赋值给statefor(j=0;j4;j+)stateij=wij;for(i=0;i4;i+) /输出到屏幕显示出来statefor(j=0;j4;j+)printf(tt%02x

15、 ,stateij);printf(n);printf(n); return 0; 5密钥扩展 通过生成器产生Nr+1个轮密钥,每个轮密钥由Nb个字组成,共有Nb(Nr+1)个字。在加密过程中,需要Nr+1个轮密钥,需要构造4(Nr+1)个32位字。首先将输入的4个字节直接复制到扩展密钥数组的前4个字中,得到W0,W1,W2,W3;然后每次用4个字填充扩展密钥数余下的部分。/keyexpand printf(after keyexpand:n);for(i=4;i8;i+) if(i%4=0) rotword0=w1i-1; rotword1=w2i-1; rotword2=w3i-1; ro

16、tword3=w0i-1; printf(rotword():); for(j=0;j4;j+) printf(%02x ,rotwordj); for(j=0;j4;j+) subwordj=sboxrotwordj; printf(nsubword():); for(j=0;j4;j+) printf(%02x ,subwordj); printf(nn); for(j=0;j4;j+) rconj=subwordj RconNj ; printf(after Rcon():); for(j=0;j4;j+) printf(%02x ,rconj); printf(nn);for(j=0;

17、j4;j+) wji%4=rconj wji-4 ;printf(w%d :,count);for(j=0;j4;j+) printf( %02x ,wji%4) ; count+; else for(j=0;j4;j+)wji%4=wji%4wj(i%4)-1;printf(w%d :,count);for(j=0;j4;j+) printf( %02x ,wji%4); count+; printf(nn);printf(密钥扩展 Round key:n);for(i=0;i4;i+)for(j=0;j4;j+)printf(tt%02x ,wij);printf(n);printf(n)

18、;6逆字节替换与字节代替类似,逆字节代替基于逆S盒实现。unsigned char InvSubbytes(unsigned char state44) for(i=0;i4;i+) /基于逆S盒的映射替代 for(j=0;j4;j+) stateij = rsboxstateij; printf(after InvSubbyte:n); for(i=0;i4;i+)for(j=0;j4;j+) /输出到屏幕显示stateprintf(tt%02x ,stateij); printf(n);printf(n);return 0;7逆行移位与行移位相反,逆行移位将态state的后三行按相反的方向

19、进行移位操作,即第0行保持不变,第1行循环向右移一个字节,第2行循环向右移动两个字节,第3行循环向右移动三个字节。unsigned char InvShiftRows(unsigned char state44) k=state13; state13=state12; /对中间态state进行移位操作 state12=state11; / 第0行保持不变 state11=state10; / 第1行循环右移一个字节 state10=k; / 第2行循环右移两个字节 / 第3行循环右移三个字节 k=state20; state20=state22; state22=k; k=state21; s

20、tate21=state23; state23=k; k=state30; state30=state31; state31=state32; state32=state33; state33=k;printf(after InvShiftRows:n);for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij); printf(n); printf(n); return 0;8逆列混合逆列混淆的处理办法与MixColumns()类似,每一列都通过与一个固定的多项式d(x)相乘进行交换。unsigned char InvM

21、ixColumns(unsigned char state44)printf(after InvMixColumns :n); /实现(0e 0b 0d 09)与中间态state分别相乘后异或得相应值 for(i=0;i4;i+) / (09 0e 0b 0d) temp0 = state0i; / (0d 09 0e 0b) temp1 = state1i; / (0b 0d 09 0e) temp2 = state2i; temp3 = state3i; state0i = Multiply(temp0, 0x0e) Multiply(temp1, 0x0b) Multiply(temp2

22、, 0x0d) Multiply(temp3, 0x09); state1i = Multiply(temp0, 0x09) Multiply(temp1, 0x0e) Multiply(temp2, 0x0b) Multiply(temp3, 0x0d); state2i = Multiply(temp0, 0x0d) Multiply(temp1, 0x09) Multiply(temp2, 0x0e) Multiply(temp3, 0x0b); state3i = Multiply(temp0, 0x0b) Multiply(temp1, 0x0d) Multiply(temp2, 0

23、x09) Multiply(temp3, 0x0e); for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij);printf(n);printf(n);return 0;9加密加密部分分了两种情况:一种是自动检查加密程序的正确性,之前在程序里给明文和密钥赋上初值,运行程序检验结果是否正确;另一种是用户手动输入32位的十六进制数,进行加密,我是把每一具体项模块化,将功能在每个具体模块中实现,只需要直接调用,视觉效果强,一目了然。 下面是实现加密功能一些关键代码:void AES_encrypt(unsigned char

24、 StateN, unsigned char RoundKeyN)message16=0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x37,0x07,0x34;key16=0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c; for(i=0;i4;i+) for(j=0;j4;j+) / 分别获取明文和密钥 stateji=messagem;wji=keym;m+; .addroundkey(state

25、,w);for(round=2;round11;round+)printf(第 %d 轮加密 : n,round);subbytes(state); shiftrows(state);mixcolumns(state);keyexpand(w, round);addroundkey(state,w);subbytes(state); /最后一轮shiftrows(state);keyexpand(w, 10);addroundkey(state,w);10解密AES解密也是分成了两个部分,第一部分是在程序中对密文和密钥赋初值,通过与标准对照检查解密过程的正确性;第二部分是用户手动输入密文和密钥

26、,程序对其进行解密,得到最后的明文。解密过程基本如下:1)获取输入的明文和密钥 2)通过密钥扩展过程获取各轮密钥 3)轮密钥加变换过程 4)逆行移位 5)逆字节替代 6)轮密钥加变换 7)逆列混淆47步共9次循环,最后一轮实现46步,完成解密过程。主要代码如下:void AES_decrypt(unsigned char StateN, unsigned char wN)key16=0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c;cipher16=0x39,0x25,0x84,0x1

27、d,0x02,0xdc,0x09,0xfb,0xdc,0x11,0x85,0x97,0x19,0x6a,0x0b,0x32;printf(%02x ,keyi);printf(n); /获取密文和密钥 for(i=0;i4;i+) for(j=0;j 0; i -)/1-9轮 InvShiftRows(state);InvSubbytes(state);Keyexpand(w,round );AddRoundKey(State, w); InvMixColumns(State);InvShiftRows(State); /最后一轮InvSubBytes(State); Keyexpand(w,

28、0 );AddRoundKey(State, w);四、实验结果及分析 为检验程序的正确性,需要将结果与标准相对照。下面是程序运行界面: 实验三、RSA算法的实现(2学时)一、实验目的通过实现RSA算法,理解公钥密码机制。二、实验内容利用CC+实现RSA算法的加、解密运算。具体包括:1) 利用扩展的EUCLID计算 a mod n 的乘法逆元;2) Miller-Rabin素性测试算法对一个给定的大数进行测试;3) 实现的运算,并计算;4) 利用Fermat定理手工计算,并与3)计算的结果对比;5) 实现RSA算法。并对I LOVE THE PEOPLES REPUBLIC OF CHINA加

29、解密。说明:为了方便实现,分组可以小一点,比如两个字母一组。字母及其数字编码字母及其数字编码空格 00N 14A 01O 15B 02P 16C 03Q 17D 04R 18E 05S 19F 06T 20G 07U 21H 08V 22I 09W 23J 10X 24K 11Y 25L 12Z 26M 13三、实验步骤#include #include #include using namespace std;int Euclid(int a,int n)/n大于aint x,y,r;x=n;y=a;for(int i=0;)if(y=0)return x;if(y=1)return y;

30、r=x%y;x=y;y=r;double extenEuclid(double a,double n)/利用扩展的EUCLID计算 a mod n 的乘法逆元double x1=1,x2=0,x3=n,y1=0,y2=1,y3=a,Q;double t1,t2,t3;for(int i=0;) if(y3=0) return x3; coutno reverseendl; if(y3=1) return y2; Q=int(x3/y3); t1=x1-Q*y1; t2=x2-Q*y2; t3=x3-Q*y3; x1=y1;x2=y2;x3=y3; y1=t1;y2=t2;y3=t3;bool

31、Rabin(int a,int n)/Miller-Rabin素性测试算法对一个给定的大数进行测试vector b;unsigned int N=n-1;for(int i=0,j=1; i+)if(jN)break;if( (N i) & (unsigned int)1 ) b.push_back(1);elseb.push_back(0);j*=2;/将n-1表示成二进制形式for(int k=0;kb.size();k+)coutbk;cout=0;ii-)x=d;d=(d*d)%n;if(d=1&x!=1&x!=n-1)return false;if(bii=1)d=(d*a)%n;i

32、f(d!=1)return false;return true;double quickindex1(double a,double m,double n)/实现am mod n 的运算vector b;unsigned double N=m;for(int ii=0,j=1;ii+)if(jN)break;if(Nii)& (unsigned double) 1)b.push_back(1);elseb.push_back(0);j*=2;double c=0,d=1;for(int i=b.size()-1;i=0;i-)c*=2;d=(d*d)-int(d*d)/n)*n;if(bi=1)c+=1;d=(d*a)-int(d*a)/n)*n;return d;void transfer(char cypher,double c)int m100=0;for(int i=0,j=0;cypherj!=0;i+=2)if(cypherj= )mi=0;mi+1=0;elsemi=cypherj-64;if(m

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号