当前位置:   article > 正文

AES加密解密算法设计(C++)_aes加解密c语言实现devc++

aes加解密c语言实现devc++

目 录
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");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/460219
推荐阅读
相关标签
  

闽ICP备14008679号