赞
踩
目 录
1. 背景与意义 4
2. 系统设计 5
2.1系统主要目标 5
2.2主要软件需求(运行环境) 5
2.3功能模块与系统结构 6
3 系统功能程序设计 8
3.1基本要求部分 8
3.1.1 字节替换 8
3.1.2行移位 9
3.1.3列混合 11
3.1.4密钥加 13
3.1.5密钥扩展 14
3.1.6获取RoundKey 16
3.1.7逆字节替换 17
3.1.8逆行移位 17
3.1.9逆列混合 19
3.1.10加密 20
3.1.11解密 23
4. 测试报告 26
5.结论 29
参考文献 30
2.系统设计
先定义后面s盒变换和密钥扩展要用到的s盒数组和rcon数组,然后定义s盒查找函数,行移位,列混合函数,因为这几个函数无论是在10轮还是12轮还是14轮执行时都没变化。然后就是12轮的轮密钥加和密钥扩展。这一步也许有点困难,接着就是12轮的加密函数本身。然后才是10轮的轮米要加和密钥扩展,加密函数。最后是解密要用到的逆字节替代,逆行移位,逆列混合,轮密钥加和密钥扩展函数和加密是一样的,所以不用重新定义。
2.1系统主要目标
基本要求部分:
1.完成一个明文分组的加解密,明文和密钥是十六进制,长度都为128比特(32个16进制数),按照标准输入明文和密钥,输出密文,进行加密后,能够进行正确的解密。
2.程序运行时,本文转载自http://www.biyezuopin.vip/onews.asp?id=13048要求输出每一轮使用的密钥,以及每一轮中字节替代、行移位、列混合和密钥加等每一步操作之后的16进制表示的值。
3. 提供运行标准示例的选项。
4. 能够在文件读取密钥明文。
5. 程序有良好的人机交互操作。
2.2主要软件需求(运行环境)
本软件适用VC语言编写,编译成功后的EXE文件可以在装有windows系统的任何计算机上使用。
测试平台:Windows XP Professional
使用软件:Visual C++ 6.0
2.3功能模块与系统结构
主函数:
xAESencrypt();128比特加密
xAESencrypt6(); 12轮加密
xAESdencrypt();128比特解密
show();演示
void SB() //从文件读取192比特密钥和明文
void SA()//从文件读取128比特密钥
void subbyte(int col[4][4]) //字节替代
void shiftrows(int col[4][4]) //行移位
void mixcolumn(int col[4][4]) //列混合
void addroundkey6(int col[4][4],int allkey[4][52],int nr) //192比特轮密钥加
void addroundkey(int col[4][4],int allkey[4][44],int nr) //128论密钥加
void keyschedule6(int key[4][6],int allkey[4][52],int nk,int nr) //192密钥扩展
void keyschedule(int key[4][4],int allkey[4][44],int nk,int nr) //128密钥扩展
void invsubbyte(int col[4][4]) //逆字节替代
void invshiftrows(int col[4][4]) //逆行移位
void invmixcolumn(int col[4][4]) //逆列混合
总体流程图:
void xAESdencrypt() { system("cls"); int allkey[4][44]; int nr=10,nk=4; int asd[4][4]; int key[4][4]; printf("\n请输入解密密钥:16进制(128比特)\n"); for(int o=0;o<4;o++) for(int p=0;p<4;p++) { scanf("%x",&key[p][o]); } printf("\n请输入要解密的字符:16进制(128比特)\n"); for(int w=0;w<4;w++) for(int v=0;v<4;v++) { scanf("%x",&asd[v][w]); } printf("您输入的密钥为:"); for(int a=0;a<4;a++) for(int b=0;b<4;b++) {printf(" %x",key[b][a]);} printf("\n"); printf("您输入的密文为:"); for(int c=0;c<4;c++) for(int d=0;d<4;d++) {printf(" %x",asd[d][c]);} printf("\n"); keyschedule(key,allkey,nk,nr); printf("\n\n轮子密钥加结果为:");addroundkey(asd,allkey,nr);printf("\n"); for(int x=9;x>=1;x--) { printf("第%d逆字节替代结果:\n",10-x); invsubbyte(asd); printf("第%d逆行移位结果:\n",10-x); invshiftrows(asd); printf("第%d逆轮密钥加位结果:\n",10-x); addroundkey(asd,allkey,x); printf("第%d逆列混合结果:\n",10-x); invmixcolumn(asd); } printf("第10逆字节替代结果:\n");invsubbyte(asd); printf("第10逆行移位结果:\n");invshiftrows(asd); printf("第10逆轮密钥加位结果:\n");addroundkey(asd,allkey,0); printf("\n\n解密结果为:"); for(int i=0;i<4;i++) for(int j=0;j<4;j++) { printf(" %x",asd[j][i]); } printf("\n"); printf("\n\n请按数字键“0”返回主菜单!(“enter”键确定)\n"); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。