现代密码学实验报告

现代密码学实验报告学生姓名学号专业班级指导教师学院信息科学与工程学院完成时间2014年5月实验一对称密码算法实验[实验目的]1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。

2.掌握DES、AES、RC4的算法流程和实现方法。

[实验预备]1.DES算法有什么特点?算法中的哪些结构保证了其混淆和扩散的特性?答:分组比较短、密钥太短、密码生命周期短、运算速度较慢。

采用替代和置换的方法简单有效地遵循了香农定理,替代操作通过S盒达到了混淆效果,置换操作通过P盒扩散效果。

2.AES算法的基本原理和特点。

答:AES加密数据块分组长度必须为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的密钥长度可变,围是[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、SHA的实现过程。

2. 用程序设计语言将算法过程编程实现。

3. 完成字符串数据的加密运算和解密运算输入明文:Idolikethisbook输入密钥:cryption[实验步骤]1. 预习DES、AES、RC4算法。

2. 写出算法流程,用程序设计语言将算法过程编程实现。

DES算法流程:代码:#include "memory.h"#include "stdio.h"#include <iostream>#include <string>#include <string.h>using namespace std;enum{encrypt,decrypt};//ENCRYPT:加密,DECRYPT:解密void des_run(char out[8],char in[8],bool type=encrypt);//设置密钥void des_setkey(const char key[8]);static void f_func(bool in[32],const bool ki[48]);//f函数static void s_func(bool out[32],const bool in[48]);//s盒代替//变换static void transform(bool *out, bool *in, const char *table, int len); static void xor(bool *ina, const bool *inb, int len);//异或static 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_table[64]={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,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_table[64]={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,18,58,26,33,1,41,9,49,17,57,25};//E位选择表static const char e_table[48]={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_table[32]={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,13,30,6,22,11,4,25}; //pc1选位表const static char pc1_table[56]={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_table[48]={14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,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_table[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};//S盒const static char s_box[8][4][16]={//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,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,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,10,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,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 subkey[16][48];//16圈子密钥void des_run(char out[8],char in[8],bool type){static bool m[64],tmp[32],*li=&m[0],*ri=&m[32];bytetobit(m,in,64);transform(m,m,ip_table,64);if(type==encrypt){for(int i=0;i<16;i++){memcpy(tmp,ri,32);f_func(ri,subkey[i]);xor(ri,li,32);memcpy(li,tmp,32);}}else{for(int i=15;i>=0;i--){memcpy(tmp,li,32);f_func(li,subkey[i]);xor(li,ri,32);memcpy(ri,tmp,32);}}transform(m,m,ipr_table,64);bittobyte(out,m,64);}void des_setkey(const char key[8]){static bool k[64], *kl=&k[0], *kr=&k[28];bytetobit(k,key,64);transform(k,k,pc1_table,56);for(int i=0;i<16;i++){rotatel(kl,28,loop_table[i]);rotatel(kr,28,loop_table[i]);transform(subkey[i],k,pc2_table,48);}}void f_func(bool in[32],const bool ki[48]){static bool mr[48];transform(mr,in,e_table,48);xor(mr,ki,48);s_func(in,mr);transform(in,in,p_table,32);}void s_func(bool out[32],const bool in[48]){for(char i=0,j,k;i<8;i++,in+=6,out+=4){j=(in[0]<<1)+in[5];k=(in[1]<<3)+(in[2]<<2)+(in[3]<<1)+in[4];bytetobit(out,&s_box[i][j][k],4);}}void transform(bool *out,bool *in,const char *table,int len) {static bool tmp[256];for(int i=0;i<len;i++)tmp[i]=in[table[i]-1];memcpy(out,tmp,len);}void xor(bool *ina,const bool *inb,int len){for(int i=0;i<len;i++)ina[i]^=inb[i];}void rotatel(bool *in,int len,int loop){static bool tmp[256];memcpy(tmp,in,loop);memcpy(in,in+loop,len-loop);memcpy(in+len-loop,tmp,loop);}void bytetobit(bool *out,const char *in,int bits){for(int i=0;i<bits;i++)out[i]=(in[i/8]>>(i%8))&1;}void bittobyte(char *out,const bool *in,int bits){memset(out,0,(bits+7)/8);for(int i=0;i<bits;i++)out[i/8]|=in[i]<<(i%8);}void main(){string str;puts("*****************DES***********************");cout<<endl;puts("please input your words");cin>>str;// getline(cin,str);printf("\n");char key[8];cout<<"please input your key(8):";for(int p=0;p<=7;p++)cin>>key[p];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;n>0;n--){char *str1=new char[8];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+1-->m+6des_run(str1,str1,decrypt);mw=mw+str1;string temp1;strcpy(str1,temp1.c_str());str1="";temp="";}puts("after encrypting:");cout<<aw<<endl;puts("after decrypting:");cout<<mw<<endl;}AES算法流程图:代码:#include<iomanip.h>#include<iostream.h>#include<fstream.h>#define null 0const unsigned char Sbox[256] = { // 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, 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, 0xcf, 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, 0x4f, 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, 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, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};const unsigned char ISbox[256] = { // 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, 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, 0xfd, 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, 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, 0xdb, 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, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d};static unsigned char AesRcon[11*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, 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 < 0x80)return (unsigned char)(int)(b <<1);elsereturn (unsigned char)( (int)(b << 1) ^ (int)(0x11B) );}static unsigned char gfmultby03(unsigned char b){return (unsigned char) ( (int)gfmultby02(b) ^ (int)b );}static unsigned char gfmultby09(unsigned char b){return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^(int)b );}static unsigned char gfmultby0b(unsigned char b){return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^(int)gfmultby02(b) ^(int)b );}static unsigned char gfmultby0d(unsigned char b){return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^(int)gfmultby02(gfmultby02(b)) ^(int)(b) );}static unsigned char gfmultby0e(unsigned char b){return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^(int)gfmultby02(gfmultby02(b)) ^(int)gfmultby02(b) );}//密钥移位函数unsigned char* RotWord(unsigned char* word){unsigned char* temp = new unsigned char[4];temp[0] = word[1];temp[1] = word[2];temp[2] = word[3];temp[3] = word[0];return temp;}unsigned char* SubWord(unsigned char* word){unsigned char* temp = new unsigned char[4];for(int j=0;j<4;j++){temp[j] = Sbox[word[j]];}return temp;}void chartomatrix(unsigned char*str,unsigned char Base[][4]) {int r,c;for(c=0;c<4;c++){for(r=0;r<4;r++)Base[r][c]=str[4 * c+r];}}void ByteSub(unsigned char a[4][4],unsigned char b[4][4])//字节转换{int r,c;for(r=0;r<4;r++)for(c=0;c<4;c++)b[r][c]=(Sbox[a[r][c]]);}void IvByteSub(unsigned char a[][4],unsigned char b[][4])//逆字节转换{int r,c;for(r=0;r<4;r++)for(c=0;c<4;c++)b[r][c]=ISbox[a[r][c]];}void ShiftRow(unsigned char b[][4],unsigned char C[][4])//行变换{int r,c;for(r=0;r<4;r++){for(c=0;c<4;c++)C[r][c]=b[r][(c+r)%4];}}void IvShiftRow(unsigned char b[][4],unsigned char C[][4])//逆移动行变换{int r,c;for(r=0;r<4;r++){for(c=0;c<4;c++)C[r][c]=b[r][(c+4-r)%4];}}void MixColumn(unsigned char C[][4],unsigned char d[][4])//混合列变换{int c;for(c=0;c<4;c++)d[0][c]=(unsigned char)((int)gfmultby02(C[0][c]) ^ (int)gfmultby03(C[1][c]) ^ (int)gfmultby01(C[2][c]) ^ (int)gfmultby01(C[3][c]));for(c=0;c<4;c++)d[1][c]=(unsigned char)((int)gfmultby01(C[0][c]) ^ (int)gfmultby02(C[1][c]) ^ (int)gfmultby03(C[2][c]) ^ (int)gfmultby01(C[3][c]));for(c=0;c<4;c++)d[2][c]=(unsigned char)((int)gfmultby01(C[0][c]) ^ (int)gfmultby01(C[1][c]) ^ (int)gfmultby02(C[2][c]) ^ (int)gfmultby03(C[3][c]));for(c=0;c<4;c++)d[3][c]=(unsigned char)((int)gfmultby03(C[0][c]) ^ (int)gfmultby01(C[1][c]) ^ (int)gfmultby01(C[2][c]) ^ (int)gfmultby02(C[3][c]));}void IvMixColumn(unsigned char C[][4],unsigned char d[][4])//逆混合列变换{int c;for(c=0;c<4;c++)d[0][c]=(unsigned char)((int)gfmultby0e(C[0][c]) ^ (int)gfmultby0b(C[1][c]) ^ (int)gfmultby0d(C[2][c]) ^ (int)gfmultby09(C[3][c]));for(c=0;c<4;c++)d[1][c]=(unsigned char)((int)gfmultby09(C[0][c]) ^ (int)gfmultby0e(C[1][c]) ^ (int)gfmultby0b(C[2][c]) ^ (int)gfmultby0d(C[3][c]));for(c=0;c<4;c++)d[2][c]=(unsigned char)((int)gfmultby0d(C[0][c]) ^ (int)gfmultby09(C[1][c]) ^ (int)gfmultby0e(C[2][c]) ^ (int)gfmultby0b(C[3][c]));for(c=0;c<4;c++)d[3][c]=(unsigned char)((int)gfmultby0b(C[0][c]) ^ (int)gfmultby0d(C[1][c]) ^ (int)gfmultby09(C[2][c]) ^ (int)gfmultby0e(C[3][c]));}void AddRoundKey(unsigned char d[][4],unsigned char key[][4],unsigned char e[][4]) //加循环密钥{int r,c;for(r=0;r<4;r++)for(c=0;c<4;c++)e[r][c]=(unsigned char)((int)d[r][c]^(int)key[r][c]);}void KeyProducing(unsigned char*key,unsigned char K[4][44])//扩展初始密钥到44列{unsigned char BaseK[4][4]={0};chartomatrix(key,BaseK);int r,c;unsigned char *temp=new unsigned char[4];for(c=0;c<4;++c){for(r=0;r<4;++r)K[r][c]=BaseK[r][c];}for(c=4;c<44;c++){if(c%4!=0)for(r=0;r<4;r++)K[r][c]=(unsigned char)((int)K[r][c-4] ^ (int)K[r][c-1]);else{ for(r=0;r<4;r++)temp[r]=K[r][c-1];temp=SubWord(RotWord(temp));temp[0] = (unsigned char)( (int)temp[0] ^ (int) AesRcon[c+0] );temp[1] = (unsigned char)( (int)temp[1] ^ (int) AesRcon[c+1] );temp[2] = (unsigned char)( (int)temp[2] ^ (int) AesRcon[c+2] );temp[3] = (unsigned char)( (int)temp[3] ^ (int) AesRcon[c+3] );for(r=0;r<4;r++)K[r][c]=(unsigned char)((int)K[r][c-4] ^ temp[r]);}}}void Encode(unsigned char *Mwen,unsigned char K[][44],unsigned char*out) {unsigned char BaseM[4][4]={0};int round,r,c;unsigned char Ki[4][4]={0};unsigned char e[4][4]={0},b[4][4]={0},C[4][4]={0},d[4][4]={0};chartomatrix(Mwen,BaseM);for(r=0;r<4;r++)for(c=0;c<4;c++)Ki[r][c]=K[r][c];//第0个循环密钥AddRoundKey(BaseM,Ki,e);//ARK,使用第0个循环密钥for(round=1;round<10;round++){ByteSub(e,b);//字节转换ShiftRow(b,C);//移动行变换MixColumn(C,d);//混合列变换for(r=0;r<4;r++)for(c=0;c<4;c++)Ki[r][c]=K[r][4*round+c];//产生第round轮循环的密钥KiAddRoundKey(d,Ki,e);//roundth循环加密}ByteSub(e,b);//第10次循环加密的移动行变换for(r=0;r<4;r++)for(c=0;c<4;c++)Ki[r][c]=K[r][4*10+c];//产生第10轮循环的密钥KiAddRoundKey(C,Ki,e);//10th循环加密for(c=0;c<4;c++){for(r=0;r<4;r++)out[r+4*c]=e[r][c];//加密结果转换成输入}}void Decode(unsigned char*Miwen,unsigned char K[][44],unsigned char*out) {unsigned char BaseM[4][4]={0};unsigned char Ki[4][4]={0};unsigned char e[4][4]={0},b[4][4]={0},C[4][4]={0},d[4][4]={0};int round,r,c;chartomatrix(Miwen,BaseM);for(r=0;r<4;r++)for(c=0;c<4;c++)Ki[r][c]=K[r][4*10+c];//产生第10轮循环的密钥KiAddRoundKey(BaseM,Ki,e);//10th循环解密for(round=9;round>0;round--){IvShiftRow(e,b);IvByteSub(b,C);for(r=0;r<4;r++)for(c=0;c<4;c++)Ki[r][c]=K[r][4*round+c];//产生第round轮循环的密钥KiAddRoundKey(C,Ki,d);IvMixColumn(d,e);}IvShiftRow(e,b);IvByteSub(b,C);for(r=0;r<4;r++)for(c=0;c<4;c++)Ki[r][c]=K[r][c];//产生第round轮循环的密钥KiAddRoundKey(C,Ki,e);//ARK,使用第0个循环密钥for(c=0;c<4;c++)for(r=0;r<4;r++)out[r+4*c]=e[r][c];//加密结果转换成输入}void main(){unsigned char K[4][44]={0};unsigned char *Mwen=new unsigned char[17];unsigned char key[]="1234567890123456";unsigned char outjiam[16]={0};unsigned char outjiem[16]={0};int i;char filename[15] ;cout<<"请输入待加密字符串所在文件的文件名:(文件名的长度不要超过15个字符)"<<endl;cin>>filename;ifstream file;file.open(filename,ios::binary,0);file.seekg(0,ios::beg);file.get(Mwen,17,'#');file.close();cout<<"加密前的明文:"<<endl;cout<<Mwen<<endl;KeyProducing(key,K);Encode(Mwen,K,outjiam);cout<<"\n加密后的密文:\n";for(i=0;i<16;i++)cout<<setw(2)<<setfill('0')<<hex<<(int)outjiam[i];cout<<endl;Decode(outjiam,K,outjiem);cout<<"\n密文解密后的明文:\n";for(i=0;i<16;i++){if(outjiem[i] >=128)cout<<(char)(outjiem[i]%128);elsecout<<(char)(outjiem[i]);}cout<<endl<<endl;}RC4算法流程:算法的初始化部分(用类C伪代码表示):for (i=0; i<n; i++) {s[i]=i;}j=0;for (i=0; i<n; i++){j=(j+s[i]+k[i])%n;swap(s[i], s[j]);}在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。

合集下载

现代密码学-DES加密算法 实验报告

现代密码学-DES加密算法 实验报告

现代密码学实验报告院系:班级:姓名:学号:前言密码学(Cryptology)是研究秘密通信的原理和破译秘密信息的方法的一门学科。

密码学的基本技术就是对数据进行一组可逆的数学变换,使未授权者不能理解它的真实含义.密码学包括密码编码学(Cryptography)和密码分析学(Cryptanalyst)两个既对立又统一的主要分支学科。

研究密码变化的规律并用之于编制密码以保护信息安全的科学,称为密码编码学.研究密码变化的规律并用之于密码以获取信息情报的科学,称为密码分析学,也叫密码破译学.密码学在信息安全中占有非常重要的地位,能够为信息安全提供关键理论与技术.密码学是一门古老而深奥的学问,按其发展进程,经历了古典密码和现代密码学两个阶段。

现代密码学(Modern Cryptology)通常被归类为理论数学的一个分支学科,主要以可靠的数学方法和理论为基础,为保证信息的机密性、完整性、可认证性、可控性、不可抵赖性等提供关键理论与技术。

DES加密算法的实现实验目的理解对称加密算法的原理和特点。

实验原理DES是一种分组加密算法,所谓分组加密算法就是对一定大小的明文或密文来做加密或解密动作。

而在DES这个加密系统中,每次加密或解密的分组大小均为64位,所以DES没有密文扩充的问题。

对大于64位的明文只要按每64位一组进行切割,而对小于64位的明文只要在后面补“0"即可。

另一方面,DES所用的加密或解密密钥也是64位大小,但因其中有8个位是用来作奇偶校验的,所以64位中真正起密钥作用的只有56位,密钥过短也是DES 最大的缺点。

DES加密与解密所用的算法除了子密钥的顺序不同外,其他部分完全相同。

实验环境运行Windows或Linux操作系统的PC机。

实验代码:—--————-——-——本实验采用56位密钥加密64位数据—-———--———--#include <stdlib.h〉#include 〈stdio.h〉#include "bool。

现代密码学实验报告

现代密码学实验报告

现代密码学实验报告学生姓名学号专业班级指导教师学院完成时间实验一对称密码算法实验[实验目的]1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。

2.掌握DES、AES、RC4的算法流程和实现方法。

[实验内容]1. 分析DES、AES、RC4、SHA的实现过程。

2. 用程序设计语言将算法过程编程实现。

3. 完成字符串数据的加密运算和解密运算输入明文:Idolikethisbook输入密钥:cryption[实验步骤]一、DES算法1、DES算法及原理DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。

明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

2、DES算法加解密过程(1) DES算法加密过程如下:a.初始置换。

DES的第一阶段包括64位分组的置换,改变每个分组中位的顺序。

术语置换使用其严格的数学意义;只改变了顺序。

这64位数据现在被分成两半:L0(左半部分)和R0(右半部分)。

下标0说明是原始的数据。

在DES算法第二阶段的每次循环后,这些下标加1。

b.循环移位(16次)一种根据密钥,并且依赖于表格的算法。

这种操作通常被称为数据移位。

这个算法要重复16次,但由于每次移位都使用密钥的不同子分组,因此每次移位的操作各不相同。

密钥的子分组由另一组表格和表格的移位算法来确定。

在每次循环以后,L(左半部分)和R(右半部分)的下标依次加一。

第16次循环的结果被称为预输出。

c.逆置换DES的最后一个阶段包括64位分组的置换,改变每个分组中位的顺序,这与第1阶段的操作类似。

这次置换的输出结果就是密文。

(2)解密过程DES的解密过程和加密过程相同,只是在解密过程中将子密钥的使用顺序颠倒。

密码学案例实验报告书

密码学案例实验报告书

一、实验背景随着信息技术的飞速发展,信息安全问题日益突出。

密码学作为保障信息安全的核心技术,在数据加密、身份认证、数字签名等领域发挥着重要作用。

为了加深对密码学原理的理解,提高实际应用能力,我们开展了本次密码学案例实验。

二、实验目的1. 掌握DES加密算法的基本原理和操作步骤。

2. 熟悉RSA加密算法的原理和应用。

3. 学习数字签名技术的应用。

4. 培养动手实践能力,提高解决实际问题的能力。

三、实验内容1. DES加密算法(1)实验目的:了解DES加密算法的基本原理,掌握DES加密和解密过程。

(2)实验内容:① 设计一个简单的DES加密程序,实现明文到密文的转换。

② 设计一个简单的DES解密程序,实现密文到明文的转换。

(3)实验步骤:① 编写DES加密程序,输入明文和密钥,输出密文。

② 编写DES解密程序,输入密文和密钥,输出明文。

2. RSA加密算法(1)实验目的:了解RSA加密算法的基本原理,掌握RSA加密和解密过程。

(2)实验内容:① 设计一个简单的RSA加密程序,实现明文到密文的转换。

② 设计一个简单的RSA解密程序,实现密文到明文的转换。

(3)实验步骤:① 编写RSA加密程序,输入明文和密钥对,输出密文。

② 编写RSA解密程序,输入密文和私钥,输出明文。

3. 数字签名技术(1)实验目的:了解数字签名技术的基本原理,掌握数字签名的生成和验证过程。

(2)实验内容:① 设计一个简单的数字签名程序,实现签名生成和验证。

(3)实验步骤:① 编写数字签名程序,输入明文、私钥和签名算法,输出签名。

② 编写数字签名验证程序,输入明文、公钥和签名,验证签名是否正确。

四、实验结果与分析1. DES加密算法实验结果通过编写DES加密和解密程序,成功实现了明文到密文和密文到明文的转换。

实验结果表明,DES加密算法在保证数据安全的同时,具有较高的效率。

2. RSA加密算法实验结果通过编写RSA加密和解密程序,成功实现了明文到密文和密文到明文的转换。

现代密码学实验报告

现代密码学实验报告

现代密码学实验报告学生姓名学号专业班级指导教师学院信息科学与工程学院完成时间2014年5月实验一对称密码算法实验[实验目的]1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。

2.掌握DES、AES、RC4的算法流程和实现方法。

[实验预备]1.DES算法有什么特点算法中的哪些结构保证了其混淆和扩散的特性答:分组比较短、密钥太短、密码生命周期短、运算速度较慢。

采用替代和置换的方法简单有效地遵循了香农定理,替代操作通过S盒达到了混淆效果,置换操作通过P盒扩散效果。

2.AES算法的基本原理和特点。

答:AES加密数据块分组长度必须为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的密钥长度可变,范围是[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、SHA的实现过程。

现代密码学-RC4校验 实验报告

现代密码学-RC4校验 实验报告

现代密码学实验报告院系:理学院班级:信安二班姓名:学号:前言密码学(Cryptology)是研究秘密通信的原理和破译秘密信息的方法的一门学科。

密码学的基本技术就是对数据进行一组可逆的数学变换,使未授权者不能理解它的真实含义。

密码学包括密码编码学(Cryptography)和密码分析学(Cryptanalyst)两个既对立又统一的主要分支学科。

研究密码变化的规律并用之于编制密码以保护信息安全的科学,称为密码编码学。

研究密码变化的规律并用之于密码以获取信息情报的科学,称为密码分析学,也叫密码破译学。

密码学在信息安全中占有非常重要的地位,能够为信息安全提供关键理论与技术。

密码学是一门古老而深奥的学问,按其发展进程,经历了古典密码和现代密码学两个阶段。

现代密码学(Modern Cryptology)通常被归类为理论数学的一个分支学科,主要以可靠的数学方法和理论为基础,为保证信息的机密性、完整性、可认证性、可控性、不可抵赖性等提供关键理论与技术。

RC4密码算法算法实现实验目的:理解流密码的概念及相关结构; 理解并能够编写基本的流密码体制; 熟练应用C/C++编程实现RC4密码算法体制。

实验内容:编程实现RC4加/解密算法。

实验原理:RC4算法是一种序列密码体制或称流密码体制,其加密密钥和解密密钥相同RC4的密钥长度可变,但为了确保哪去安全强度,目前RC4至少使用128位的密钥。

用1~256个字节(8~2048位)的可变长度密钥初始化一个256个字节的状态向量S,S的元素记为S[0],S[1],…,S[255],从始至终置换后的S包含从0到255的所有8位数。

对于加密和解密,字节K是从S的255个元素中按一种系统化的方式选出的一个元素生成的。

每生成一个K的值,S中的元素个体就被重新置换一次。

实验代码:Encrypt.h文件:#ifndef _ENCRYPT_RC4_#define _ENCRYPT_RC4_#include <string.h>#define BOX_LEN 256intGetKey(const unsigned char* pass, intpass_len, unsigned char *out);int RC4(const unsigned char* data, intdata_len, const unsigned char* key, intkey_len, unsigned char* out, int* out_len);static void swap_byte(unsigned char* a, unsigned char* b);char* Encrypt(const char* szSource, const char* szPassWord); // 加密,返回加密结果char* Decrypt(const char* szSource, const char* szPassWord); // 解密,返回解密结果char* ByteToHex(const unsigned char* vByte, constintvLen); // 把字节码pbBuffer转为十六进制字符串,方便传输unsigned char* HexToByte(const char* szHex); // 把十六进制字符串转为字节码pbBuffer,解码#endif // #ifndef _ENCRYPT_RC4_Encrypt.cpp文件:#include "Encrypt.h"char* Encrypt(const char* szSource, const char* szPassWord) // 加密,返回加密结果{if(szSource == NULL || szPassWord == NULL) return NULL;unsigned char* ret = new unsigned char[strlen(szSource)];intret_len = 0;if(RC4((unsigned char*)szSource,strlen(szSource),(unsigned char*)szPassWord,strlen(szPassWord),ret,&ret_len) == NULL)return NULL;char* ret2 = ByteToHex(ret, ret_len);delete[] ret;return ret2;}char* Decrypt(const char* szSource, const char* szPassWord) // 解密,返回解密结果{if(szSource == NULL || (strlen(szSource)%2 != 0) || szPassWord == NULL) return NULL;unsigned char* src = HexToByte(szSource);unsigned char* ret = new unsigned char[strlen(szSource) / 2 + 1];intret_len = 0;memset(ret, strlen(szSource) / 2 + 1,0);if(RC4(src, strlen(szSource) / 2, (unsigned char*)szPassWord, strlen(szPassWord), ret, &ret_len) == NULL)return NULL;ret[ret_len] = '/0';return (char*)ret;}int RC4(const unsigned char* data, intdata_len, const unsigned char* key, intkey_len, unsigned char* out, int* out_len){if (data == NULL || key == NULL || out == NULL)return NULL;unsigned char* mBox = new unsigned char[BOX_LEN];if(GetKey(key, key_len, mBox) == NULL)return NULL;inti=0;int x=0;int y=0;for(int k = 0; k <data_len; k++){x = (x + 1) % BOX_LEN;y = (mBox[x] + y) % BOX_LEN;swap_byte(&mBox[x], &mBox[y]);out[k] = data[k] ^ mBox[(mBox[x] + mBox[y]) % BOX_LEN];}*out_len = data_len;delete[] mBox;return -1;}intGetKey(const unsigned char* pass, intpass_len, unsigned char* out) {if(pass == NULL || out == NULL)return NULL;inti;for(i = 0; i< BOX_LEN; i++)out[i] = i;int j = 0;for(i = 0; i< BOX_LEN; i++){j = (pass[i % pass_len] + out[i] + j) % BOX_LEN;swap_byte(&out[i], &out[j]);}return -1;}static void swap_byte(unsigned char* a, unsigned char* b){unsigned char swapByte;swapByte = *a;*a = *b;*b = swapByte;}// 把字节码转为十六进制码,一个字节两个十六进制,内部为字符串分配空间char* ByteToHex(const unsigned char* vByte, constintvLen){if(!vByte)return NULL;char* tmp = new char[vLen * 2 + 1]; // 一个字节两个十六进制码,最后要多一个'/0'int tmp2;for (inti=0;i<vLen;i++){tmp2 = (int)(vByte[i])/16;tmp[i*2] = (char)(tmp2+((tmp2>9)?'A'-10:'0'));tmp2 = (int)(vByte[i])%16;tmp[i*2+1] = (char)(tmp2+((tmp2>9)?'A'-10:'0'));}tmp[vLen * 2] = '/0';return tmp;}// 把十六进制字符串,转为字节码,每两个十六进制字符作为一个字节unsigned char* HexToByte(const char* szHex){if(!szHex)return NULL;intiLen = strlen(szHex);if (iLen<=0 || 0!=iLen%2)return NULL;unsigned char* pbBuf = new unsigned char[iLen/2]; // 数据缓冲区int tmp1, tmp2;for (inti=0;i<iLen/2;i++){tmp1 = (int)szHex[i*2] - (((int)szHex[i*2]>='A')?'A'-10:'0');if(tmp1>=16)return NULL;tmp2 = (int)szHex[i*2+1] - (((int)szHex[i*2+1]>='A')?'A'-10:'0');if(tmp2>=16)return NULL;pbBuf[i] = (tmp1*16+tmp2);}return pbBuf;}main.cpp文件#include <iostream>#include <string>#include <stdio.h>#include "Encrypt.h"intmain(){inti;std::cout<< "请选择你要进行的操作:1 .加密 2.解密" <<std::endl;std::cin>>i;if (i == 1){char source[100];char pass[100];char *result = NULL;std::cout<< "请输入明文:";std::cin>> source; std::cout<<std::endl;std::cout<< "请输入密钥:";std::cin>> pass;result = Encrypt(source, pass);printf("密文为:%s/n", result);delete[]result;}else if (i == 2){char result[100];char pass[100];char *source = NULL;std::cout<< "请输入密文:";std::cin>> result; std::cout<<std::endl;std::cout<< "请输入密钥:";std::cin>> pass;source = Encrypt(result, pass);printf("明文为:%s/n", source);delete[]source;}elsestd::cout<< "您输入的不合法!" <<std::endl;return 0;}实验结果:。

现代密码算法实验报告(3篇)

现代密码算法实验报告(3篇)

第1篇一、实验目的1. 了解现代密码学的基本原理和数论基础知识;2. 掌握非对称密码体制的著名代表RSA加密算法的工作原理和流程;3. 设计实现一个简单的密钥系统;4. 掌握常用加密算法AES和DES的原理及实现。

二、实验内容1. RSA加密算法实验2. AES加密算法实验3. DES加密算法实验三、实验原理1. RSA加密算法RSA算法是一种非对称加密算法,由罗纳德·李维斯特、阿迪·沙米尔和伦纳德·阿德曼三位密码学家于1977年提出。

其基本原理是选择两个大质数p和q,计算它们的乘积n=pq,并计算欧拉函数φ(n)=(p-1)(q-1)。

选择一个整数e,满足1<e<φ(n)且e与φ(n)互质。

计算e关于φ(n)的模逆元d。

公开密钥为(e,n),私有密钥为(d,n)。

加密过程为C=Me mod n,解密过程为M=Cd mod n。

2. AES加密算法AES(Advanced Encryption Standard)是一种分组加密算法,采用128位分组大小和128、192或256位密钥长度。

AES算法主要分为四个阶段:初始轮、密钥扩展、中间轮和最终轮。

每个轮包括字节替换、行移位、列混淆和轮密钥加。

3. DES加密算法DES(Data Encryption Standard)是一种分组加密算法,采用64位分组大小和56位密钥长度。

DES算法主要分为16轮,每轮包括置换、置换-置换、S盒替换和密钥加。

四、实验步骤及内容1. RSA加密算法实验(1)选择两个大质数p和q,计算n=pq和φ(n)=(p-1)(q-1);(2)选择一个整数e,满足1<e<φ(n)且e与φ(n)互质,计算e关于φ(n)的模逆元d;(3)生成公开密钥(e,n)和私有密钥(d,n);(4)用公钥对明文进行加密,用私钥对密文进行解密。

2. AES加密算法实验(1)选择一个128、192或256位密钥;(2)初始化初始轮密钥;(3)进行16轮加密操作,包括字节替换、行移位、列混淆和轮密钥加;(4)输出加密后的密文。

密码学实验报告三

加密流程解密流程
(2)子密钥的产生流程:
子密钥产生流程
2、利用下列程序实现一个文件的加密和解密:(程序的主要代码,整个程序见附件)
//密钥置换1pc-1
intDES_PC1_Transform(ElemTypekey[64],ElemTypetempbts[56]){
intcnt;
for(cnt=0;cnt<56;cnt++){
}
memcpy(data,temp,32);
return0;
}
//循环左移
//左右两边同时循环左移相同的位数.
//10010循环左移1位为00101,左移2位为01010
intDES_ROL(ElemTypedata[56],inttimes){
ElemTypetemp[56];//temp只保存将要循环到右边的位.
其他:
评价教师签名:
一、实验原理和目的
DES算法属于分组加密算法,即在明文加密和密文解密过程中,信息都是按照固定长度分组后进行处理的。混淆和扩散是它采用的两个最重要的安全特性。混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂,无法从数学上描述或者统计。扩散是指明文和密钥中的每一位信息的变动,都会影响到密文中许多位信息的变动,从而隐藏统计上的特性,增加密码的安全。
data[cur2+1]=(output&0X04)>>2;//output=7=0111oxo4=0100
data[cur2+2]=(output&0X02)>>1;//相&得到0100右移2位得到1
data[cur2+3]=output&0x01;
}

密码学实验报告(AES,RSA)

华北电力大学实验报告||实验名称现代密码学课程设计课程名称现代密码学||专业班级:学生姓名:学号:成绩:指导教师:实验日期:[综合实验一] AES-128加密算法实现 一、实验目的及要求(1)用C++实现;(2)具有16字节的加密演示;(3)完成4种工作模式下的文件加密与解密:ECB, CBC, CFB,OFB.二、所用仪器、设备计算机、Visual C++软件。

三. 实验原理3.1、设计综述AES 中的操作均是以字节作为基础的,用到的变量也都是以字节为基础。

State 可以用4×4的矩阵表示。

AES 算法结构对加密和解密的操作,算法由轮密钥开始,并用Nr 表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表2所示)。

AES 算法的主循环State 矩阵执行1 r N 轮迭代运算,每轮都包括所有 4个阶段的代换,分别是在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和AddRoundKey ,(由于外部输入的加密密钥K 长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。

最后执行只包括 3个阶段 (省略 MixColumns 变换)的最后一轮运算。

表2 AES 参数比特。

3.2、字节代替(SubBytes )AES 定义了一个S 盒,State 中每个字节按照如下方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,然后取出S 盒中对应行和列的元素作为输出。

例如,十六进制数{84}。

对应S 盒的行是8列是4,S 盒中该位置对应的值是{5F}。

S 盒是一个由16x16字节组成的矩阵,包含了8位值所能表达的256种可能的变换。

S 盒按照以下方式构造:(1) 逐行按照升序排列的字节值初始化S 盒。

第一行是{00},{01},{02},…,{OF};第二行是{10},{l1},…,{1F}等。

现代密码学——古典密码算法(实验报告)

安全SnoWolF/百度B英俊制作课程名称现代密码学实验实验项目名称古典密码算法练习一 Caesar密码加密时每一个字母向前推移k位,例如当k=5时,置换表如表2所示。

表2 Caesar置换表于是对于明文:datasecurityhasevolvedrapidly经过加密后就可以得到密文:IFYFXJHZWNYDMFXJATQAJIWFUNIQD若令26个字母分别对应整数0~25,如表3所示。

表3 Caesar置换表则Caesar加密变换实际上是:c=(m+k)mod26其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,也称为密钥。

很容易得到相应的Caesar解密变换是:m=D(c)=(c–k)mod26例如明文:datasecurity对应的数据序列:301901842201781924当k=5时经过加密变换得到密文序列:852452397252213243对应的密文为:IFYFXJHZWNYD【实验步骤】本练习主机A、B为一组,C、D为一组,E、F为一组。

首先使用“快照X”恢复Windows系统环境。

一.手动完成Caesar密码(1) 在实验原理部分我们已经了解了Caesar密码的基本原理,那么请同学们写出当密钥k=3时,对应明文:data security has evolved rapidly的密文: GDWD VHFXULWB KDV HYROYHG UDSLGOB 。

(2) 进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点击“Caesar密码”。

在明文输入区输入明文:data security has evolved rapidly。

将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。

请根据密钥验证密文与明文对应关系是否正确。

二.Caesar加密(1) 进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。

现代密码学与加解密技术实验报告

现代密码学与加解密技术实验一、实验教学目标与基本要求现代密码学与加解密技术实验是本课程重要的实践教学环节。

实验的目的不仅仅是验证理论知识,更重要的是通过实验加强学生的实验手段与实践技能,培养学生分析问题、解决问题、应用知识的能力和创新精神,全面提高学生的综合素质。

通过本实验简要了解密码学以及现代密码算法的基本知识,学会常用文件加密的实现、了解系统加密解密技术,具体掌握几种加解密方法。

实验后完成要求撰写实验报告,报告内容包括题目、测试数据、运行结果、遇到的问题和解决方法、关键代码或程序清单,学生可以在实验报告中提出对实验的建议和意见。

二、实验项目及教学安排三、实验成绩考核办法每次实验后,要求从以下几个方面书写实验报告:实验题目,程序清单,实验用数据及结果,学生可以在实验报告中提出对实验的建议和意见。

实验成绩满分100分,并按10%折算记入课程总成绩,实验成绩不合格者不得参加期末考试。

实验成绩按下面7条进行考核评定。

(1)做好实验内容的预习,写出预习报告;占10%。

(2)了解实验题目的调试方法;占10%。

(3)按实验要求预先设计好程序;占10%。

(4)认真记录实验数据并分析实验结果;占10%。

(5)实验后按要求书写实验报告,记录实验用数据及运行结果;占30%。

(6)创新能力强,在实验中设计的程序有一定的通用性,算法优化;20%。

(7)实验过程中,具有严谨的学习态度,认真、踏实、一丝不苟的科学作风;10%四、实验教材及参考书1.Richard J.Spillman:《CLASSICAL AND CONTEMPORARY CRYPTOLOGY》,清华大学出版社,2005-72.William Stallings: Cryptography and Network Security: Principles and Practice. 2nd ed. Prentice Hall, 1998.3.杨波著:《现代密码学》,清华大学出版社,2003-8.4.Wenbo Mao. Modern Cryptography: Theory and Practicce. 电子工业出版社,2004-7.5.许主洪著:《加密与解密-密码技术剖析与实战应用》,人民邮电出版社,2002-8.6.张焕国,刘玉珍著:《密码学引论》,武汉大学出版社,2003.7.段钢著:《加密与解密》,电子工业出版社,2005-3.五、实验内容与报告的要求实验1、2的内容要求(提示性的)与封面见附录一(打印时将“附录一”3个字去掉)。

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