📄 myaes.cpp
字号:
for(i=0;i<4;i++)
for(j=0;j<4;j++)
state[i][j]=temp[i][j];
}
void MixColumns(BYTE state[4][4]) //伽罗瓦运算{0x53}·{0x02}.... 查表
{
int i,j;
BYTE temp[4][4];
for (i=0; i<4; i++)
{
temp[0][i] = GFMul02(state[0][i])^GFMul03(state[1][i])
^GFMul01(state[2][i])^GFMul01(state[3][i]);
temp[1][i] = GFMul01(state[0][i])^GFMul02(state[1][i])
^GFMul03(state[2][i])^GFMul01(state[3][i]);
temp[2][i] = GFMul01(state[0][i])^GFMul01(state[1][i])
^GFMul02(state[2][i])^GFMul03(state[3][i]);
temp[3][i] = GFMul03(state[0][i])^GFMul01(state[1][i])
^GFMul01(state[2][i])^GFMul02(state[3][i]);
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
state[i][j]=temp[i][j];
}
void InvMixColumns(BYTE state[4][4]) //伽罗瓦运算
{
int i,j;
BYTE temp[4][4];
for (i=0; i<4; i++)
{
temp[0][i] = GFMul0E(state[0][i])^GFMul0B(state[1][i])
^GFMul0D(state[2][i])^GFMul09(state[3][i]);
temp[1][i] = GFMul09(state[0][i])^GFMul0E(state[1][i])
^GFMul0B(state[2][i])^GFMul0D(state[3][i]);
temp[2][i] = GFMul0D(state[0][i])^GFMul09(state[1][i])
^GFMul0E(state[2][i])^GFMul0B(state[3][i]);
temp[3][i] = GFMul0B(state[0][i])^GFMul0D(state[1][i])
^GFMul09(state[2][i])^GFMul0E(state[3][i]);
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
state[i][j]=temp[i][j];
}
void Cipher(BYTE state[4][4],BYTE w[4*(Nr+1)][4]) //加密函数
{
int i,j,round;
BYTE wTemp[4][4];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
wTemp[i][j]=w[i][j];
printf("\nCIPHER (ENCRYPT):");
printf("\nround[ 0].input "); //start[0] = state state按照列序存储
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
printf("\nround[ 0].k_sch "); //key_sch[0]
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",w[i][j]);
AddRoundKey(state,wTemp);
for(round=1;round<Nr;round++) //round 1 --> Nr-1
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
wTemp[i][j]=w[i+round*4][j];
printf("\nround[ %d].start ",round); //start[round]
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
SubBytes(state); //SubBytes[round]
printf("\nround[ %d].s_box ",round);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
ShiftRows(state); //ShiftRows[round]
printf("\nround[ %d].s_row ",round);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
MixColumns(state); //MixColumns[round]
printf("\nround[ %d].m_col ",round);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
printf("\nround[ %d].k_sch ",round); //key_sch[round]
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",w[i+round*4][j]);
AddRoundKey(state,wTemp);
}
for(i=0;i<4;i++)
for(j=0;j<4;j++){
wTemp[i][j]=w[i+Nr*4][j];
}
printf("\nround[%d].start ",Nr); //start[Nr]
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
SubBytes(state); //SubBytes[Nr]
printf("\nround[%d].s_box ",Nr);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
ShiftRows(state); //ShiftRows[Nr]
printf("\nround[%d].s_row ",Nr);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
printf("\nround[%d].k_sch ",Nr); //key_sch[Nr]
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",w[i+Nr*4][j]);
AddRoundKey(state, wTemp);
printf("\nround[%d].output ",Nr); //output --> result
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
}
//解密函数
void InvCipher(BYTE state[4][4],BYTE w[4*(Nr+1)][4])
{
int i,j,round;
BYTE wTemp[4][4];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
wTemp[i][j]=w[i+4*Nr][j];
printf("\n\nINVERSE CIPHER (DECRYPT):");
printf("\nround[ 0].iinput "); //istart[0] = result result按照列序存储
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
printf("\nround[ 0].ik_sch "); //key_sch[Nr] 第Nr组扩展密钥
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",w[i+4*Nr][j]);
AddRoundKey(state, wTemp);
for(round=Nr-1 ;round>0 ;round--) //ronud Nr-1 --> 1
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
wTemp[i][j]=w[i+round*4][j];
printf("\nround[ %d].istart ",Nr-round); //istart[Nr-round]
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
InvShiftRows(state); //InvShiftRows[Nr-round]
printf("\nround[ %d].is_row ",Nr-round);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
InvSubBytes(state); //InvSubBytes[Nr-round]
printf("\nround[ %d].is_box ",Nr-round);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
printf("\nround[ %d].ik_sch ",Nr-round); //key_sch[round]
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",w[i+4*round][j]);
AddRoundKey(state, wTemp);
printf("\nround[ %d].ik_add ",Nr-round);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
InvMixColumns(state); //InvMixColumns[Nr-round]
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
wTemp[i][j]=w[i][j];
InvShiftRows(state); //InvShiftRows[Nr]
printf("\nround[%d].is_row ",Nr);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
InvSubBytes(state); //InvSubBytes[Nr]
printf("\nround[%d].is_box ",Nr);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
printf("\nround[%d].ik_sch ",Nr); //key_sch[0]
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",w[i][j]);
AddRoundKey(state, wTemp);
printf("\nround[%d].ioutput ",Nr); //ioutput --> result
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
}
void strtoHex(char ch[32],BYTE block[16])
{
int i;
for(i=0;i<16;i++)
{
if((ch[2*i] >= '0' && ch[2*i] <= '9')&&(ch[2*i+1] >= '0' && ch[2*i+1] <= '9'))
block[i] = ((ch[2*i]-'0') << 4) + ch[2*i+1] - '0';
else if((ch[2*i] >= 'A' && ch[i] <= 'F')&&(ch[2*i+1] >= 'A' && ch[2*i+1] <= 'F'))
block[i] = ((ch[2*i]-'A'+10) << 4) + ch[2*i+1] - 'A'+10;
else if((ch[2*i] >= 'a' && ch[i] <= 'f')&&(ch[2*i+1] >= 'a' && ch[2*i+1] <= 'f'))
block[i] = ((ch[2*i]-'a'+10) << 4) + ch[2*i+1] - 'a'+10;
else // error if not hexadecimal
{
printf("It must be in hexadecimal notation\n");
exit(0);
}
}
}
void main()
{
int i,j;
BYTE block[16]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};
BYTE key[Nk][4]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f}; //可根据需要填写key,可为16、24、32byte
BYTE state[4][4];
BYTE w[4*(Nr+1)][4];
printf("/* AES加密算法 -- key = 128bit */"); //等待用户输入32个字符的数据
printf("\nPlease input your data (32 Hex Numbers):\n");
char ch[32];
for(i=0;i<32;i++)
scanf("%c",&ch[i]);
strtoHex(ch,block);
printf("\nPLAINTEXT: ");
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",block[4*i+j]);
printf("\nKEY: ");
for(i=0;i<Nk;i++)
for(j=0;j<4;j++)
printf("%02x ",key[i][j]);
printf("\nState Size= %d bits, Key Size= %d bits",4*32,Nk*32);
//block--> state
for(i=0;i<4;i++)
for(j=0;j<4;j++)
state[i][j]=block[4*j+i]; //state按照列序存储,打印的时候按照列序打印
KeyExpansion(key,w); //密钥扩展
Cipher(state, w); //加密
printf("\n\nEncrypt= ");
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
InvCipher(state, w); //解密
printf("\n\nDecrypt= ");
for(i=0;i<4;i++)
for(j=0;j<4;j++)
printf("%02x ",state[j][i]);
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -