快捷搜索: 王者荣耀 脱发

AES加密解密算法设计(C++)

目 录 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("
请输入解密密钥:16进制(128比特)
");
	for(int o=0;o<4;o++)
		for(int p=0;p<4;p++)
		{
			scanf("%x",&key[p][o]);
		}
	
	printf("
请输入要解密的字符:16进制(128比特)
");
	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("
");
	printf("您输入的密文为:");
	for(int c=0;c<4;c++)
		for(int d=0;d<4;d++)
		{printf("  %x",asd[d][c]);}
	printf("
");

	keyschedule(key,allkey,nk,nr);
	printf("

轮子密钥加结果为:");addroundkey(asd,allkey,nr);printf("
");
	for(int x=9;x>=1;x--)
	{
		printf("第%d逆字节替代结果:
",10-x); invsubbyte(asd);
		printf("第%d逆行移位结果:
",10-x); invshiftrows(asd); 
		printf("第%d逆轮密钥加位结果:
",10-x); addroundkey(asd,allkey,x);
		printf("第%d逆列混合结果:
",10-x); invmixcolumn(asd);
	}
		printf("第10逆字节替代结果:
");invsubbyte(asd);
		printf("第10逆行移位结果:
");invshiftrows(asd);
     	printf("第10逆轮密钥加位结果:
");addroundkey(asd,allkey,0);
		printf("

解密结果为:");
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
		{
			printf("  %x",asd[j][i]);
		}
	printf("
");
	printf("

请按数字键“0”返回主菜单!(“enter”键确定)
");
}
经验分享 程序员 微信小程序 职场和发展