⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes.cpp

📁 C++版AES源代码 我在这里献丑了
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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 + -