目 录
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");
}