📄 aes.h
字号:
unsigned char RC[32];
word8 Log3B[256];
word8 Log3BN[256];
word32 T0[256],T1[256],T2[256],T3[256];
word32 TN0[256],TN1[256],TN2[256],TN3[256];
//求对数表log3 3为GF(256)的原根
void Qlog3b()
{
Log3B[0]=0;
word8 tmpch=1;
for(int i=1;i<256;i++)
{
tmpch=Multi_poly(tmpch,3);
Log3B[tmpch]=i;
Log3BN[i]=tmpch;
}
Log3BN[0]=1;
}
//对数法求 A*B
inline word8 mul(word8 a,word8 b)
{
if(a&&b) return Log3BN[(Log3B[a]+Log3B[b])%255];
else return 0;
}
//求轮常数
inline void QRCB()
{
int i;
RC[0]=0;
RC[1]=1;
for(i=0;i<30;i++)
if(RC[i+1]&0x80) RC[i+2]=(RC[i+1]<<1)^0x1b;
else RC[i+2]=RC[i+1]<<1;
}
//密钥扩展
inline void KeyExpansion(unsigned int *cskey,unsigned int *expkey)
{
int j;
QRCB();
Qlog3b();
for(j=0;j<Nk;j++) expkey[j]=cskey[j];
for(j=Nk;j<Nb*(Nr+1);j++)
if(j%Nk==0)
{
expkey[j]=expkey[j-1];
unsigned char *pch=(unsigned char *)(expkey+j);
expkey[j]=(expkey[j]<<8)+pch[3];
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch]^RC[j/Nk];
expkey[j]^=expkey[j-Nk];
}
else
expkey[j]=expkey[j-1]^expkey[j-Nk];
}
//代替变换
void SubBytes(word32 *state)
{
register word8 *pch=(word8 *)state;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
*pch=S_Box[*pch];pch++;
}
//移位变换
inline void ShiftRows(word32 *state)
{
word8 *pch=(word8 *)state;
word8 tmp=pch[2];
pch[2]=pch[6];
pch[6]=pch[10];
pch[10]=pch[14];
pch[14]=tmp;
tmp=pch[1];
pch[1]=pch[9];
pch[9]=tmp;
tmp=pch[5];
pch[5]=pch[13];
pch[13]=tmp;
tmp=pch[0];
pch[0]=pch[12];
pch[12]=pch[8];
pch[8]=pch[4];
pch[4]=tmp;
}
//混合列变换
inline void MixColumns(word32 *state)
{
word32 tmpstate;
word8 *pch=(word8 *)state,*pchx=(word8 *)(&tmpstate);
pchx[3]=pch[0]^pch[1]^mul(pch[2],0x03)^mul(pch[3],0x02);
pchx[2]=pch[0]^mul(pch[1],0x03)^mul(pch[2],0x02)^pch[3];
pchx[1]=mul(pch[0],0x03)^mul(pch[1],0x02)^pch[2]^pch[3];
pchx[0]=mul(pch[0],0x02)^pch[1]^pch[2]^mul(pch[3],0x03);
pch+=4;state[0]=tmpstate;
pchx[3]=pch[0]^pch[1]^mul(pch[2],0x03)^mul(pch[3],0x02);
pchx[2]=pch[0]^mul(pch[1],0x03)^mul(pch[2],0x02)^pch[3];
pchx[1]=mul(pch[0],0x03)^mul(pch[1],0x02)^pch[2]^pch[3];
pchx[0]=mul(pch[0],0x02)^pch[1]^pch[2]^mul(pch[3],0x03);
pch+=4;state[1]=tmpstate;
pchx[3]=pch[0]^pch[1]^mul(pch[2],0x03)^mul(pch[3],0x02);
pchx[2]=pch[0]^mul(pch[1],0x03)^mul(pch[2],0x02)^pch[3];
pchx[1]=mul(pch[0],0x03)^mul(pch[1],0x02)^pch[2]^pch[3];
pchx[0]=mul(pch[0],0x02)^pch[1]^pch[2]^mul(pch[3],0x03);
pch+=4;state[2]=tmpstate;
pchx[3]=pch[0]^pch[1]^mul(pch[2],0x03)^mul(pch[3],0x02);
pchx[2]=pch[0]^mul(pch[1],0x03)^mul(pch[2],0x02)^pch[3];
pchx[1]=mul(pch[0],0x03)^mul(pch[1],0x02)^pch[2]^pch[3];
pchx[0]=mul(pch[0],0x02)^pch[1]^pch[2]^mul(pch[3],0x03);
state[3]=tmpstate;
}
//密钥加
inline void AddRoundKey(word32 *state,word32 *expkey)
{
state[0]^=expkey[0];
state[1]^=expkey[1];
state[2]^=expkey[2];
state[3]^=expkey[3];
}
//轮函数
inline void Round(word32 *state,word32 *expkey)
{
printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
SubBytes(state);
//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
ShiftRows(state);
//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
MixColumns(state);
//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
AddRoundKey(state,expkey);
}
//最后一轮函数
void FindalRound(word32 *state,word32 *expkey)
{
SubBytes(state);
//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
ShiftRows(state);
//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
AddRoundKey(state,expkey);
}
// AES加密函数
// 明文文件指针State 密钥CipherKey 明文块数bc
void AES_Enfun(unsigned int *State,unsigned int *CipherKey,int bc)
{
unsigned int ExpandedKey[(Nr+1)*4];
char i;
KeyExpansion( CipherKey, ExpandedKey );
for(int j=0;j<1;j++)
{
AddRoundKey( State,ExpandedKey );
for(i=4;i<(Nr<<2);i+=4)
Round ( State+j*4, ExpandedKey+i );
FindalRound ( State+j*4, ExpandedKey+(Nr<<2));
}
printf("\n%08x %08x %08x %08x\n",State[0],State[1],State[2],State[3]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -