📄 aes.cpp
字号:
printf("enter your InitialKey: \n");
scanf("%s",InitialKey);
KeyExpansion(InitialKey,RoundKey);
int t=0;
int d=0;
if(mode=='0') //加密模式
{
while((t=fread(Ptxt,1,16,fp_in))==16) // 判断能否成功读取128bit(一个分组)
{
if(d) //判断上一次是否成功读取128bit(一个分组)
{
fwrite(Ctxt,1,16,fp_out); // 若成功则输出上一次分组的加密结果
}
Cipher(Ptxt,Ctxt); // 对当前分组进行加密
d=1; // 确定成功读取128bit(一个分组)并完成对该分组加密
}
if(d==0) //未能读取一个分组
{
printf("your file need not be encryted.\n");
fclose(fp_in);
fclose(fp_out);
exit(0); //解密结束
}
if(t) //判断是否进行密文挪用
{
byte finalch[16];
for(int j=0;j<t;j++)
{
finalch[j]=Ctxt[j];
}//选择上一个分组的加密结果的头t个字节作为最后一组加密结果
byte tailtxt[16];
for(j=t;j<16;j++)
{
tailtxt[j]=Ctxt[j];
}// 选择上一个分组的加密结果的后16-t个字节
for(j=t;j<16;j++)
{
Ptxt[j]=tailtxt[j];
}//tailtxt作为下一个待加密分组的后16-t个字节
//至此新的一个128bit分组产生
Cipher(Ptxt,Ctxt); // 对当前分组进行加密
fwrite(Ctxt,1,16,fp_out); //输出当前分组的加密结果
fwrite(finalch,1,t,fp_out); //输出最后一组加密结果
printf("Encyption is finished.\n"); // 完成加密
}
else // 确定不进行密文挪用
{
fwrite(Ctxt,1,16,fp_out); //输出当前分组的加密结果
printf("Encyption is finished.\n"); // 完成加密
}
fclose(fp_in);
fclose(fp_out); // 关闭文件
}
//加密模式结束
if(mode=='1') //解密模式
{
while((t=fread(Ctxt,1,16,fp_in))==16)
{
if(d)
{
fwrite(Ptxt,1,16,fp_out);
}
InvCipher(Ctxt,Ptxt);
d=1;
}
if(d==0)
{
fclose(fp_in);
fclose(fp_out);
exit(0);
}
if(t)
{
char finalch[16];
for(int j=0;j<t;j++)
{
finalch[j]=Ptxt[j];
}
char tailtxt[16];
for(j=t;j<16;j++)
{
tailtxt[j]=Ptxt[j];
}
for(j=t;j<16;j++)
{
Ctxt[j]=tailtxt[j];
}
InvCipher(Ctxt,Ptxt);
fwrite(Ptxt,1,16,fp_out);
fwrite(finalch,1,t,fp_out);
printf("Decyption is finished.\n");
}
else
{
fwrite(Ctxt,1,16,fp_out);
printf("Decyption is finished.\n");
}
fclose(fp_in);
fclose(fp_out); // 关闭文件
} //解密模式结束
} //主程序结束
/*----------------------------------------------------------------*/
void Cipher(byte Ptxt[],byte Ctxt[]) //定义Cipher函数(AES核心算法)
{
for(int i=0;i<16;i++)
{
state[i]=Ptxt[i]; //初始化状态矩阵
}
AddRoundKey(state,0);
for(i=1;i<Nr;i++)
{
SubBytes(state);
ShiftRows(state);
MixColumns(state);
AddRoundKey(state,i*Nb);
}
SubBytes(state);
ShiftRows(state);
AddRoundKey(state,Nr*Nb);
for(i=0;i<16;i++)
{
Ctxt[i]=state[i]; //得到密文
}
}
/*----------------------------------------------------------------*/
void KeyExpansion(byte in[], word out[]) //定义密钥扩展函数
{
word temp;
byte s[4];
for(int i=0;i<Nk;i++)
{
out[i]=((word)in[4*i]<<24)|((word)in[4*i+1]<<16)|((word)in[4*i+2]<<8)|(word)in[4*i+3];
} //4个字节组成1个字(32bit)
for(i=Nk;i<Nb*(Nr+1);i++)
{
temp=out[i-1];
if(i%Nk==0)
{
RotWord(temp);
SubWord(temp);
temp=temp^Rcon[i/Nk-1];
}
if(Nk==8&&(i%Nk==4))
{
SubWord(temp);
}
out[i]=temp^out[i-Nk];//输出轮密钥
}
}
/*----------------------------------------------------------------*/
void AddRoundKey(byte state[],int n)
{
word temp[4];
temp[0]=((word)state[0]<<24)|((word)state[1]<<16)|((word)state[2]<<8)|(word)state[3];
temp[1]=((word)state[4]<<24)|((word)state[5]<<16)|((word)state[6]<<8)|(word)state[7];
temp[2]=((word)state[8]<<24)|((word)state[9]<<16)|((word)state[10]<<8)|(word)state[11];
temp[3]=((word)state[12]<<24)|((word)state[13]<<16)|((word)state[14]<<8)|(word)state[15];
//4个字节组成1个字(32bit)
temp[0]=temp[0]^RoundKey[n];
temp[1]=temp[1]^RoundKey[n+1];
temp[2]=temp[2]^RoundKey[n+2];
temp[3]=temp[3]^RoundKey[n+3];
for(int i=0;i<4;i++)
{
state[4*i]=(byte)(temp[i]>>24);
state[4*i+1]=(byte)(temp[i]>>16);
state[4*i+2]=(byte)(temp[i]>>8);
state[4*i+3]=(byte)temp[i];
//1个字分解成为4个字节
}
}
/*----------------------------------------------------------------*/
void SubBytes(byte state[])
{
for(int i=0;i<16;i++)
{
state[i]=Sbox[state[i]>>4][state[i]&0x0f];//使用S盒
}
}
/*----------------------------------------------------------------*/
void ShiftRows(byte state[])
{
byte temp[16];
for(int i=0;i<16;i++)
{
temp[i]=state[ShiftRows_table[i]-1]; //使用变换表
}
for(i=0;i<16;i++)
{
state[i]=temp[i];
}
}
/*----------------------------------------------------------------*/
void MixColumns(byte state[])
{
byte s[4];
for(int i=0;i<16;i=i+4)
{
s[0]=state[i]; s[1]=state[i+1];
s[2]=state[i+2]; s[3]=state[i+3];
state[i]=Mul02_table[s[0]]^Mul03_table[s[1]]^s[2]^s[3];
state[i+1]=s[0]^Mul02_table[s[1]]^Mul03_table[s[2]]^s[3];
state[i+2]=s[0]^s[1]^Mul02_table[s[2]]^Mul03_table[s[3]];
state[i+3]=Mul03_table[s[0]]^s[1]^s[2]^Mul02_table[s[3]];
//使用模乘表
}
}
/*----------------------------------------------------------------*/
void InvCipher(byte Ctxt[],byte Ptxt[]) //定义InvCipher函数(AES核心算法)
{
for(int i=0;i<16;i++)
{
state[i]=Ctxt[i];
}
AddRoundKey(state,Nr*Nb);
InvShiftRows(state);
InvSubBytes(state);
for(i=Nr-1;i>0;i--)
{
AddRoundKey(state,i*Nb);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
}
AddRoundKey(state,0);
for(i=0;i<16;i++)
{
Ptxt[i]=state[i];
}
} //定义InvCipher函数结束
/*----------------------------------------------------------------*/
void InvSubBytes(byte state[])
{
for(int i=0;i<16;i++)
{
state[i]=InvSbox[state[i]>>4][state[i]&0x0f];//使用逆S盒
}
}
/*----------------------------------------------------------------*/
void InvShiftRows(byte state[])
{
byte temp[16];
for(int i=0;i<16;i++)
{
temp[i]=state[InvShiftRows_table[i]-1];//使用变换表
}
for(i=0;i<16;i++)
{
state[i]=temp[i];
}
}
/*----------------------------------------------------------------*/
void InvMixColumns(byte state[])
{
byte s[4];
for(int i=0;i<16;i=i+4)
{
s[0]=state[i]; s[1]=state[i+1];
s[2]=state[i+2]; s[3]=state[i+3];
state[i]= Mul0e_table[s[0]]^Mul0b_table[s[1]]^Mul0d_table[s[2]]^Mul09_table[s[3]];
state[i+1]=Mul09_table[s[0]]^Mul0e_table[s[1]]^Mul0b_table[s[2]]^Mul0d_table[s[3]];
state[i+2]=Mul0d_table[s[0]]^Mul09_table[s[1]]^Mul0e_table[s[2]]^Mul0b_table[s[3]];
state[i+3]=Mul0b_table[s[0]]^Mul0d_table[s[1]]^Mul09_table[s[2]]^Mul0e_table[s[3]];
//使用模乘表
}
}
/*----------------------------------------------------------------*/
/* THE END */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -