📄 aes.c
字号:
void IvMixColumn(unsigned char C[][4],unsigned char d[][4]) //逆混合列变换
{
int c;
for(c=0;c<4;c++)
d[0][c]=(unsigned char)((int)gfmultby0e(C[0][c]) ^ (int)gfmultby0b(C[1][c]) ^
(int)gfmultby0d(C[2][c]) ^ (int)gfmultby09(C[3][c]));
for(c=0;c<4;c++)
d[1][c]=(unsigned char)((int)gfmultby09(C[0][c]) ^ (int)gfmultby0e(C[1][c]) ^
(int)gfmultby0b(C[2][c]) ^ (int)gfmultby0d(C[3][c]));
for(c=0;c<4;c++)
d[2][c]=(unsigned char)((int)gfmultby0d(C[0][c]) ^ (int)gfmultby09(C[1][c]) ^
(int)gfmultby0e(C[2][c]) ^ (int)gfmultby0b(C[3][c]));
for(c=0;c<4;c++)
d[3][c]=(unsigned char)((int)gfmultby0b(C[0][c]) ^ (int)gfmultby0d(C[1][c]) ^
(int)gfmultby09(C[2][c]) ^ (int)gfmultby0e(C[3][c]));
}
void AddRoundKey(unsigned char d[][4],unsigned char key[][4],unsigned char e[][4]) //加循环密钥
{
int r,c;
for(r=0;r<4;r++)
for(c=0;c<4;c++)
e[r][c]=(unsigned char)((int)d[r][c]^(int)key[r][c]);
}
void KeyProducing(unsigned char BaseK[4][4],unsigned char K[4][44]) //扩展初始密钥到44列
{
int r,c,i;
unsigned char temp[4]={0},temp2[4]={0};
for(c=0;c<4;++c)
{
for(r=0;r<4;++r)
K[r][c]=BaseK[r][c];
}
for(c=4;c<44;c++)
{
if(c%4!=0)
for(r=0;r<4;r++)
K[r][c]=(unsigned char)((int)K[r][c-4] ^ (int)K[r][c-1]);
else
{ for(r=0;r<4;r++)
temp[r]=K[r][c-1];
temp=SubWord(RotWord(temp)); //先移位,再代换,最后和轮常量异或
temp[0] = (unsigned char)( (int)temp[0] ^ (int) AesRcon[c+0] );
temp[1] = (unsigned char)( (int)temp[1] ^ (int) AesRcon[c+1] );
temp[2] = (unsigned char)( (int)temp[2] ^ (int) AesRcon[c+2] );
temp[3] = (unsigned char)( (int)temp[3] ^ (int) AesRcon[c+3] );
/* for(r=0;r<4;r++) //移位
temp2[r]=temp1[(r+1)%4];
for(r=0;r<4;r++) //代换
{
sc =(int)temp2[r] & 0x0F;
sr =(int)(temp2[r]>>4);
temp2[r]=(unsigned char)Sbox[sr][sc];
}
R=(unsigned char)0x01;
for(i=0;i<(c-4)/4;i++)
R=gfmultby02(R); //完成课本上所说的r(i)=00000010的(i-4)/4次方
temp2[0]=(unsigned char)((int)temp2[0] ^ (int)R); //完成课本上所说的T(W[i-1])*/
for(r=0;r<4;r++)
K[r][c]=(unsigned char)((int)K[r][c-4] ^ temp[r]);
}
}
}
/*void IKeyProducing(unsigned char K[4][44],unsigned char IK[4][44])
{
int c;
for(c=0;c<44;c++)
IK[0][c]=(unsigned char)((int)gfmultby0e(K[0][c]) ^ (int)gfmultby0b(K[1][c]) ^
(int)gfmultby0d(K[2][c]) ^ (int)gfmultby09(K[3][c]));
for(c=0;c<44;c++)
IK[1][c]=(unsigned char)((int)gfmultby09(K[0][c]) ^ (int)gfmultby0e(K[1][c]) ^
(int)gfmultby0b(K[2][c]) ^ (int)gfmultby0d(K[3][c]));
for(c=0;c<44;c++)
IK[2][c]=(unsigned char)((int)gfmultby0d(K[0][c]) ^ (int)gfmultby09(K[1][c]) ^
(int)gfmultby0e(K[2][c]) ^ (int)gfmultby0b(K[3][c]));
for(c=0;c<44;c++)
IK[3][c]=(unsigned char)((int)gfmultby0b(K[0][c]) ^ (int)gfmultby0d(K[1][c]) ^
(int)gfmultby09(K[2][c]) ^ (int)gfmultby0e(K[3][c]));
}*/
void Encode(unsigned char In[][4],unsigned char K[][44],unsigned char*out)
{
int round,r,c;
unsigned char Ki[4][4]={0};
unsigned char e[4][4]={0},b[4][4]={0},C[4][4]={0},d[4][4]={0};
for(r=0;r<4;r++)
for(c=0;c<4;c++)
Ki[r][c]=K[r][c]; //第0个循环密钥
AddRoundKey(In,Ki,e); //ARK,使用第0个循环密钥
for(round=1;round<10;round++)
{
ByteSub(e,b); //字节转换
ShiftRow(b,C); //移动行变换
MixColumn(C,d); //混合列变换
for(r=0;r<4;r++)
for(c=0;c<4;c++)
Ki[r][c]=K[r][4*round+c]; //产生第round轮循环的密钥Ki
AddRoundKey(d,Ki,e); //roundth循环加密
}
ByteSub(e,b); //第10次循环加密的字节转换
ShiftRow(b,C); //第10次循环加密的移动行变换
for(r=0;r<4;r++)
for(c=0;c<4;c++)
Ki[r][c]=K[r][4*10+c]; //产生第10轮循环的密钥Ki
AddRoundKey(C,Ki,e); //10th循环加密
for(c=0;c<4;c++)
{
for(r=0;r<4;r++)
out[r+4*c]=e[r][c]; //加密结果转换成输入
}
}
void Decode(unsigned char In[][4],unsigned char K[][44],unsigned char*out)
{
unsigned char Ki[4][4]={0};
unsigned char e[4][4]={0},b[4][4]={0},C[4][4]={0},d[4][4]={0};
int round,r,c;
for(r=0;r<4;r++)
for(c=0;c<4;c++)
Ki[r][c]=K[r][4*10+c]; //产生第10轮循环的密钥Ki
AddRoundKey(In,Ki,e); //10th循环解密
for(round=9;round>0;round--)
{
IvByteSub(e,b); //字节转换
IvShiftRow(b,C); //移动行变换
IvMixColumn(C,d); //混合列变换
for(r=0;r<4;r++)
for(c=0;c<4;c++)
Ki[r][c]=K[r][4*round+c]; //产生第round轮循环的密钥Ki
AddRoundKey(d,Ki,e); //roundth循环解密
}
IvByteSub(e,b); //字节转换
IvShiftRow(b,C); //移动行变换
for(r=0;r<4;r++)
for(c=0;c<4;c++)
Ki[r][c]=K[r][c]; //产生第round轮循环的密钥Ki
AddRoundKey(C,Ki,e); //ARK,使用第0个循环密钥
for(c=0;c<4;c++)
for(r=0;r<4;r++)
out[r+4*c]=e[r][c]; //加密结果转换成输入
}
//*****************************************************************************
void main()
{
unsigned char BaseM[4][4]={0},BaseK[4][4]={0};
unsigned char K[4][44]={0};
unsigned char Mwen[]="My name is ReFXr";
unsigned char key[]="1234567890123456";
unsigned char outjiam[16]={0};
unsigned char outjiem[16]={0};
int i;
chartomatrix(Mwen,BaseM);
chartomatrix(key,BaseK);
KeyProducing(BaseK,K); //加密前处理
printf("the article before being coded:\n");
puts(Mwen);
printf("the key is:\n");
puts(key);
Encode(BaseM,K,outjiam);
printf("\nthe article after being coded:\n");
//puts(outjiam);
printf("\n");
for(i=0;i<16;i++)
{
// if(outjiam[i] >=128)
// printf("%d",(outjiam[i]%128));
// else
printf("%02x",outjiam[i]);
}
printf("\n");
//解密前处理
chartomatrix(outjiam,BaseM);
Decode(BaseM,K,outjiem);
printf("\nthe article after being decoded:\n");
// puts(outjiem);
printf("\n");
for(i=0;i<16;i++)
{
if(outjiem[i] >=128)
printf("%c",(outjiem[i]%128));
else
printf("%c",outjiem[i]);
}
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -