现代密码学实验报告

现代密码学实验报告
现代密码学实验报告

现代密码学实验报告

学生姓名

学号

专业班级

指导教师

学院信息科学与工程学院

完成时间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

#include

#include

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]={//s1

14,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,

//s2

15,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,

//s3

10,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,

//s4

7,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,

//s5

2,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,

//s6

12,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,

//s7

4,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,

//s8

13,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

tmp[i]=in[table[i]-1];

memcpy(out,tmp,len);

}

void xor(bool *ina,const bool *inb,int len)

{

for(int i=0;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

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

out[i/8]|=in[i]<<(i%8);

}

void main()

{

string str;

puts("*****************DES***********************");

cout<

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+6

des_run(str1,str1,decrypt);

mw=mw+str1;

string temp1;

strcpy(str1,temp1.c_str());

str1="";

temp="";

}

puts("after encrypting:");

cout<

puts("after decrypting:");

cout<

}

AES算法流程图:

代码:

#include

#include

#include

#define null 0

const unsigned char Sbox[256] = { // forward s-box

0x63, 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-box

0x52, 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);

else

return (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轮循环的密钥Ki

AddRoundKey(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轮循环的密钥Ki

AddRoundKey(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轮循环的密钥Ki

AddRoundKey(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轮循环的密钥Ki

AddRoundKey(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轮循环的密钥Ki

AddRoundKey(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个字符)"<

cin>>filename;

ifstream file;

file.open(filename,ios::binary,0);

file.seekg(0,ios::beg);

file.get(Mwen,17,'#');

file.close();

cout<<"加密前的明文:"<

cout<

KeyProducing(key,K);

Encode(Mwen,K,outjiam);

cout<<"\n加密后的密文:\n";

for(i=0;i<16;i++)

cout<

cout<

Decode(outjiam,K,outjiem);

cout<<"\n密文解密后的明文:\n";

for(i=0;i<16;i++)

{

if(outjiem[i] >=128)

cout<<(char)(outjiem[i]%128);

else

cout<<(char)(outjiem[i]);

}

cout<

}

RC4算法流程:

算法的初始化部分(用类C伪代码表示):

for (i=0; i

s[i]=i;

}

j=0;

for (i=0; i

{

j=(j+s[i]+k[i])%n;

swap(s[i], s[j]);

}

在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且,该序列是随机的:

i=j=0;

while (明文未结束)

{

++i%=n;

j=(j+s)%n;

swap(s, s[j]);

sub_k=s((s+s[j])%n);

}

得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。

代码:

#include

#include

#include

using namespace std;

typedef unsigned long ULONG;

void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len) {

int i = 0, j = 0;

char k[256] = {0};

unsigned char temp = 0;

for(i = 0; i < 256; i++)

{

s[i] = i;

k[i] = key[i % Len];

}

for (i = 0; i < 256; i++)

{

j = (j + s[i] + k[i]) % 256;

temp = s[i];

s[i] = s[j];

s[j] = temp;

}

}

void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len) {

int i = 0, j = 0, t = 0;

unsigned long k = 0;

unsigned char temp;

for(k = 0; k < Len; k++)

{

i = (i + 1) % 256;

j = (j + s[i]) % 256;

temp = s[i];

s[i] = s[j];

s[j] = temp;

t = (s[i] + s[j]) % 256;

Data[k] ^= s[t];

}

}

int main()

{

unsigned char s[256] = {0}, s2[256] = {0};

cout<<"****************RC4****************"<

cout<<"请输入加密容:"<

char pData[600];

cin>>pData;

cout<<"请输入密钥:"<

char key[256];

cin>>key;

cout<

ULONG len = strlen(pData);

int i;

system("cls");

cout<<"****************RC4****************"<

cout<<"明文为:"<

cout<<"密钥为:"<

cout<<"密钥长度为:"<

rc4_init(s, (unsigned char *)key, strlen(key));

cout<<"S盒初始化填充完毕……"<

for(i = 0; i < 256; i++)

{

s2[i] = s[i];

}

cout<<"加密后:"<

rc4_crypt(s, (unsigned char *)pData, len);

cout<<"密文为:"<

cout<<"解密后:"<

rc4_crypt(s2, (unsigned char *)pData, len);

cout<<"解密为:"<

return 0;

}

3.输入指定的明文、密钥进行实验,验证结果。DES运行截图:

AES

现代密码学实验报告

现代密码学 实验报告 学生姓名 学号 专业班级计算机科学与技术指导教师段桂华 学院信息科学与工程学院完成时间2016年4月

实验一密码算法实验 [实验目的] 1.掌握密码学中经典的对称密码算法AES、RC4的算法原理。 2.掌握AES、RC4的算法流程和实现方法。 [实验预备] 1.AES算法的基本原理和特点。 2.流密码RC4的密钥流生成以及S盒初始化过程。 [实验内容] 1. 分析AES、RC4的实现过程。 2. 用程序设计语言将算法过程编程实现。 3. 完成字符串数据的加密运算和解密运算 输入十六进制明文:11223344556677889900AABBCCDDEEFF 输入十六进制密钥:13579BDF02468ACE1234567890ABCDEF [实验步骤] 1. 预习AES、RC4算法。 2. 写出算法流程,用程序设计语言将算法过程编程实现。 3. 输入指定的明文、密钥进行实验,验证结果。 4. 自己选择不同的输入,记录输出结果。 写出所编写程序的流程图和运行界面、运行结果。 一、AES算法 1、AES算法简介 AES 是一种可用来保护电子数据的新型加密算法。特别是,AES 是可以使用128、192 和 256 位密钥的迭代式对称密钥块密码,并且可以对 128 位(16 个字节)的数据块进行加密和解密。与使用密钥对的公钥密码不同的是,对称密钥密码使用同一个密钥来对数据进行加密和解密。由块密码返回的加密数据与输入数据具有相同的位数。迭代式密码使用循环结构来针对输入数据反复执行排列和置换运算。 2、算法实现及流程 以加密函数为例,如下所示,首先对密钥进行预处理密钥扩展,然后明文进行Nr(Nr与密钥长度有关)次迭代运算,包括字节替换SubBytes、移位行运算ShiftRows、混合列运算MixColumns、以及轮秘钥加密AddRoundKey。

1密码学-DES实验报告

南京信息工程大学实验(实习)报告实验(实习)名称对称密码实验(实习)日期得分指导教师 系计软院专业网络工程年2011 班次 1 姓名学号20111346026 一.实验目的 1.理解对称加密算法的原理和特点 2.理解DES算法的加密原理 二.实验内容 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果作为新的有半部分,原来的有半部分变成了新的左半部分。用下面的规则来表示这一过程(假设第i次迭代所得到的结果为LiRi): Li = Ri-1; Ri = Li-1⊕f(Ri-1,Ki);在最后一轮左与右半部分并未变换,而是直接将R16 L16并在一起作为未置换的输入。 第三阶段:逆(初始)置换。他是初始置换IP的逆置换,记为IP-1。在对16次迭代的结果(R16 L16)再使用逆置换IP-1后,得到的结果即可作为DES加密的密文Y输出,即Y = IP-1 (R16 L16) 三.流程图&原理图

流程图

DES原理图

密码学实验报告

密码学实验报告 学院:计算机科学与技术 班级: 学号: 姓名: 指导老师:

密码学 实验日志 实验题目: DES (或AES )分组密码 实验目的: 熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解; 分组密码将明文分成一组一组,在密钥的控制下,经过加密变换生成一组一组的密文。具体而言,分组密码就是将明文消息序列 ,,,,21i m m m 划分成等长的消息组 ),,,,(),,,,(22121n n n n m m m m m m ++在密钥t k k k k ,,,21 =的控制下按固定的加密算法一组一 组进行加密,输出一组一组密文 ),,,,(),,,,(22121l l l l c c c c c c ++。 下面的实验以DES 算法为例,DES 算法明文分组长为64bit ,加密后得到64bit 的密文,输入初始种子密钥为64bit ,第8、16、24、32、40、48、56、64为奇偶校验位,实际的密钥长为56bit 。DES 加密过程由三个阶段来完成: (1) 初始置换IP ,用于重排明文分组的64bit 数据; (2) 相同结构的16轮迭代,每轮中都有置换和代换运算,第16轮变换的输出分为左右两半,并交换次序。 (3) 逆初始置换IP -1 (为IP 的逆)后,产生64bit 的密文。 实验要求: (1) Windows 系列操作系统; (2) VC6.0编程环境。 (3) 提交完整的程序代码清单和详细的注释; (4) 要求有程序运行结果显示。当加密成功时,得到密文;输入相同的密钥,能将密文恢复成明文。 实验主要步骤: (1) 熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解; (2) 分析源程序中密码算法的加解密和子密钥生成等典型模块的主要功能,并对源程序加上注释; (3) 在已提供的部分源程序的基础上,添加源程序省缺的部分; (4) 对给定的消息分组进行加解密运算和验证。 源代码: #include #include #include typedef bool (*PSubKey)[16][48]; enum {ENCRYPT,DECRYPT}; //选择:加密;解密 static bool SubKey[2][16][48]; // 16圈子密钥 static bool Is3DES; // 3次DES 标志 static char Tmp[256], deskey[16]; //暂存字符串,密钥串

杭电密码学DES密码实验报告

课程实验报告 课程密码学实验 学院通信工程学院 专业信息安全 班级14083611 学号14084125 学生姓名刘博 实验名称DES密码实验 授课教师胡丽琴

DES密码实验 一、实验要求: 1、了解分组密码的起源与涵义。 2、掌握DES密码的加解密原理。 3、用Visual C++实现DES密码程序并输出结果。 二、实验内容: 1、1949年,Shannon发表了《保密系统的通信理论》,奠定了现代密码学的基础。他还指出混淆和扩散是设计密码体制的两种基本方法。扩散指的是让明文中的每一位影响密文中的许多位,混淆指的是将密文与密钥之间的统计关系变得尽可能复杂。而分组密码的设计基础正是扩散和混淆。在分组密码中,明文序列被分成长度为n的元组,每组分别在密钥的控制下经过一系列复杂的变换,生成长度也是n的密文元组,再通过一定的方式连接成密文序列。 2、DES是美国联邦信息处理标准(FIPS)于1977年公开的分组密码算法,它的设计基于Feistel对称网络以及精心设计的S盒,在提出前已经进行了大量的密码分析,足以保证在当时计算条件下的安全性。不过,随着计算能力的飞速发展,现如今DES已经能用密钥穷举方式破解。虽然现在主流的分组密码是AES,但DES的设计原理仍有重要参考价值。在本实验中,为简便起见,就限定DES 密码的明文、密文、密钥均为64bit,具体描述如下: 明文m是64bit序列。 初始密钥K是64 bit序列(含8个奇偶校验bit)。 子密钥K1, K2…K16均是48 bit序列。 轮变换函数f(A,J):输入A(32 bit序列), J(48 bit序列),输出32 bit序列。 密文c是64 bit序列。 1)子密钥生成: 输入初始密钥,生成16轮子密钥K1, K2 (16) 初始密钥(64bit)经过置换PC-1,去掉了8个奇偶校验位,留下56 bit,接着分成两个28 bit的分组C0与D0,再分别经过一个循环左移函数LS1,得到C1与D1,连成56 bit数据,然后经过置换PC-2,输出子密钥K1,以此类推产生K2至K16。

实验报告_密码学

信息安全实验报告 学号: 学生姓名: 班级:

实验三密码学实验 一、古典密码算法实验 一、实验目的 通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、编译环境 运行windows 或linux 操作系统的PC 机,具有gcc(linux)、VC (windows)等C语言编译环境。 三、实验原理 古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 1.替代密码 替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如:明文字母a、b、c、d ,用D、E、F、G做对应替换后形成密文。 替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。下面我们介绍一种典型的单表替代密码,恺撒(caesar)密码,又叫循环移位密码。它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代。它的加密过程可以表示为下面的函数:E(m)=(m+k) mod n 其中:m 为明文字母在字母表中的位置数;n 为字母表中的字母个数;k 为密钥;E(m)为密文字母在字母表中对应的位置数。例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L:E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L

2.置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改 变,从而实现明文信息的加密。置换密码有时又称为换位密码。 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的 顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而 形成密文。例如,明文为attack begins at five,密钥为cipher,将明文按照每行 6 列的形式排在矩阵中,形成如下形式: a t t a c k b e g i n s a t f i v e 根据密钥cipher中各字母在字母表中出现的先后顺序,给定一个置换: 1 2 3 4 5 6 f = 1 4 5 3 2 6 根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第 3 列, 第2列,第 6 列的顺序排列,则有下面形式: a a c t t k b i n g e s a I v f t e 从而得到密文:abatgftetcnvaiikse 其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。 四、实验内容和步骤 1、根据实验原理部分对替代密码算法的介绍,自己创建明文信息,并选择 一个密钥k,编写替代密码算法的实现程序,实现加密和解密操作。 2、根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。 五、总结与思考 记录程序调试过程中出现的问题,分析其原因并找出解决方法。记录最终实现的程序执行结果。

密码学实验报告模板总结模板计划模板.doc

密码学应用与实践课程实验报告 实验 1:实现 DES密码体制 一、实验目的 1.编写程序实现 DES的加、解 密:1)编程构造 DES的密钥; 2)应用上述获得的密钥将一段英文或文件进行加、解密。 2.用 DES算法实现口令的安全 二、实验内容 1.DES原理 DES综合运用了置换,代换,移位多种密码技术,是一种乘积密码。在算法结构上采用迭代 结构,从而使其结构清晰,调理清楚,算法为对合运算,便于实现,运行速度快。DES使用了初始置换IP 和 IP-1 各一次(相应的置换看算法描述图表)置换P16 次,安排使用这 3 个置换的目的是把数据彻底打乱重排。选择置换 E 一方面把数据打乱重排,另一方面把32 位输入扩展为48 位,算法中除了S- 盒是非线性变换外,其余变换均为显示变换,所以保密 的关键是选择S- 盒。符合以下 3 条准则: (1)对任何一个 S- 盒而言,没有任何线性方程式等价于此S-盒的输出输入关系,即是S- 盒是非线性函数。 (2)改变 s- 盒的任何一位输入,都会导致两位以上的输出改变,即满足" 雪崩效应 " 。(3)当固定某一个位的输入时,S- 盒的 4 个出位之间,其中0 和 1 的个数之差小。这个准 则的本质是数据压缩,把四位输入压缩为 4 位输出。选择 S-盒函数的输入中任意改变数位, 其输出至少变化两位。因为算法中使用了16 次迭代,大大提高了保密性。 2.DES算法由加密、解密和子密钥的生成三部分组成 1)加密 DES算法处理的数据对象是一组64 比特的明文串。设该明文串为m=m1m2m64 (mi=0 或 1) 。明文串经过64 比特的密钥K 来加密,最后生成长度为64 比特的密文E。其加密过程图示如下:

密码学实验第三组实验报告

云南大学数学与统计学实验教学中心实验报告 课程名称:密码学实验学期:2013-2014学年第一学期成绩: 指导教师:陆正福学生姓名:卢富毓学生学号:20101910072 实验名称:零知识证明实验要求:必做实验学时:4学时 实验编号: No.3 实验日期:2013/9/28完成日期:2012/10/18 学院:数学与统计学院专业:信息与计算科学年级: 2010级 一、实验目的: 了解零知识证明,同时掌握FFS识别方案。 二、实验内容: 1. 理解零知识证明 2. 基于GMP实现FFS零知识证明方案 三、实验环境 Linux平台 Code::Block IDE https://www.360docs.net/doc/6e14777776.html, 网络在线编程平台(本实验是在此平台中完成的,效果一样) 四、实验过程(请学生认真填写): 1. 预备知识: “零知识证明”它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。 2. 实验过程 A、原理分析: Feige-Fait-Shamir是一种并行的认证形式。具体做法如下 首先:选择大素数q 和p, 计算n=pq ,Peggy 拥有密钥s1, s2, ...,sk 接着做如下UML图中的内容:

//缺点有:首先在编写好程序后才发现,无法模拟伪造者来进行。这个由结果就能看出来。 //同时,此程序仅仅模拟,做不到并行认证。 五、实验总结 1.遇到的问题、分析并的出方案(列出遇到的问题和解决办法,列出没有解决的问题):遇到问题: 主要是对于算法的不熟悉,不能清晰的认识整个算法运作。 分析并解决: 仔细揣摩,并且动手写了一下算法的UML图。得到了加深。 2.体会和收获。 收获: 加深了GMP中函数的运用。 在学习零知识证明的知识后,了解了什么是零知识证明,同时会了一点零知识证明的方法。这是比较大的收获——毕竟以前从没有想过这方面的东西,接触之后才恍然。 当然这个FFS算法也并不是一定的安全。也存在着一定的缺陷和漏洞,例如验证次数、对于vi的猜测等等。 六、参考文献 GMP_Document 《应用密码学》林岱岳 《密码学概论》wade trape 七、教师评语:

现代密码学-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

密码学实验报告(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}等。在行X 和列Y 的字节值是{xy}。 (2) 把S 盒中的每个字节映射为它在有限域GF(k 2)中的逆。GF 代表伽罗瓦域,GF(82) 由一组从0x00到0xff 的256个值组成,加上加法和乘法。 ) 1(] [2)2(3488++++= x x x x X Z GF 。{00}被映射为它自身{00}。 (3) 把S 盒中的每个字节记成),,,,,,,,(012345678b b b b b b b b b 。对S 盒中每个字节的每位 做如下变换: i i i i i i c b b b b b i b ⊕⊕⊕⊕⊕='++++8mod )7(8mod )6(8mod )5(8mod )4( 上式中i c 是指值为{63}字节C 第i 位,即)01100011(),,,,,,,,(012345678=c c c c c c c c c 。符号(')表示更新后的变量的值。AES 用以下的矩阵方式描述了这个变换: ?? ? ?? ? ? ? ? ? ??? ? ????????????+???????????????????????????????????????? ????????????=??????????????????????????0110001111111000011111000011111000011111100011111100011111100011111100017654321076543210b b b b b b b b b b b b b b b b 最后完成的效果如图:

密码学实验讲义及实验报告2014

密码学基础 实验指导书 黑龙江大学计算机科学技术学院 2013年3月

目录 前言........................................................................................................................... - 2 -要求与评分标准....................................................................................................... - 3 -1要求. (3) 2评分标准 (3) 实验1 古典密码的实现(3学时) .................................................................... - 4 -实验2 对称密钥密码体制的实现(6学时) .................................................... - 4 -实验3 公开密钥密码算法的实现(6学时) .................................................... - 5 -实验4 数字签名算法的实现(3学时) ............................................................ - 5 -附录1:实验报告格式 ........................................................................................... - 7 -

密码学实验报告总结

密码学实验报告(本文档为Word版本,下载后可自由编辑) 项目名称:××××××××× 项目负责人:××× 联系电话:××××× 编制日期:×××××

密码学实验报告 实验目的:掌握Caesar密码加密解密原理,并利用VC++编程实现。 实验内容:Caesar密码的加密原理是对明文加上一个密钥(偏移值)而得到密文。假设密钥为3,那么字母“a”对应的ASCII码为97,加上3得100正好是字母“d”的ASCII码值, 实验说明:加密实现的两种方式,只限定英文字母(区分大小写),加密时,根据明文字符是小(大)写字母,采用加密运算: 密文字符=“a”或“A”+(明文字符-“a”或“A”+password%26+26)%26 如果输入其他字符,则直接原样输出,不作处理 可以是任意字符 加密时,我们不做任何区分,直接利用Caesar密码算法 密文字符=明文字符+password 解密反之。 实验结果: void CCaesarDlg::OnButton1() //加密按钮 { UpdateData(TRUE); //从界面上的输入的值传入成员变量 m_crypt=m_plaintxt; //密文进行初始化,它与明文的长度是相同的 for(int i=0;i=48&&m_plaintxt.GetAt(i)<=57) //如果输入的字符是数字 { m_crypt.SetAt(i,'0'+(m_plaintxt.GetAt(i)-'0'+m_password%10 +10)%10);

现代密码学学习报告

现代密码学学习报告 第一章 概论 1.1信息安全与密码技术 信息的一般定义属于哲学范畴。信息是事物运动的状态与方式,是事物的一种区别于物质与能量的属性。 “信息”——数据。 机密性——拥有数据的一方或交换数据的各方不希望局外人或对手获得、进而读懂这些数据。 完整性——数据在交换及保存中不被未授权者删除或改动,或者合法的接受者能方便的判断该数据是否已经被篡改。 认证性——也称“不可否认性”或“抗抵赖”,包括信息源和接收端认证性,即信息系统中的实体不能否认或抵赖曾经完成的发送消息或接收消息的操作。利用信息源证据可以检测出消息发送方否认已发送某消息的抵赖行为,利用接收端证据可以检测出消息接收方否认已接收某消息的抵赖行为。此类证据通常还包括时间/时序或“新鲜性”证据。 可用性——授权用户能对信息资源有效使用。显然,信息系统可靠性是其支撑之一。 公平性——信息具有的社会或经济价值只能在交互中体现。公平性就是指交换规则或交互协议要使得参与信息交互的各方承担安全风险上处于相同或相当的地位。 可控性——是指对信息的传播及传播的内容以至信息的机密性具有控制能力的特性。一般指信息系统或(社会)授权机构根据某种法规对信息的机密性、信息的传播通道、特定内容信息的传播具有控制能力的特性,以及获取信息活动审计凭证能力的特性,如“密钥托管”、“匿名撤销”、实时内容检测与过滤、计算机犯罪或诉讼的司法取证等。 1.2密码系统模型和密码体制 密码系统基本模型: 密码体制的分类:对称密码体制的古典算法有简单代换、多名代换、多表代换等。 非对称密码体制:使用非对称密码体制的每一个用户一个是可以公开的,称为公开密钥,简称公钥,用pku 表示;另外一个则是秘密的,称为秘密秘钥,简称私钥,用sku 表示。非对称密码体制又称为双钥密码体制或公钥密码体制。 公钥密码体制的主要特点是将加密能力分开并分别并分别授予不同的用户,因而可以实现信 源M 加密器() c m =1k E 非法接入者密码分析员 (窃听者)搭线信道 (主动攻击) 搭线信道(被动攻击)解密器接收者 ()m c =2k D 密钥源密钥源1K 2 K m m 'm c ' c 1 k 2k 信道密钥信道

Shannon与现代密码学

Shannon与现代密码学 王育民 西安电子科技大学 教育部计算机网络与信息安全重点实验室 1949年Shannon公开发表了《保密系统的通信理论》[8],开辟了用信息论研究密码学的新方向,使他成为密码学的先驱、近代密码理论的奠基人。这篇文章是他在1945年为贝尔实验室所完成的一篇机密报告《A Mathematical Theory of Cryptograph》[1,[24]]。Boston 环球报称此文将密码从艺术变成为科学。(Transformed cryptography from an art to a science.)。本文发表后促使他被聘为美国政府密码事务顾问。 这一工作的背景是他在1941年在贝尔曾从事密码学研究工作,接触到SIGSAL Y电话,这是一种马桶大小的语言置乱设备,供丘吉尔和罗斯福进行热线联系。这一电话保密机所用的密码就是在今天也破不了[1,p.xx]。 SIGSAL Y电话机 这篇文章对于研究密码的人来说是需要认真读的一篇经典著作。本文奠定了现代密码理论的基础。可以说,最近几十年来密码领域的几个重要进展都与Shannon这篇文章所提出的思想有密切关系。 1.保密通信系统的数学模型 Shannon以概率统计的观点对消息源、密钥源、接收和截获的消息进行数学描述和分析,用不确定性和唯一解距离来度量密码体制的保密性,阐明了密码系统、完善保密性、纯密码、理论保密性和实际保密性等重要概念,从而大大深化了人们对于保密学的理解。这使信息论

成为研究密码学和密码分析学的一个重要理论基础,宣告了科学的密码学时代的到来。 2. 2. 正确区分信息隐藏和信息保密 Shannon在引论中就明确区分了信息隐藏(隐匿信息的存在)和信息保密(隐匿信息的真意),以及模拟保密变换和数字信号加密(密码)不同之处。Shannon称后者为真保密系统(True secrecy system) 3. 密码系统与传信系统的对偶性 传信系统是对抗系统中存在的干扰(系统中固有的或敌手有意施放的),实现有效、可靠传信。 Shannon说:“从密码分析者来看,一个保密系统几乎就是一个通信系统。待传的消息是统计事件,加密所用的密钥按概率选出,加密结果为密报,这是分析者可以利用的,类似于受扰信号。” 密码系统中对消息m的加密变换的作用类似于向消息注入噪声。密文c就相当于经过有扰信道得到的接收消息。密码分析员就相当于有扰信道下原接收者。所不同的是,这种干扰不是信道中的自然干扰,而是发送者有意加进的、可由己方完全控制、选自有限集的强干扰(即密钥),目的是使敌方难于从截获的密报c中提取出有用信息,而己方可方便地除去发端所加的强干扰,恢复出原来的信息。 传信系统中的信息传输、处理、检测和接收,密码系统中的加密、解密、分析和破译都可用信息论观点统一地分析研究。密码系统本质上也是一种传信息系统。是普通传信系统的对偶系统。 4. 含糊度在破译和设计密码中的作用

《现代密码学》实验报告

现代密码学实验报告 学生姓名骆秀娟 学号0909121906 专业班级计科1204班 指导教师段桂华 学院信息科学与工程学院 完成时间2014年4月25日

实验一对称密码算法实验 [实验目的] 1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。 2.掌握DES、AES、RC4的算法流程和实现方法。 [实验预备] 1.DES算法有什么特点?算法中的哪些结构保证了其混淆和扩散的特性? 2.AES算法的基本原理和特点。 3.流密码RC4的密钥流生成以及S盒初始化过程。 [实验内容] 1.分析DES、AES、RC4、SHA的实现过程。 2. 用程序设计语言将算法过程编程实现。 3. 完成字符串数据的加密运算和解密运算 输入明文:Idolikethisbook 输入密钥:cryption [实验步骤] 1. 预习DES、AES、RC4算法。 2. 写算法流程,用程序设计语言将算法过程编程实现。 3. 输入指定的明文、密钥进行实验,验证结果。 4. 自己选择不同的输入,记录输出结果。 写出所编写程序的流程图和运行界面、运行结果。

DES程序流程图: DES运行结果:

AES程序流程图: AES运行结果:

RC4流程图:

RC4运行结果: [问题讨论] 1. 在DES算法中有哪些是弱密钥?哪些是半弱密钥? 2. 改变明文或密钥中的一个比特值可能影响AES值中的多少比特? 3.分析实验中在编辑、编译、运行等各环节中所出现的问题及解决方法。 回答问题 解:1>弱密钥有以下几种情况:全0;全1;一半为0,一半为1; 半弱密钥如下:E01F E01F E01F E01F FE01 FE01 FE01 FE01 E001 E001 F101 F101 FE1F FE1F FE01 FE01 2>改变一个比特值最多改变4个AES值。 3>在RC4实验中,为了将输入的char型密钥分个存储进数组中,刚开始我想把它转化为string型,再存储,但是string型数据不能直接从键盘输入,且最后

密码学实验报告

《—现代密码学—》 实验指导书 适用专业:计算机科学与技术 江苏科技大学计算机科学学院 2011年11 月 实验一古典密码 实验学时:2学时 实验类型:验证 实验要求:必修 一、实验目的

编程实现古典密码的加解密方法。 二、实验内容 (1)移位密码的加密和解密函数。 (2)仿射密码的加密和解密函数。 (3)维吉尼亚密码的加密和解密函数。 三、实验原理、方法和手段 (1)移位密码 对于明文字符x ,加密密钥k ,加密方法为 ,1,2,,25y x k k =+= 解密方法为 ,1,2,,25x y k k =-= (2)仿射密码 对于明文字符x ,加密密钥(,)a b ,加密方法为 ,gcd(,26)1,1,2,,25y ax b a b =+== 解密方法为 1()x a y b -=- (3)维吉尼亚密码 选取密钥字Key ,将明文按照密钥字长度分组,将明文与密钥字对应字符相加并对26求余,即为密文字符。 i i i y x k =+ 解密过程为 i i i x y k =- 四、实验组织运行要求 本实验采用集中授课形式,每个同学独立完成上述实验要求。 五、实验条件 每人一台计算机独立完成实验,有如下条件: (1)硬件:微机;

(2)软件:VC++6.0、VC++.Net 2005。 六、实验步骤 (1)将各函数编写完成; (2)在主函数中调用各函数,实现加密和解密。 七、实验报告 实验报告主要包括实验目的、实验内容、实验原理、源程序及结果。移位密码加密: #include #define n 3 //移位位数 void change(char string[]) { int i; for(i=0;string[i]!='\0';i++) { if(string[i]>='a'&&string[i]<='z') string[i]=(string[i]+n>='z'?string[i]+n-26:string[i]+n); } } void main() { char str[100]; printf("请输入一段明文"); gets(str); change(str); printf("密文为:\n"); puts(str); }

密码学实验报告

江苏大学 学院计算机学院 专业信息安全0902 姓名*** 学号3090604035 小组成员*******

AES对称加密算法实现 一.AES对称加密算法实现原理 AES(The Advanced Encryption Standard)接受一个128位的明文,并且在一个128、192或者256位秘密密钥的控制下产生一个128位的密文。它是一个替代-置换网络的设计,并且带有一个称作轮(rand)的步骤的集合,其中轮数可以是9、11或者13(取决于密钥的长度),这样可以将明文映射为密文。 AES实际上能定义为在域GF(2)的元素上的一系列标量的运算。它实质上是在整数模2所组成的域,但是它扩展到了多项式域GF(2)[x]中。为了构造一个域,需要使用一个能够不被任何一个具有相同底GF(2)的度数更小的多项式整除的多项式,在AES中选择了v (x)= x^8 + x^4 + x^3 + x + 1。用整数存储时,它表示值0x11B。域中的加法是一个简单异或(xor)操作。乘法就是乘以其他的多项式。一个单元a的乘法逆元是另一个单元b,使得ab模AES的多项式和多项式p(x)=1是同余的。a(x)=0的逆是它本身。 二.AES对称加密算法实现过程 AES 算法是分组密码算法,它的输入分组、输出分组以及加/ 解密过程中的中间分组都是128比特。(对称密码算法根据对明文消息加密方式的不同可分为两大类,即分组密码和流密码。分组密码将消息分为固定长度的分组,输出的密文分组通常与输入的明文分组长度相同。) 1、AES 的加密与解密框图如图所示 (1) 加密变换

设X是AES 的128 比特明文输入,Y是128 比特的密文输出,则AES 密文Y可以用下面的复合变换表示: Y= Ak(r + 1)·R·S·Akr·C·R·S·Ak(r21)·?·C·R·S·Ak1 (X)其中“·”表示复合运算。这里Aki :表示对X 的一个变换Aki (X) = XY Ki (Ki 为第i 轮的子密钥,为比特串的异或运算) 。S:S 盒置换。即对每一个字节用S2Box 做一个置换。S2Box 是一个给定的转换表。R: 行置换。C: 列置换。 s′(x) = a (x) á s (x) 这里á 是特殊的乘法运算 (2) 解密变换 解密变换是加密变换的逆变换。 2、AES(128bits密钥)加密解密流程如下图所示

密码学1.66

现代密码学实验报告 1 实验项目:Mathematica的使用与古典密码实验教师评语:

实验报告 一、实验目的与要求 目的:了解Mathematica中一些与密码学有关的运算。掌握用Mathematica 进行仿射密码加解密,了解多表密码加解密。 内容:用Mathematica求解模运算和模幂运算等。用Mathematica编程完成课本11页第1题、第2题和第3题的计算。 要求:课本11页第1题、第2题和第3题有Mathematica求解的程序和结果。 二、实验方案 1.求加密仿射变换,运行: affine t["thenationalsecurityagency",11,23] 求解密仿射变化: a1=PowerMod[11-1, 26];b1 = Mod[-a1*23 26]; 得a1=19;b1=5, 再运行: affinecrypt["ywpkxyhvkxonptjchybxlpktb",a1,b1] 2.求出a,b: 输入命令: 解密过程: 输入命令:

输出: 输入命令: 输出: 输入命令: 3.加密过程: 运行:A={{3,13,21,9},{15,10,6,25},{10,17,4,8},{1,23,7,2}}; B={1,21,8,17}; m="pleasesendmethebookmycreditcardnoissixonetwoonethreeeightsixz eroonesixeightfourninesevenzerotwol"; s=StringLength[m]; t=Length[B]; m1=Table[StringTake[m,{i}],{i,1,s}]; m2=txt2num0[m1]; m3=Table[{m2[[t*i-3]],m2[[t*i-2]],m2[[t*i-1]],m2[[t*i]]},{i,1,s/ t}]; m4=Transpose[m3]; B1=Transpose[Table[B,{i,1,s/t}]]; c1=A.m4+B1; c2=Transpose[c1]; c3=Table[c2[[Floor[i/t]+1,Mod[i,t]+1]],{i,0,s-1}]; c4=Mod[c3,26]; c5=Table[alph0[c4[[i]]],{i,1,s}]; c=StringJoin[c5] 解密过程: 运行: A={{3,13,21,9},{15,10,6,25},{10,17,4,8},{1,23,7,2}}; B={1,21,8,17}; c="nqxbbtwbdcjjijdtxdcfyfsglygdmoxnllgnhapcqzzqzcrgzezjuiebrrsgn emvqdjemxnaierpxakmyrbytqfmnemvjbom"; s=StringLength[c];

密码学实验----

《密码学与信息安全》实验报告 专业 班级 姓名 学号 2015年 6 月 5 日

实验一古典密码实验 1实验目的 1.理解代替密码学加密过程 2.理解置换密码学加密过程 2实验内容 1.手动完成Caesar密码 2.Caesar加密 3.Caesar密码分析 4.单表置换密码 5.单表置换密码分析 3实验过程 本练习主机A、B为一组,C、D为一组,E、F为一组。 首先使用“快照X”恢复Windows系统环境。 1.手动完成Caesar密码 (1)在实验原理部分我们已经了解了Caesar密码的基本原理,那么请同学们写出当 密钥k=3时,对应明文:data security has evolved rapidly的密文:data security has evolved rapidly 。 (2)进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点 击“Caesar密码”。在明文输入区输入明文:data security has evolved rapidly。 将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。 请根据密钥验证密文与明文对应关系是否正确。 2.Caesar加密 (1)进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英 文),单击“加密”按钮进行加密。 请将明文记录在这里:I am a stident 。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值,并记下该密钥k值用于同组主机的解密。加密工作完成后,单击“导出”按钮将密文默认导出到Caesar共享文件夹(D:\Work\Encryption\Caesar\)中,默认文件名为Caesar密文.txt。 (3)通知同组主机接收密文,并将密钥k通告给同组主机。 6 (4)单击“导入”按钮,进入同组主机Work\Encryption\Caesar目录(同组主机IP\Work\Encryption\Caesar),打开Caesar密文.txt。 (5)调节密钥k的微调按钮或对照表的移位按钮,将k设为同组主机加密时的密钥k 值,这时解密已经成功。请将明文写出:I am a stident 。 (6)将解密后的明文与同组主机记录的明文比较,请对比明文是否相同。 3.Caesar密码分析 (1)本机进入“密码工具”|“加密解密”|“Caesar密码”,在明文输入区输入明文(要求明文有一定的意义以便让同组主机分析)。 请将明文记录在这里:I am a stident 。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值完成Caesar 加密,单击“导出”按钮,将密文默认导出到Caesar共享文件夹中。 (3)通告同组主机(不要通告密钥值k)密文已经放在共享文件夹中,让同组主机获 取密文。 (4)单击“导入”按钮将同组主机Caesar密文导入。

密码锁电路实验报告

实验日期:2009/12/23 实验室:229 座位号:4 清华大学电子工程系 电子技术实验报告 数字实验四:密码锁电路实验 班级:无86 姓名:戴扬 学号:2008011191 实验日期:2009/12/23 交报告日期: 2010/1/7

一、实验目的 (1)熟悉简单数字子系统的设计和实现方法。 (2)熟悉存储器、数据比较器的基本原理和使用方法。 (3)熟悉地址发生器的构成与设计。 二、实验任务 设计、制作一个电子密码锁电路。要求如下: (1)密码长度为6位(10进制)。 (2)在电路处于密码设置状态下,用户利用“输入键盘”设置自己选定的6为密码,并用一个LED管只是电路处于密码设置 状态。在电路处于开锁状态下,用户输入开锁密码,如果输 入的开锁密码与用户设置的密码相同,锁开启(用一个LED 管指示开启状态);如果输入的开锁密码与用户设置的密码 不同,锁不开启,此时给出声音告警提示。 三、实验原理 见《电子电路实验》229~232页。 另外,本实验加入了键盘编码的内容。 四、实验内容 基本内容: 1.设计并实现键盘的编码:

其真值表为下表,条件是按键未按下时相对应的端口为0,按下时相对应的端口为“1”; 注意:表中的“B”是作为教材中图6.22中的信号“B”使用。 输出 3 D 2 D 1D D B 未按 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 2 0 0 1 0 1 3 0 0 1 1 1 4 0 1 0 0 1 5 0 1 0 1 1 6 0 1 1 0 1 7 0 1 1 1 1 8 1 0 0 0 1 9 1 0 0 1 1 start 1 1 1

相关文档
最新文档