1、现 代 密 码 学学生姓名 学 号 专业班级 指导教师 学 院 信息科学与工程学院 完成时间 2014 年 5 月实 验 报 告实验一 对称密码算法实验实验目的1.掌握密码学中经典的对称密码算法 DES、AES、RC4 的算法原理。2.掌握 DES、AES、RC4 的算法流程和实现方法。实验预备1.DES 算法有什么特点?算法中的哪些结构保证了其混淆和扩散的特性?答:分组比较短、密钥太短、密码生命周期短、运算速度较慢。采用替代和置换的方法简单有效地遵循了香农定理,替代操作通过 S 盒达到了混淆效果,置换操作通过 P 盒扩散效果。2.AES 算法的基本原理和特点。答:AES 加密数据块分组长度必
2、须为 128 比特,密钥长度可以是 128 比特、192 比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐) 。AES 加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion) , 2、初始轮(Initial Round) ,3、重复轮(Rounds) ,每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey ,4、最终轮( Final Round) ,最终轮没有 MixColumns。3.流密码 RC4 的密钥流生成以及 S 盒初始化过程。答:RC4 由伪随机数生成器和异或运算组成。RC4 的密钥长度可变,范围
3、是1,255 。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个 S 盒。S 盒用来加密数据,而且在加密过程中 S 盒会变化。 初始化长度为 256 的 S 盒。第一个for 循环将 0 到 255 的互不重复的元素装入 S 盒。第二个 for 循环根据密钥打乱 S 盒。下面i,j 是两个指针。每收到一个字节,就进行 while 循环。通过一定的算法((a),(b))定位 S 盒中的一个元素,并与输入字节异或,得到 k。循环中还改变了 S 盒((c)) 。如果输入的是明文,输出的就是密文;如果输入的是密文,输出的就是明文。实验内容1. 分析 DES、AES、RC4
4、、SHA 的实现过程。2. 用程序设计语言将算法过程编程实现。3. 完成字符串数据的加密运算和解密运算输入明文:Idolikethisbook 输入密钥:cryption 实验步骤1. 预习 DES、AES、RC4 算法。2. 写出算法流程,用程序设计语言将算法过程编程实现。DES 算法流程:代码:#include “memory.h“#include “stdio.h“#include #include #include using namespace std;enumencrypt,decrypt;/ENCRYPT:加密,DECRYPT:解密void des_run(char out8,c
5、har in8,bool type=encrypt);/设置密钥void des_setkey(const char key8);static void f_func(bool in32,const bool ki48);/f 函数static void s_func(bool out32,const bool in48);/s 盒代替/变换static void transform(bool *out, bool *in, const char *table, int len);static void xor(bool *ina, const bool *inb, int len);/异或s
6、tatic void rotatel(bool *in, int len, int loop);/循环左移/字节组转换成位组static void bytetobit(bool *out,const char *in, int bits);/位组转换成字节组static void bittobyte(char *out, const bool *in, int bits);/置换 IP 表const static char ip_table64=58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,
7、48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7;/逆置换 IP-1 表const static char ipr_table64=40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,34,2,42,10,50
8、,18,58,26,33,1,41,9,49,17,57,25;/E 位选择表static const char e_table48=32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1;/P 换位表const static char p_table32=16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,1
9、3,30,6,22,11,4,25;/pc1 选位表const static char pc1_table56=57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4;/pc2 选位表const static char pc2_table48=14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,
10、8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32;/左移位数表const static char loop_table16=1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;/S 盒const static char s_box8416=/s114,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,4,1,14,8,13,6,2,11,15,12,9,7,3
11、,10,5,0,15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,/s215,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,/s310,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,13,6,4,9,8,15,3,0,11
12、,1,2,12,5,10,14,7,1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,/s47,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,/s52,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,4,2,1,11,1
13、0,13,7,8,15,9,12,5,6,3,0,14,11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,/s612,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,/s74,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
14、1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,/s813,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11;static bool subkey1648;/16 圈子密钥void des_run(char out8,char in8,bool t
15、ype)static bool m64,tmp32,*li=bytetobit(m,in,64);transform(m,m,ip_table,64);if(type=encrypt)for(int i=0;i=0;i-)memcpy(tmp,li,32);f_func(li,subkeyi);xor(li,ri,32);memcpy(ri,tmp,32);transform(m,m,ipr_table,64);bittobyte(out,m,64);void des_setkey(const char key8)static bool k64, *kl=bytetobit(k,key,64)
16、;transform(k,k,pc1_table,56);for(int i=0;i(i%8)void bittobyte(char *out,const bool *in,int bits)memset(out,0,(bits+7)/8);for(int i=0;istr;/ getline(cin,str);printf(“n“);char key8;coutkeyp;des_setkey(key);int m=str.size();int n=m/8+1;str=str.substr(0,m);int i=0;string aw,mw;for(n;n0;n-)char *str1=new
17、 char8;string temp;temp=str.substr(i,8);i=i+8;strcpy(str1,temp.c_str();des_run(str1,str1,encrypt);aw=aw+str1;aw=aw.substr(0,m+6);/m+1m+6des_run(str1,str1,decrypt);mw=mw+str1;string temp1;strcpy(str1,temp1.c_str();str1=“;temp=“;puts(“after encrypting:“);cout#include#include#define null 0const unsigne
18、d char Sbox256 = / forward s-box0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71,
19、0xd8, 0x31, 0x15,0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xc
20、f,0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,0x60, 0x81, 0
21、x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,0xba, 0x78, 0x25, 0x2e, 0x1c
22、, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0
23、x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16;const unsigned char ISbox256 = / inverse s-box0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,0x54, 0x7b,
24、0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,0x6c, 0x70, 0x48, 0x50, 0xf
25、d, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc,
26、0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xd
27、b, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c,
28、0x83, 0x53, 0x99, 0x61,0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d;static unsigned char AesRcon11*4=0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,0x02, 0x00, 0x00, 0x00,0x04, 0x00, 0x00, 0x00,0x08, 0x00, 0x00, 0x00,0x10, 0x00, 0x00, 0x00,0x20, 0x00
29、, 0x00, 0x00,0x40, 0x00, 0x00, 0x00,0x80, 0x00, 0x00, 0x00,0x1b, 0x00, 0x00, 0x00,0x36, 0x00, 0x00, 0x00;static unsigned char gfmultby01(unsigned char b)return b;static unsigned char gfmultby02(unsigned char b)if (b 0;round-)IvShiftRow(e,b);IvByteSub(b,C);for(r=0;rfilename;ifstream file;file.open(fi
30、lename,ios:binary,0);file.seekg(0,ios:beg);file.get(Mwen,17,#); file.close();cout=128)cout#include#includeusing namespace std;typedef unsigned long ULONG;void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len)int i = 0, j = 0;char k256 = 0;unsigned char temp = 0;for(i = 0; i pData;cou
31、tkey;cout#includeusing namespace std;int CheckPrime()int n; double k;cin n;k = sqrt(n);int i;if(n=2 else cout mmj;/*for(int j=0;jccj;/*for(int j=0;je;couti;switch(i)case 1:jiami(e,temp1,temp2);Test();case 2:jiemi(e,temp1,temp2);Test();case 3:Test();case 0:break;int main()cout“欢迎进入 RSA 算法“endl;couten
32、dl;Test();return 0;4. 输入指定的明文和密钥进行实验,验证结果。写出所编写程序的流程图和运行界面、运行结果。问题讨论1. 总结算法的特点,分析算法的安全性;答:产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密,速度太慢。RSA 的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解 RSA 就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。 RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解 n 是最显然的攻击方法。人们已能分解多个十进制位的大素数。因此,模数 n 必须选大一些,因具体适用情况而定。2. 分析实验中在编辑、编译、运行等各环节中所出现的问题及解决方法。答:生成大素数这个问题开始纠结了一段时间,但是后来老师不要求特别大的素数,所以才开始做。开始的时候一直有一个问题,如果用 ASC 码的话,那么要求的大小写会成为不同密文。后来又试着用字母数字代替,这才勉强完成。总体来说,技术不够,完成得并不完美。回答问题