📄 aes.cpp
字号:
int i ;
for (i=0;i<16;i++)
sub=InS_BOX[sub];
}
/*
行移位逆变换iShiftRow, 对状态行的循环移位变换。在ShiftRow变换中, 状态的后三行以
不同的移位值循环右移。行0不移位, 行1移3字节,行2移2字节,行3移1字节。
*/
void iShiftRows(){
int temp , temp2 ;
temp=sub[3];
sub[3]=sub[7] , sub[7]=sub[11] , sub[11]=sub[15] , sub[15]=temp;
temp2=2;
while (temp2--){
temp=sub[2];
sub[2]=sub[6] , sub[6]=sub[10] , sub[10]=sub[14] , sub[14]=temp;
}
temp2=3;
while (temp2--){
temp=sub[1];
sub[1]=sub[5] , sub[5]=sub[9] , sub[9]=sub[13] , sub[13]=temp;
}
}
/*
列混淆逆变换iMixColumn
*/
void iMixColumns(){
//查Mix表
for ( int i=0;i<4;i++){
int a , b , c , d;
a=sub[4*i+0];
b=sub[4*i+1];
c=sub[4*i+2];
d=sub[4*i+3];
sub[4*i+0]=Mix[6][a]^Mix[4]^Mix[5][c]^Mix[3][d];
sub[4*i+1]=Mix[3][a]^Mix[6]^Mix[4][c]^Mix[5][d];
sub[4*i+2]=Mix[5][a]^Mix[3]^Mix[6][c]^Mix[4][d];
sub[4*i+3]=Mix[4][a]^Mix[5]^Mix[3][c]^Mix[6][d];
}
}
/********************Rijndael算法**********************/
int j=0;
void Key_Schedule();
void AddRoundKey(){
int i;
for (i=0;i<16;i++)
sub^=key;
Key_Schedule();
}
void Round(){
ByteSub();
ShiftRows();
MixColumns();
AddRoundKey();
}
void FinalRound(){
ByteSub();
ShiftRows();
AddRoundKey();
}
/********************iRijndael算法**********************/
void iKey_Schedule();
int Nr=10;
int ircon=1;
void iAddRoundKey(){
int i;
for(i=0;i<16;i++)
ikey=key;
for(i=0;i<Nr;i++)
iKey_Schedule();
ircon=1;
for (i=0;i<16;i++)
sub^=ikey;
Nr--;
}
void iRound(){
iAddRoundKey();
iMixColumns();
iShiftRows();
iByteSub();
}
void iFinalRound(){
iAddRoundKey();
iShiftRows();
iByteSub();
}
/**********************密钥扩展*************************/
/*
Key Schedule
*/
int rcon=1;
void Key_Schedule(){
int tem[4];
/**//*
取出密钥的最后一列,并移位
*/
tem[0]=S_BOX[key[13]];
tem[1]=S_BOX[key[14]];
tem[2]=S_BOX[key[15]];
tem[3]=S_BOX[key[12]];
key[0]=(key[0]^tem[0]^rcon)%256;
key[1]=key[1]^tem[1]%256;
key[2]=key[2]^tem[2]%256;
key[3]=key[3]^tem[3]%256;
key[4]=key[4]^key[0]%256;
key[5]=key[5]^key[1]%256;
key[6]=key[6]^key[2]%256;
key[7]=key[7]^key[3]%256;
key[8]=key[8]^key[4]%256;
key[9]=key[9]^key[5]%256;
key[10]=key[10]^key[6]%256;
key[11]=key[11]^key[7]%256;
key[12]=key[12]^key[8]%256;
key[13]=key[13]^key[9]%256;
key[14]=key[14]^key[10]%256;
key[15]=key[15]^key[11]%256;
rcon*=2;
if(rcon>=256)
rcon=rcon^283;
}
/**********************逆密钥扩展*************************/
/*
iKey Schedule
*/
void iKey_Schedule(){
int tem[4];
/**//*
取出密钥的最后一列,并移位
*/
tem[0]=S_BOX[ikey[13]];
tem[1]=S_BOX[ikey[14]];
tem[2]=S_BOX[ikey[15]];
tem[3]=S_BOX[ikey[12]];
ikey[0]=(ikey[0]^tem[0]^ircon)%256;
ikey[1]=ikey[1]^tem[1]%256;
ikey[2]=ikey[2]^tem[2]%256;
ikey[3]=ikey[3]^tem[3]%256;
ikey[4]=ikey[4]^ikey[0]%256;
ikey[5]=ikey[5]^ikey[1]%256;
ikey[6]=ikey[6]^ikey[2]%256;
ikey[7]=ikey[7]^ikey[3]%256;
ikey[8]=ikey[8]^ikey[4]%256;
ikey[9]=ikey[9]^ikey[5]%256;
ikey[10]=ikey[10]^ikey[6]%256;
ikey[11]=ikey[11]^ikey[7]%256;
ikey[12]=ikey[12]^ikey[8]%256;
ikey[13]=ikey[13]^ikey[9]%256;
ikey[14]=ikey[14]^ikey[10]%256;
ikey[15]=ikey[15]^ikey[11]%256;
ircon*=2;
if(ircon>=256)
ircon=ircon^283;
}
/***********************加密过程 *************************/
void Encode(){
int i;
//输入要加密的明文
cout<<"输入要加密的明文:"<<endl;
for (i=0;i<16;i++)
scanf("%x",sub+i);
//输入密钥
cout<<"输入密钥:"<<endl;
for (i=0;i<16;i++)
scanf("%x",key+i);
AddRoundKey(); //首先是一个初始密钥加
for (i=0;i<9;i++) //其次是九轮的圈变换
Round();
FinalRound(); //最后一轮圈变换,跟前面的圈变换不同的是,
//最后一轮没有列混淆变换
printf("the cipher is:"); //输出密文
for (i=0;i<16;i++){
if (i%4==0) printf(" ");
printf("%x ", sub);
}
printf(" ");
}
/***********************解密过程 *************************/
void Decode(){
int i;
//输入要解密的明文
cout<<"输入要解密的明文:"<<endl;
for (i=0;i<16;i++)
scanf("%x",sub+i);
//输入密钥
cout<<"输入密钥:"<<endl;
for (i=0;i<16;i++)
scanf("%x",key+i);
iFinalRound(); //逆最后一轮圈变换,跟前面的圈变换不同的是,
//最后一轮没有列混淆变换
for (i=0;i<9;i++) //其次是九轮的圈变换
iRound();
iAddRoundKey(); //一个初始密钥解密
printf("密文是:"); //输出密文
for (i=0;i<16;i++){
if (i%4==0) printf(" ");
printf("%x ", sub);
}
printf(" ");
}
/*******************主函数***********************/
int main(){
int x;
for(;;){
cout<<"1、加密"<<endl;
cout<<"2、解密"<<endl;
cout<<"请选择:"<<endl;
cin>>x;
switch(x){
case 1:Encode();break;
case 2:Decode();break;
case 3:return 0;
default:break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -