⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes.cpp

📁 AES加密的一个算法实现 一个自己编写的算法代码
💻 CPP
字号:
#include   <stdio.h>  
void main()
{
	unsigned char p[4][4]={{0x04,0xe0,0x48,0x28},{0x66,0xcb,0xf8,0x06},{0x81,0x19,0xd3,0x26},{0xe5,0x9a,0x7a,0x4c}};
	unsigned char key[4][4]={{0xa0,0x88,0x23,0x2a},{0xfa,0x54,0xa3,0x6c},{0xfe,0x2c,0x39,0x76},{0x17,0xb1,0x39,0x05}};
	unsigned char addkey[4][4];
	unsigned char sbox[4][4];
	
	void add(unsigned char add[4][4],unsigned char p1[4][4],unsigned char k1[4][4]);
	void sbx(unsigned char sbox[4][4],unsigned char addkey[4][4]);
	void shiftrow(unsigned char sb[4][4]);
	void mixcolumn(unsigned char mix[4][4]);
	int i,j;
	printf("输出明文内容:\n");
	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			printf("%x\t",p[i][j]);
		}
		printf("\n");
	}

	add(addkey,p,key);

	sbx(sbox,addkey);

	shiftrow(sbox);

	mixcolumn(sbox);

}

void sbx(unsigned char sbox[4][4],unsigned char addkey[4][4]){
int b,m,n;
unsigned char s[16][16]={{0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76},
							{0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0},
							{0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15},
							{0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75},
							{0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84},
							{0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf},
							{0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8},
							{0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2},
							{0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73},
							{0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb},
							{0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79},
							{0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08},
							{0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a},
							{0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e},
							{0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf},
							{0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16}};

	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			b=(int)addkey[i][j];
			m=b/16;
			n=b%16;
			sbox[i][j]=s[m][n];
		}
	}
printf("输出经S-box变化后的内容:\n");
	for(int i1=0;i1<4;i1++){
		for(int j1=0;j1<4;j1++){
			printf("%x\t",sbox[i1][j1]);
		}
		printf("\n");
	}

}




void add(unsigned char add[4][4],unsigned char p1[4][4],unsigned char k1[4][4]){
int i1,j1;
printf("输出明文加上密钥后的内容:\n");
for(i1=0;i1<4;i1++){
	for(j1=0;j1<4;j1++){
		add[i1][j1]=p1[i1][j1]^k1[i1][j1];
		printf("%x\t",add[i1][j1]);
	}
	printf("\n");
}
}  
void shiftrow(unsigned char sb[4][4]){
int i2,j2=0;
unsigned char temp1,temp2,temp3,temp4;
printf("输出经过Shiftrow变换后的内容:\n");
for(i2=1;i2<4;i2++){
	j2=0;
	temp1=sb[i2][j2];
	temp2=sb[i2][j2+1];
	temp3=sb[i2][j2+2];
	temp4=sb[i2][j2+3];
	sb[i2][(j2-i2+4)%4]=temp1;
	sb[i2][(j2+1-i2+4)%4]=temp2;
	sb[i2][(j2+2-i2+4)%4]=temp3;
	sb[i2][(j2+3-i2+4)%4]=temp4;
}
for(int i3=0;i3<4;i3++){
		for(int j3=0;j3<4;j3++){
			printf("%x\t",sb[i3][j3]);
		}
		printf("\n");
	}
}
void mixcolumn(unsigned char mix[4][4]){
unsigned char c1[4],c2[4],c3[4],c4[4];
unsigned char m1[4],m2[4],m3[4],m4[4];
int a1[4]={2,3,1,1};
int a2[4]={1,2,3,1};
int a3[4]={1,1,2,3};
int a4[4]={3,1,1,2};
unsigned char multiply(unsigned char c[4],int a[4]);
for(int m=0;m<4;m++){
	c1[m]=mix[m][0];
}
for(int m=0;m<4;m++){
	c2[m]=mix[m][1];
}
for(int m=0;m<4;m++){
	c3[m]=mix[m][2];
}
for(int m=0;m<4;m++){
	c4[m]=mix[m][3];
}
m1[0]=multiply(c1,a1);
m1[1]=multiply(c1,a2);
m1[2]=multiply(c1,a3);
m1[3]=multiply(c1,a4);

m2[0]=multiply(c2,a1);
m2[1]=multiply(c2,a2);
m2[2]=multiply(c2,a3);
m2[3]=multiply(c2,a4);

m3[0]=multiply(c3,a1);
m3[1]=multiply(c3,a2);
m3[2]=multiply(c3,a3);
m3[3]=multiply(c3,a4);

m4[0]=multiply(c4,a1);
m4[1]=multiply(c4,a2);
m4[2]=multiply(c4,a3);
m4[3]=multiply(c4,a4);

printf("输出经过Mixcolunm变换后的内容:\n");
for(int j=0;j<4;j++){
	printf("%x\t",m1[j]);
	printf("%x\t",m2[j]);
	printf("%x\t",m3[j]);
	printf("%x\t",m4[j]);
	printf("\n");
}
}
unsigned char multiply(unsigned char c[4],int a[4]){
unsigned char tmp[4],temp1,temp2,t,ret;
unsigned char a1=0x80;
unsigned char b=0x1b;
	for(int i=0;i<4;i++){
		if(a[i]==1)
			tmp[i]=c[i];
		else if (a[i]==2){
			t=c[i];
			t=t&a1;
			if(t==0x80){
				temp2=c[i]<<1;
				temp2=temp2^b;
				tmp[i]=temp2;
			}
			else
				tmp[i]=c[i]<<1;
		}
		else if (a[i]==3){
			t=c[i];
			t=t&a1;
			if(t==0x80){
				temp1=c[i];
				temp2=c[i]<<1;
				temp2=temp2^b;
				tmp[i]=temp2^temp1;
			}
			else{
				temp1=c[i];
				temp2=c[i]<<1;
				tmp[i]=temp1^temp2;
			}

		}

	}
	ret=tmp[0]^tmp[1]^tmp[2]^tmp[3];
	return ret;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -