完整版密码学毕业课程设计AES加密解密文档.docx

上传人:b****2 文档编号:1851125 上传时间:2022-10-24 格式:DOCX 页数:27 大小:149.61KB
下载 相关 举报
完整版密码学毕业课程设计AES加密解密文档.docx_第1页
第1页 / 共27页
完整版密码学毕业课程设计AES加密解密文档.docx_第2页
第2页 / 共27页
完整版密码学毕业课程设计AES加密解密文档.docx_第3页
第3页 / 共27页
完整版密码学毕业课程设计AES加密解密文档.docx_第4页
第4页 / 共27页
完整版密码学毕业课程设计AES加密解密文档.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

完整版密码学毕业课程设计AES加密解密文档.docx

《完整版密码学毕业课程设计AES加密解密文档.docx》由会员分享,可在线阅读,更多相关《完整版密码学毕业课程设计AES加密解密文档.docx(27页珍藏版)》请在冰豆网上搜索。

完整版密码学毕业课程设计AES加密解密文档.docx

完整版密码学毕业课程设计AES加密解密文档

 

成都信息工程学院

课程设计报告

 

AES加密解密的实现

 

课程名称:

应用密码算法程序设计

学生姓名:

学生学号:

专业班级:

任课教师:

 

年月日

指导老师评阅成绩表

学习与工作态度(30%)

选题意义(10%)

文献综述(10%)

研究水平与设计能力(20%)

课程设计说明说(论文)撰写质量(20%)

设计创新(10%)

总分

指导老师签名:

年月日

课程设计答辩记录及评价表

学生

讲述情况

教师主要

提问记录

学生回答

问题情况

答辩评分

评分项目

分值

评价参考标准

评分

总分

及格

选题意义

10

9

8

7

6

4

文献综述

10

9

8

7

6

4

研究水平与设计能力

20

19

17

15

13

10

课程设计说明书(论文)撰写质量

20

19

17

15

13

10

设计创新

10

9

8

7

6

4

答辩效果

30

28

25

22

19

15

答辩小组成员签名

答辩小组组长签名:

年月日

课程设计成绩评定表

成绩汇总

评分项目

评分

比例

分数

课程设计总分

指导老师评分

50%

答辩小组评分

50%

1.背景1

2.系统设计1

2.1系统主要目标1

2.2主要软件需求(运行环境)2

2.3功能模块与系统结构2

3系统功能程序设计4

3.1基本要求部分4

3.1.1字节替换4

3.1.2行移位5

3.1.3列混合6

3.1.4密钥加6

3.1.5密钥扩展7

3.1.6字节替换8

3.1.7行移位9

3.1.8列混合9

3.1.9加密10

3.1.10解密11

4.测试报告12

5.结论21

参考文献21

1.背景

AES,密码学中的高级加密标准(AdvancedEncryptionStandard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPSPUB197,并在2002年5月26日成为有效的标准。

2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES有一个固定的128位的块大小和128,192或256位大小的密钥大小。

该算法为比利时密码学家JoanDaemen和VincentRijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。

(Rijdael的发音近于"Rhinedoll"。

)AES在软体及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的记忆体。

作为一个新的加密标准,目前正被部署应用到更广大的范围.

2.系统设计

2.1系统主要目标

基本要求部分:

1.在深入理解AES加密解密算法理论的基础上,设计一个AES加密解密软件系统;

2.完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特(16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;

3.程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值;

4.要求提供所设计系统的报告及完整的软件。

较高要求部分:

1.如果明文不止一个分组,程序能完成分组,然后加密;最后一个分组长度不足时要求完成填充;密钥长度不足时能进行填充,过长则自动截取前面部分。

2.密钥采用ASCII码,明文要求输入信息可以是文字(可以是汉字或英文,信息量要求不止一个加密分组长度),任意字符,或者是文本文档,或者普通文件。

进行加密后,能够进行正确的解密;

3.程序代码有比较好的结构,模块划分合理,如用类进行封装,通过调用类的成员函数实现加密解密功能,函数的参数及返回值设置合理等;

4.界面友好,程序实现有新意。

2.2主要软件需求(运行环境)

本软件适用VC语言编写,编译成功后的EXE文件可以在装有windows系统的任何计算机上使用。

测试平台:

WindowsXPProfessional

使用软件:

VisualC++6.0

2.3功能模块与系统结构

主要功能模块如下:

1.字节替换SubByte

A0,0

A0,1

A0,2

A0,3

A1,0

A1,1

A1,2

A1,3

A2,0

A2,1

A2,2

A2,3

A3,0

A3,1

A3,2

A3,3

B0,0

B0,1

B0,2

B0,3

B1,0

B1,1

B1,2

B1,3

B2,0

B2,1

B2,2

B2,3

B3,0

B3,1

B3,2

B3,3

2.行移位ShiftRow

3.列混合MixColumn

4.轮密钥加AddRoundKey

5.逆字节替换

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

6.逆行移位InvShiftRow

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

7.逆列混淆

加密与解密系统流程图如下所示,

3系统功能程序设计

3.1基本要求部分

3.1.1字节替换

SubBytes()变换是一个基于S盒的非线性置换,它用于将输入或中间态的每一个字节通过一个简单的查表操作,将其映射为另一个字节。

映射方法是把输入字节的高四位作为S盒的行值,低四位作为列值,然后取出S盒中对应的行和列的元素作为输出。

unsignedcharsubbytes(unsignedcharstate[4][4])

{printf("aftersubbyte:

\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");

return0;

}

3.1.2行移位

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

unsignedcharshiftrows(unsignedcharstate[4][4])

{printf("aftershiftrows:

\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");

return0;

}

3.1.3列混合

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

unsignedcharmixcolumns(unsignedcharstate[4][4])

{printf("aftermixcolumns:

\n");实现(02030101)与中间态state分别相乘后异或得相应值

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

{(01010203)

k=state[0][i];(03010102)

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");

return0;

}

3.1.4轮密钥加

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

unsignedcharaddroundkey(unsignedcharstate[4][4],unsignedcharw[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");

return0;

}

3.1.5密钥扩展

通过生成器产生Nr+1个轮密钥,每个轮密钥由Nb个字组成,共有Nb(Nr+1)个字。

在加密过程中,需要Nr+1个轮密钥,需要构造4(Nr+1)个

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

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1