文档库 最新最全的文档下载
当前位置:文档库 › 密码学实验报告(AES,RSA)

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

密码学实验报告(AES,RSA)
密码学实验报告(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

最后完成的效果如图:

3.3、行移位(ShiftRows)

一.State的第一行字节保持不变,State的第二行字节循环左移一个字节,State 的第三行字节循环左移两个字节,State的第四行循环左移三个字节。

行移位左偏移量:

变化如图2所示。

3.4、列混合(MixColumn)

一.列混合变换是一个替代操作,是AES 最具技巧性的部分。它只在AES 的第0,1,…,Nr 一1轮中使用,在第N r 轮中不使用该变换。乘积矩阵中的每个元素都是一行和一列对应元素的乘积之和。在MixColumns 变换中,乘法和加法都是定义在GF(82)上的。State 的每一列 (j i b ,) 1=0,…,3;J=0,…,b L 被理解为 GF(82)上的多项式,该多项式与常数多项式012233)(a x a x a x a x a +++=相乘并模1)(4+=x x M 约化。

这个运算需要做GF(82)上的乘法。但由于所乘的因子是三个固定的元素02、03、01,所以这些乘法运算仍然是比较简单的(注意到乘法运算所使用的模多项式为

1)(348++++=x x x x x m )。设一个字节为b=(b7b6b5b4b3b2b1b0),则

b ב01’=b;

b ב02’=(b6b5b4b3b2b1b00)+(000b7b70b7b7); b ב03’=bב01’+b×’02’。

(请注意,加法为取模2的加法,即逐比特异或) 写成矩阵形式为:

00112233b a 02

030101b a 01020301b 01010203a 03

010102b a ??????????????????=??????

??????

??????

最后完成的效果如图:

3.5、轮密钥加(AddRoundKey )

Add RoundKey 称为轮密钥加变换,128位的State 按位与 128位的密钥XOR :

),,,(),,,(),,,(321032103210j j j j j j j j j j j j k k k k b b b b b b b b ⊕←对 j=0,… ,L-1 轮密钥加变换很

简单,却影响了 State 中的每一位。密钥扩展的复杂性和 AES 的其他阶段运算的复杂性,却确保了该算法的安全性。

最后完成的效果如图:

3.6.逆字节替换

通过逆S 盒的映射变换得到

3.7.逆行移位InvShiftRow

与加密时的行移位区别在于移位方向相反。

3.8.逆列混淆

3.9加密与解密模式

电子密码本ECB模式:

ECB模式是最古老,最简单的模式,将加密的数据分成若干组,每组的大小跟加密密钥长度相同;然后每组都用相同的密钥加密,比如DES算法,如果最后一个分组长度不够64位,要补齐64位;定义: Enc(X,Y)是加密函数Dec(X,Y)是解密函数Ci ( i = 0,1…n)是密文块,大小为64bit; XOR(X,Y)是异或运算;IV是初始向量(一般为64位)ECB加密算法可表示为:

C0 = Enc(Key, XOR(IV, P0)

Ci = Enc(Key, XOR(Ci-1, Pi)

ECB解密算法可以表示为:

P0 = XOR(IV, Dec(Key, C0))

Pi = XOR(Ci-1, Dec(Key,Ci))

算法特点:每次加密的密文长度为64位(8个字节); 当相同的明文使用相同的密钥和初始向量的时候CBC模式总是产生相同的密文; 密文块要依赖以前的操作结果,所以,密文块不能进行重新排列; 可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击; 一个错误发生以后,当前和以后的密文都会被影响;

四、实验方法与步骤

4.1 字节替换

SubBytes()变换是一个基于S盒的非线性置换,它用于将输入或中间态的每一个字节通过一个简单的查表操作,将其映射为另一个字节。映射方法是把输入字节的高四位作为S盒的行值,低四位作为列值,然后取出S盒中对应的行和列的元素作为输出。

unsigned char subbytes(unsigned char state[4][4])

{printf("after subbyte:\n"); //取出中间态state映射到S盒中的值赋给中间态state

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

{for(j=0;j<4;j++)

state[i][j]=sbox[state[i][j]]; }

for(i=0;i<4;i++) //输出到屏幕显示state

{for(j=0;j<4;j++)

printf("\t\t%02x ",state[i][j]);

printf("\n");

}

printf("\n");

return 0;

}

4.2行移位

ShiftRows()完成基于行的循环移位操作,变换方法是第0行不动,第一行循环左移一个字节,第二位循环左移两个字节,第三行循环左移三个字节。

unsigned char shiftrows(unsigned char state[4][4])

{printf("after shiftrows:\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;i<4;i++) //输出到屏幕显示state

{for(j=0;j<4;j++)

printf("\t\t%02x ",state[i][j]);

printf("\n");

}

printf("\n");

return 0;

}

4.3列混合

MixColumns()实现逐列混合,方法是s’(x)=c(x)*s(x)mod(x^4+1)

unsigned char mixcolumns(unsigned char state[4][4])

{ printf("after mixcolumns:\n");// 实现(02 03 01 01) 与中间态state分别相乘后异或得相应值

for(i=0;i<4;i++) // (01 02 03 01)

{ // (01 01 02 03)

k=state[0][i]; // (03 01 01 02)

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;i<4;i++) //输出到屏幕显示state {for(j=0;j<4;j++)

printf("\t\t%02x ",state[i][j]);

printf("\n");

}

printf("\n");

return 0;

}

4.4轮密钥加

AddRoundKey()用于将输入或中间态S的每一列与一个密钥字ki进行按位异或,每一个轮密钥由Nb个字组成。

unsigned char addroundkey(unsigned char state[4][4],unsigned char w[4][4]) { printf("addroundkey %d:\n",round++);

//将中间态state中的每一列与一个密钥字(w[4][4]中的一列)进行按位异或for(i=0;i<4;i++) //完了又赋值给state

{for(j=0;j<4;j++)

state[i][j]^=w[i][j];}

for(i=0;i<4;i++) //输出到屏幕显示出来state

{for(j=0;j<4;j++)

printf("\t\t%02x ",state[i][j]);

printf("\n");}

printf("\n");

return 0;

}

4.5密钥扩展

通过生成器产生Nr+1个轮密钥,每个轮密钥由Nb个字组成,共有Nb(Nr+1)个字。在加密过程中,需要Nr+1个轮密钥,需要构造4(Nr+1)个32位字。首先将输入的4个字节直接复制到扩展密钥数组的前4个字中,得到W[0],W[1],W[2],W[3];然后每次用4个字填充扩展密钥数余下的部分。

//keyexpand

printf("after keyexpand:\n");

for(i=4;i<8;i++)

{

if(i%4==0)

{ rotword[0]=w[1][i-1];

rotword[1]=w[2][i-1];

rotword[2]=w[3][i-1];

rotword[3]=w[0][i-1];

printf("rotword():");

for(j=0;j<4;j++) printf("%02x ",rotword[j]);

for(j=0;j<4;j++)

subword[j]=sbox[rotword[j]];

printf("\nsubword():");

for(j=0;j<4;j++) printf("%02x ",subword[j]); printf("\n\n");

for(j=0;j<4;j++)

rcon[j]=subword[j]^ Rcon[N][j] ;

printf("after ^Rcon():");

for(j=0;j<4;j++) printf("%02x ",rcon[j]); printf("\n\n");

for(j=0;j<4;j++)

w[j][i%4]=rcon[j]^ w[j][i-4] ;

printf("w[%d] :",count);

for(j=0;j<4;j++) printf(" %02x ",w[j][i%4]) ;

count++;

}

else

{

for(j=0;j<4;j++)

w[j][i%4]=w[j][i%4]^w[j][(i%4)-1];

printf("w[%d] :",count);

for(j=0;j<4;j++) printf(" %02x ",w[j][i%4]);

count++;

}

printf("\n\n");

}

printf("密钥扩展Round key:\n");

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

{for(j=0;j<4;j++) p rintf("\t\t%02x ",w[i][j]);

printf("\n");}

printf("\n");

4.6逆字节替换

与字节代替类似,逆字节代替基于逆S盒实现。

unsigned char InvSubbytes(unsigned char state[4][4])

{ for(i=0;i<4;i++) //基于逆S盒的映射替代

{for(j=0;j<4;j++)

{ state[i][j] = rsbox[state[i][j]];}

}

printf("after InvSubbyte:\n");

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

{for(j=0;j<4;j++) //输出到屏幕显示state printf("\t\t%02x ",state[i][j]);

printf("\n");

}

printf("\n");

return 0;

}

4.7逆行移位

与行移位相反,逆行移位将态state的后三行按相反的方向进行移位操作,即第0行保持不变,第1行循环向右移一个字节,第2行循环向右移动两个字节,第3行循环向右移动三个字节。

unsigned char InvShiftRows(unsigned char state[4][4])

{ k=state[1][3];

state[1][3]=state[1][2]; //对中间态state进行移位操作

state[1][2]=state[1][1]; // 第0行保持不变

state[1][1]=state[1][0]; // 第1行循环右移一个字节

state[1][0]=k; // 第2行循环右移两个字节

// 第3行循环右移三个字节

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][1];

state[3][1]=state[3][2];

state[3][2]=state[3][3];

state[3][3]=k;

printf("after InvShiftRows:\n");

for(i=0;i<4;i++) //输出到屏幕显示state

{for(j=0;j<4;j++)

printf("\t\t%02x ",state[i][j]);

printf("\n");

}

printf("\n");

return 0;

}

4.8逆列混合

逆列混淆的处理办法与MixColumns()类似,每一列都通过与一个固定的多项式d(x)相乘进行交换。

unsigned char InvMixColumns(unsigned char state[4][4])

{ printf("after InvMixColumns :\n");

//实现(0e 0b 0d 09)与中间态state分别相乘后异或得相应值

for(i=0;i<4;i++) // (09 0e 0b 0d)

{ temp[0] = state[0][i]; // (0d 09 0e 0b)

temp[1] = state[1][i]; // (0b 0d 09 0e)

temp[2] = state[2][i];

temp[3] = state[3][i];

state[0][i] = Multiply(temp[0], 0x0e) ^ Multiply(temp[1], 0x0b) ^ Multiply(temp[2], 0x0d) ^ Multiply(temp[3], 0x09);

state[1][i] = Multiply(temp[0], 0x09) ^ Multiply(temp[1], 0x0e) ^ Multiply(temp[2], 0x0b) ^ Multiply(temp[3], 0x0d);

state[2][i] = Multiply(temp[0], 0x0d) ^ Multiply(temp[1], 0x09) ^ Multiply(temp[2], 0x0e) ^ Multiply(temp[3], 0x0b);

state[3][i] = Multiply(temp[0], 0x0b) ^ Multiply(temp[1], 0x0d) ^ Multiply(temp[2], 0x09) ^ Multiply(temp[3], 0x0e);

}

for(i=0;i<4;i++) //输出到屏幕显示state

{for(j=0;j<4;j++)

printf("\t\t%02x ",state[i][j]);

printf("\n");}

printf("\n");

return 0;

}

4.9 加密

加密部分我分了两种情况,一种是自动检查加密程序的正确性,之前在程序里给明文和密钥赋上初值,运行程序检验结果是否正确;另一种是用户手动输入32位的十六进制数,进行加密,我是把每一具体项模块化,将功能在每个具体模块中实现,只需要直接调用,视觉效果强,一目了然。

下面是实现加密功能一些关键代码

void AES_encrypt(unsigned char State[][N], unsigned char RoundKey[][N])

{message[16]={0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x 37,0x07,0x34};

key[16]={0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4 f,0x3c};

for(i=0;i<4;i++){ for(j=0;j<4;j++) // 分别获取明文和密钥

{state[j][i]=message[m];w[j][i]=key[m];m++;}

} .

addroundkey(state,w);

for(round=2;round<11;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);

}

4.10 解密

AES解密我也是分成了两个部分,第一部分是在程序中对密文和密钥赋初值,通过与标准对照检查解密过程的正确性;第二部分是用户手动输入密文和密钥,程序对其进行解密,得到最后的明文。

解密过程基本如下:

1)获取输入的明文和密钥2)通过密钥扩展过程获取各轮密钥3)轮密钥加变换过程4)逆行移位5)逆字节替代6)轮密钥加变换7)逆列混淆

4—7步共9次循环,最后一轮实现4—6步,完成解密过程。

主要代码如下:

void AES_decrypt(unsigned char State[][N], unsigned char w[][N])

{key[16]={0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x 4f,0x3c};

cipher[16]={0x39,0x25,0x84,0x1d,0x02,0xdc,0x09,0xfb,0xdc,0x11,0x85,0x97,0x19,0x6a, 0x0b,0x32};

printf("%02x ",key[i]);printf("\n"); /获取密文和密钥

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

{ for(j=0;j<4;j++)

{state[j][i]=cipher[m];w[j][i]=key[m];m++;}

}

Keyexpand(w,round ); //获得密钥扩展列表

AddRoundKey(State, w); //首轮

for (i = 9; i > 0; i --) //1-9轮

{ InvShiftRows(state);

InvSubbytes(state);

Keyexpand(w,round );

AddRoundKey(State, w);

InvMixColumns(State);

}

InvShiftRows(State); //最后一轮

InvSubBytes(State);

Keyexpand(w,0 );

AddRoundKey(State, w);

五、实验结果与数据处理

实验结果截图:

六、实验心得

这次课程设计我最大的收获就是凡事都要自己动手去做,有些事情自己不做,什么都不会,有畏惧感,胆怯,始终把事情放在那,就形成恶性循环,这样子一直都做不来,一直都不会有进步,所以不管什么事情都要亲自去尝试一下,难易程度自己感知,不要听信他人的谣言,或者误导。

还有就是,做代码的时候查阅了相关的书籍,很杂很乱,这对于选择有用的材料,有价值的材料进行使用,会提高效率,最开始各种涉猎,很多,但是实用的却没有多少,白白耽误了很多时间。我觉得还是首先了解全局,了解总体,高屋建瓴,做好准备工作,写好报告,把每个过程搞懂了,才能动手去写代码,连基本的理论都不懂,就去操作,实在是慢,当然在了解的基础上,也要去实践,去检验自己的做法是否是对的,不能光搞理论,计算机是一个动手就得答案的科学,多检验,多算,多观察。这样子影响更深,更不会忘,一辈子的经验,自己动手得到的答案,远比查阅资料了解来的有意义,有效果。

在写代码的时候参考了一些参考资料,发现一些牛人写的代码简介,精炼,确实让人敬佩,我用很多行代码实现的功能,别人两三句循环就解决了,主要是平时没怎么编写代码,没有经验,还是要多写代码,多领悟,才能有他们的成就。而且我简介的代码都是很好的数学算法,我学的数学没怎么用在这个上面,不能直接用最低级的算法,最普通的算法,这样子永远不能简化,要简化就要用一些数学算法,下标改变啊,循环啊啥的这些可以实现意想不到的效果,实现功能和简介的双重母的。多实践!

[综合实验二] RSA加密算法的实现

一、实验目的及要求

通过编程实现RSA的加密和解密过程,加深对公钥(非对称)密码算法的认识

二、所用仪器、设备

计算机、Visual C#软件。

三、实验原理

1.RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。 RSA

是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。

2.RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数(大于 100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。

3.密钥对的产生。选择两个大素数,p 和q 。计算:n = p * q,然后随机选择加密密钥e(PS:最常用的e值有3,17和65537,微软就是使用的65537,采用3个中的任何一个都不存在安全问题),要求 e 和 ( p - 1 ) * ( q - 1 ) 互质。最后,利用Euclid 算法计算解密密钥d, 满足e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。

4.加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,..., mi ,块长s,其中 2^s <= n, s 尽可能的大。对应的密文是:

ci = mi^e ( mod n ) ( a )

解密时作如下计算:

mi = ci^d ( mod n ) ( b )

5.从RSA的原理来看,公钥加密私钥解密和私钥加密公钥解密应该是等价的,在某些情况下,比如共享软件加密,我们需要用私钥加密注册码或注册文件,发给用户,用户用公钥解密注册码或注册文件进行合法性验证。

四、实验方法与步骤

.NET提供常用的加密算法类,支持RSA的类是RSACryptoServiceProvider(命名空间:System.Security.Cryptography),但只支持公钥加密,私钥解密。RSACryptoServiceProvider类包括:Modulus、Exponent、P、Q、DP、DQ、InverseQ、D 等8个属性,其中Modulus和Exponent就是公钥,Modulus和D就是私钥,RSACryptoServiceProvider类提供导出公钥的方法,也提供导出私钥的方法,导出的私钥包含上面8个属性。

五、实验结果与数据处理

主要代码如下:

六、实验心得

通过这次的实验,了解了非对称密码算法RSA,会运用一些现成的算法进行编程,对一些比较复杂的算法开始基本认识并深刻的掌握。在以后所涉及这方面的知识将会有全新

的了解和掌握通过这次课程设计,我对RSA加密体制有了更进一步的了解。遇到的主要问题是如何将明文按照比特分组并对其实现RSA加密,以及对大素数的处理。最终大素数的处理得以实现,但明文分组并没有找到合适的方法,这就要求我在课程设计后去学习怎样为明文分组机密。要想学好现代密码学不仅要学习好密码学相关知识,还要有很好的数学基础,还有很强的编程能力,课程设计时对学生个人综合能力的检验。任何知识和技术都不是孤立的。要学习好密码学要牵扯到线性代数,离散数学,概率统计等数学知识,为了验证加密解密算法的正确性,还要动手编制程序,这就要求学生要对至少一种编程技术有所熟知。

DES算法实验报告

DES算法实验报告 姓名:学号:班级: 一、实验环境 1.硬件配置:处理器(英特尔Pentium双核E5400 @ 2.70GHZ 内存:2G) 2.使用软件: ⑴操作系统:Windows XP 专业版32位SP3(DirectX 9.0C) ⑵软件工具:Microsoft Visual C++ 6.0 二、实验涉及的相关概念或基本原理 1、加密原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。 三、实验内容 1、关键代码 ⑴子密钥产生

⑵F函数以及加密16轮迭代 2、DES加密算法的描述及流程图 ⑴子密钥产生 在DES算法中,每一轮迭代都要使用一个子密钥,子密钥是从用户输入的初始密钥产生的。K是长度为64位的比特串,其中56位是密钥,8位是奇偶校验位,分布在8,16,24,32,40,48,56,64比特位上,可在8位中检查单个错误。在密钥编排计算中只用56位,不包括这8位。子密钥生成大致分为:置换选择1(PC-1)、循环左移、置换选择2(PC-2)等变换,分别产生16个子密钥。 DES解密算法与加密算法是相同的,只是子密钥的使用次序相反。 ⑵DES加密算法 DES密码算法采用Feistel密码的S-P网络结构,其特点是:加密和解密使用同一算法、

文件加密与解密实验报告

HUNAN UNIVERSITY 程序设计训练——文件加密与解密 报告 学生姓名X X X 学生学号20110102308 专业班级建环308 指导老师何英 2012-07-01至 2012-07-13

一、程序设计目的和要求 (3) 二、程序设计内容 (4) 1、总体设计 (4) 1.1主控选择模块 (4) 1.2加密模块 (4) 1.3解密模块 (4) 2、流程图 (5) 三模块详细说明 (6) 四、测试数据及其结果 (7) 五、课程设计总结 (8) 六、附录 (9) 附录1:参考文献 (9) 附录2:程序源代码 (9)

一、程序设计目的和要求 1、目的:为保证个人数据资料不被他人窃取使用,保护个人隐私及个人文件。设计一个基于c语言的文本文件加密及解密软件,可以方便对文本文件的加密与解密。本设计实现了文本文件的解密及解密,运行软件之后只需输入任意一个文本文件的文件名及后缀名即可对该文本文件进行加密或解密操作。本设计的加密与解密系统,使用了面向各类文件的方法,运用Microsoft Visual C++ 6.0实现具有加密、解密、帮助信息、读取文本文件、显示结果、退出等功能的文件加密与解密系统。 2、要求: (1)从键盘输入要进行加密的一行字符串或者需要加密的文件名。 (2)显示菜单: (3)选择菜单,进行相应的操作。加密方法是设置一加密字符串以及对文件的哪些部分进行加密;加密是将原始文件加密并保存到文件中;解密是将加了密的文件还原并保存到文件中,同时应比较与原始文件的一致性; 3、其他要求 (1)变量、函数命名符合规范。 (2)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。

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原理图

实验报告_密码学

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

实验三密码学实验 一、古典密码算法实验 一、实验目的 通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、编译环境 运行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、根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。 五、总结与思考 记录程序调试过程中出现的问题,分析其原因并找出解决方法。记录最终实现的程序执行结果。

信息安全加密实验报告

重庆交通大学实验报告 班级:计信专业2012级2班 学号: 631206060232 姓名:娄丽梅 实验项目名称:DES加解密程序设计与实现 实验项目性质:设计性(验证性) 实验所属课程:信息安全 实验室(中心):软件实验室 指导教师:米波 实验完成时间: 2014 年12月11日

一、实验目的 1、理解DES加密与解密的程序设计算法思想。 2、编写DES加密与解密程序,实现对明文的加密与解密,加深对数据加密与解密的理解,掌握DES加密算法思想,提高网络安全的编程能力。 二、实验主要内容及原理 (一)实验内容 1、掌握DES算法; 2、编写DES算法。 (二)实验原理 1、初始置换 初始置换在第一轮运算之前执行,对输入分组实施如下表所示的变换。此表应从左向右、从上向下读。在将这64位数据分为左右两部分,每部分分别为32位,将左32位留下,将右32位按照下表进行排列 2、密钥置换 一开始,由于不考虑每个字节的第8位,DES的密钥由64位减至56位。每个字节第8位可作为奇偶校验位以确保密钥不发生错误。接着,56位密钥被分成两部分,每部分28位。然后,根据轮数,这两部分分别循环左移l位或2位。在DES的每一轮中,从56位密钥选出48位子密钥(Sub Key)。 3、S盒置换 当产生了48位密钥后就可以和右边32位明文进行异或运算了,得到48位的密文。 再经过下论的S盒跌带,其功能是把6bit数据变为4bit数据,每个S盒是一个4行、16列的表。盒中的每一项都是一个4位的数。S盒的6个位输入确定了其对应的输出在哪一行哪一列。 4、P盒置换 S盒代替运算后的32位输出依照P盒进行置换。该置换把每输入位映射到输出位,任意一位不能被映射两次,也不能被略去,这个置换叫做直接置换。 5、再次异或运算 最后,将P盒置换的结果与最初的64位分组的左半部分异或,然后左、右半部分交换,接着开始另一轮。 6、当进行到16轮后,最终进行一次末置换,形成密文

密码学实验报告

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

密码学 实验日志 实验题目: 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]; //暂存字符串,密钥串

RSA算法实验报告

实验二非对称密码算法RSA 一、实验目的 通过实际编程了解非对称密码算法RSA的加密和解密过程,加深对非对称密码算法的认识。 二、实验环境 运行Windows或Linux操作系统的PC机,具有JDK1.6版本的Java语言编译环境。 三、实验内容和步骤 1. 对RSA算法的理解 RSA算法(公开密钥算法)的原理: (1).选择两个大的素数p和q(典型情况下为1024位) (2).计算n = p * q 和z =(p-1)*(q-1). (3).选择一个与z互素的数,将它称为d (4).找到e,使其满足e*d = 1 mod z 提前计算出这些参数以后,我们就可以开始执行加密了。首先将明文分成块,使得每个明文消息P落在间隔0*P

数据加密实验报告

实验报告 课程:计算机保密_ _ 实验名称:数据的加密与解密_ _ 院系(部):计科院_ _ 专业班级:计科11001班_ _ 学号: 201003647_ _ 实验日期: 2013-4-25_ _ 姓名: _刘雄 _ 报告日期: _2013-5-1 _ 报告评分:教师签字:

一. 实验名称 数据加密与解密 二.运行环境 Windows XP系统 IE浏览器 三.实验目的 熟悉加密解密的处理过程,了解基本的加密解密算法。尝试编制基本的加密解密程序。掌握信息认证技术。 四.实验内容及步骤 1、安装运行常用的加解密软件。 2、掌握加解密软件的实际运用。 *3、编写凯撒密码实现、维吉尼亚表加密等置换和替换加解密程序。 4、掌握信息认证的方法及完整性认证。 (1)安装运行常用的加解密软件,掌握加解密软件的实际运用 任务一:通过安装运行加密解密软件(Apocalypso.exe;RSATool.exe;SWriter.exe等(参见:实验一指导))的实际运用,了解并掌握对称密码体系DES、IDEA、AES等算法,及非对称密码体制RSA等算法实施加密加密的原理及技术。 ?DES:加密解密是一种分组加密算法,输入的明文为64位,密钥为56位,生成的密文为64位。 ?BlowFish:算法用来加密64Bit长度的字符串或文件和文件夹加密软件。 ?Gost(Gosudarstvennyi Standard):算法是一种由前苏联设计的类似DES算法的分组密码算法。它是一个64位分组及256位密钥的采用32轮简单迭代型加密算法. ?IDEA:国际数据加密算法:使用128 位密钥提供非常强的安全性; ?Rijndael:是带有可变块长和可变密钥长度的迭代块密码(AES 算法)。块长和密钥长度可以分别指定成128、192 或256 位。 ?MISTY1:它用128位密钥对64位数据进行不确定轮回的加密。文档分为两部分:密钥产生部分和数据随机化部分。 ?Twofish:同Blowfish一样,Twofish使用分组加密机制。它使用任何长度为256比特的单个密钥,对如智能卡的微处理器和嵌入在硬件中运行的软件很有效。它允许使用者调节加密速度,密钥安装时间,和编码大小来平衡性能。 ?Cast-256:AES 算法的一种。 (同学们也可自己下载相应的加解密软件,应用并分析加解密过程) 任务二:下载带MD5验证码的软件(如:https://www.wendangku.net/doc/206452464.html,/downloads/installer/下载(MySQL):Windows (x86, 32-bit), MSI Installer 5.6.11、1.5M;MD5码: 20f788b009a7af437ff4abce8fb3a7d1),使用MD5Verify工具对刚下载的软件生成信息摘要,并与原来的MD5码比较以确定所下载软件的完整性。或用两款不同的MD5软件对同一文件提取信息摘要,而后比较是否一致,由此可进行文件的完整性认证。

AES加密算法实验报告

四川大学计算机学院、软件学院实验报告 学号::专业:班级:第10 周

在程序运行读取需要加密的图片时,需要进行图片的选取,本次实验中使用在弹窗中选取文件的方式,使用头文件commdlg.h来实现在文件夹中选择需要的文件的选取。 三、加密算法流程 AES加密算法流程如下 字节代替:用一个S盒完成分组的字节到字节的代替; 行移位:进行一次行上的置换; 列混合:利用有限域GF(28)上的运算特性的一个代替; 轮密钥加:当前分组和扩展密钥的一部分进行按位异或。

四、代码实现 cryptograph.h #include #include class plaintext { public: plaintext(); static void createplaintext(unsigned char a[]); static void SubBytes(unsigned char p[16]); static void inSubBytes(unsigned char p[16]); static void ShiftRows(unsigned char e[]); static void inShiftRows(unsigned char e[]); static void MatrixToByte(unsigned char e[]); static void inMatrixToByte(unsigned char e[]); static unsigned char FFmul(unsigned char a, unsigned char b); static void KeyAdding(unsigned char state[16], unsigned char k[][4]); static void KeyExpansion(unsigned char* key, unsigned char w[][4][4]); ~plaintext(); private: }; cryptograph.cpp #include"cryptography.h" using namespace std; static unsigned char sBox[] = {};/定义加密S盒/ unsigned char insBox[256] ={};//定义解密S盒 plaintext::plaintext() {

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

云南大学数学与统计学实验教学中心实验报告 课程名称:密码学实验学期:2013-2014学年第一学期成绩: 指导教师:陆正福学生姓名:卢富毓学生学号:20101910072 实验名称:零知识证明实验要求:必做实验学时:4学时 实验编号: No.3 实验日期:2013/9/28完成日期:2012/10/18 学院:数学与统计学院专业:信息与计算科学年级: 2010级 一、实验目的: 了解零知识证明,同时掌握FFS识别方案。 二、实验内容: 1. 理解零知识证明 2. 基于GMP实现FFS零知识证明方案 三、实验环境 Linux平台 Code::Block IDE https://www.wendangku.net/doc/206452464.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 七、教师评语:

网络安全RSA算法的实现实验报告

网络安全基础教程报告 题目:RSA加密算法 学号:1108040205 专业及班级:计网1102班 姓名:雪飞 日期:2013.11.26

一、RSA算法介绍与应用现状 RSA公开密钥加密算法自20世纪70年代提出以来,已经得到了广泛认可和应用。发展至今,电子安全领域的各方面已经形成了较为完备的国际规。RSA作为最重要的公开密钥算法,在各领域的应用数不胜数。RSA在硬件方面,以技术成熟的IC应用于各种消费类电子产品。 RSA在软件方面的应用,主要集中在Internet上。加密连接、数字签名和数字证书的核心算法广泛使用RSA。日常应用中,有比较著名的工具包Open SSL(SSL,Security Socket Layer,是一个安全传输协议,在Internet上进行数据保护和身份确认。Open SSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的Eric Yang等发起编写的。Open SSL应用RSA实现签名和密钥交换,已经在各种操作系统得到非常广泛的应用。另外,家喻户晓的IE浏览器,自然也实现了SSL协议,集成了使用RSA技术的加密功能,结合MD5和SHA1,主要用于数字证书和数字签名,对于习惯于使用网上购物和网上银行的用户来说,几乎天天都在使用RSA技术。 RSA更出现在要求高度安全稳定的企业级商务应用中。在当今的企业级商务应用中,不得不提及使用最广泛的平台j2ee。事实上,在j2se的标准库中,就为安全和加密服务提供了两组API:JCA和JCE。JCA (Java Cryptography Architecture)提供基本的加密框架,如证书、数字签名、报文摘要和密钥对产生器;JCA由几个实现了基本的加密技术功能的类和接口组成,其中最主要的是java.security包,此软件包包含的是一组核心的类和接口,Java中数字签名的方法就集中在此软件包中。JCE(Java Cryptography Extension) 在JCA的基础上作了扩展,JCE也是由几个软件包组成,其中最主要的是javax.crypto包,此软件包提供了JCE加密技术操作API。javax.crypto中的Cipher类用于具体的加密和解密。在上述软件包的实现中,集成了应用RSA算法的各种数据加密规(RSA算法应用规介绍参见:.rsasecurity./rsalabs/node.asp?id=2146 ,这些API部支持的算法不仅仅只有RSA,但是RSA是数字签名和证书中最常用的),用户程序可以直接使用java标准库中提供的API 进行数字签名和证书的各种操作。 二、算法原理 1.选择两个不同的大素数p、q (目前两个数的长度都接近512bit是安全的); 2. 计算n = p*q。 3. 计算n的欧拉函数t=(p-1)(q-1)。 4. 选择整数e作为公钥,使e与t互素,且1

DES加密算法实验报告

苏州科技学院 实验报告 学生姓名:杨刘涛学号:1220126117 指导教师:陶滔 刘学书1220126114 实验地点:计算机学院大楼东309 实验时间:2015-04-20 一、实验室名称:软件实验室 二、实验项目名称:DES加解密算法实现 三、实验学时:4学时 四、实验原理: DES算法由加密、子密钥和解密的生成三部分组成。现将DES算法介绍如下。1.加密 DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:

图2-1:DES算法加密过程 对DES算法加密过程图示的说明如下: 待加密的64比特明文串m,经过IP置换(初始置换)后,得到的比特串的下标列表如下: 表2-1:得到的比特串的下标列表

该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串 f1,f1与L0做不进位的二进制加法运算。运算规则为: f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2……一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。 R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1(终结置换)后所得比特串的下标列表如下: 表2-2:置换后所得比特串的下标列表 经过置换IP-1后生成的比特串就是密文e。 变换f(Ri-1,Ki): 它的功能是将32比特的输入再转化为32比特的输出。其过程如图2-2所示:

AES加密解密实验报告

信息安全工程课程 实验报告 AES加密解密的实现 课程名称:信息安全工程 学生姓名:黄小菲 学生学号: 3112041006 专业班级:系统工程2038班 任课教师:蔡忠闽 2012年11月22日

目录 1.背景 (1) 1.1 Rijndael密码的设计标准: (1) 1.2 设计思想 (1) 2.系统设计 (2) 2.1系统主要目标 (2) 2.2功能模块与系统结构 (2) 2.2.1字节替换SubByte (2) 2.2.2行移位ShiftRow (2) 2.2.3 列混合MixColumn (3) 2.2.4 轮密钥加AddRoundKey (4) 2.2.5 逆字节替换 (4) 2.2.6逆行移位InvShiftRow (4) 2.2.7 逆列混淆 (4) 3 加密模式 (5) 3.1 电子密码本ECB模式 (5) 3.2加密块链模式CBC模式 (6) 4 系统功能程序设计 (8) 4.1基本加密部分 (8) 4.1.1字节替换 (8) 4.1.2行移位 (8) 4.1.3列混合 (9) 4.1.4轮密钥加 (9) 4.1.5密钥扩展 (10) 4.1.6逆字节替换 (11) 4.1.7逆行移位 (11) 4.1.8逆列混合 (12) 4.1.9加密 (12) 4.1.10解密 (13) 5 实验结果 (14) 5.1 需要加密文件 (14) 5.2 实验加密解密结果 (15) 6 参考资料 (16)

1.背景 AES,密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES 有一个固定的128位的块大小和128,192或256位大小的密钥大小。Rijndael算法汇聚了安全性、效率高、易实现性和灵活性等优点,是一种较DES更好的算法。 该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。(Rijdael的发音近于"Rhine doll"。)AES在软体及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的记忆体。作为一个新的加密标准,目前正被部署应用到更广大的范围. 1.1 Rijndael密码的设计标准: ①抵抗所有已知的攻击。 ②在多个平台上速度快,编码紧凑。 ③设计简单。 当前的大多数分组密码,其轮函数是Feistel结构。 Rijndael没有这种结构。 Rijndael轮函数是由3个不同的可逆均匀变换 1.2 设计思想 ?分组和密钥长度可变,各自可独立指定为128、192、256比特。 ?状态 ?算法中间的结果也需要分组,称之为状态,状态可以用以字节为元素的矩阵 阵列表示,该阵列有4行,列数N b为分组长度除32 ?种子密钥 ?以字节为元素的矩阵阵列描述,阵列为4行,列数N k为密钥长度除32

密码学实验报告模板总结模板计划模板.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。其加密过程图示如下:

密码学实验报告(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 最后完成的效果如图:

AES加密算法实验报告

实验报告 学号:姓名:专业:班级:第10周

简介 #in elude vstri ng> #in elude class pla in text { public : plai ntext(); static void createplaintext( unsigned char a[]); 实验内容(算法、 程 序、 步骤 和方 法)

static void SubBytes( unsigned char p[16]); static void inSubBytes( unsigned char p[16]); static void ShiftRows( unsigned char e[]); static void inShiftRows( unsigned char e[]); static void MatrixToByte( unsigned char e[]); static void inMatrixToByte( unsigned char e[]); static unsigned char FFmul( unsigned char a, unsigned char b); static void KeyAdding( unsigned char state[16], unsigned char k[][4]); static void KeyExpansion( unsigned char* key, unsigned char w[][4][4]); ~plai ntext(); private : }; #in elude "" using namespacestd; static unsigned char sBox[] = {}; /定义加密S盒/ unsigned char insBox[256] ={}; //定义解密S盒 pla in text ::plai ntext() { unsigned int p[16]; for (int j = 0; j<200; j++) { p[i] = a[i]; a[i] = a[i + 16]; } void pla in text ::createpla in text( un sig ned char a[]) // 仓U建明文 int i = 0; if ( a[j] == 0) for (; i<16; i++)

加密技术及密码破解实验报告

第九章、实验报告 实验一、设置Windows启动密码 一、实验目的:利用Windows启动密码保存重要文件。 二、实验步骤: 1、在Windows XP系统中选择开始——运行,在打开输入框中“syskey.exe”,点击确定,打开“保证Windows XP账户数据库的安全”对话框。 2、单击【更新】,打开【启动密码】对话框,然后输入密码,在【确认】文本框中再次输入密码,单击【确定】

实验二、为word文档加密解密 一、实验目的:保护数据的安全 二、实验步骤: 1、打开一个需要加密的文档,选择【工具】——【选项】——【安全性】然后输入想要设置打开文件时所需的密码 2、单击【高级(A)】打开加密类型对话框,选中【加密文档属性】复选框,单击【确定】。

3、打开文件的【确认密码】对话框,输入打开文件时需要的密码,单击【确定】,随即打开【确认密码】对话框,输入密码。 4、保存文件后,重新打开Word文档,打开【密码】,输入打开文件所需的密码,单击【确定】输入修改的密码,单击【确定】 破解word密码 (1)安装Advanced Office Password Recovery软件,安装完成后打开需要破解的word 文档,进行暴力破解,结果如图所示: 实验三、使用WinRAR加密解密文件

一.实验目的:加密文件,保证文件的安全性。 二.实验步骤: 1、在需要加密的文件夹上右击,选中【添加到压缩文件】打开【压缩文件名和参数】 2、选中【压缩文件格式】组合框中的【RAR】并在【压缩选项】中选中【压缩后删除源文件】然后切换到【高级】,输入密码,确认密码。 3、关闭对话框,单击确定,压缩完成后,双击压缩文件,系统打开【输入密码对话框】 破解WinRAR加密的文件 (1)安装Advanced RAR Password Recovery软件,打开WinRAR加密文件,进行暴力破解,获得密码。结果如图:

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

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

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

相关文档