📄 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 + -