目 录
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]) //逆列混合

总体流程图:

C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_毕业设计

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

C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_AES加密_02


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_毕业设计_03


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_解密算法_04


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_毕业设计_05


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_c++_06


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_毕业设计_07


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_毕业设计_08


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_c++_09


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_c++_10


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_解密算法_11


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_毕业设计_12


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_c++_13


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_毕业设计_14


C语言 OPENSSL AES加解密 CBC PKCS7填充 c++ aes解密_AES加密_15