📄 aes.cpp
字号:
#include <iostream.h>
#include <math.h>
int Key[4][44];
int P[4][4];
int RC[45];
int S[16][16]={
99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,
202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,
183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,
4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,
9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,
83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,
208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,
81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,
205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,
96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,
224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,
231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,
186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,
112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,
225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,
140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22
};
int IS[16][16]={
82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,
124,227,57,130,155,47,255,135,52,142,67,68,196,222,233, 203,
84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,
8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,
114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,
108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,
144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,
208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,
58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,
150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,
71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,
252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,
31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,
96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,
160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,
23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125
};
/////////////////多项式的乘法-GF(2^8)/////////////////
int X_P(int a){
if(a<128)a*=2;
else a=(a*2)^27;
return a%256;
}
void Set_Index(int a[],int t){
int i;
a[0]=t;
for(i=1;i<8;i++)a[i]=X_P(a[i-1]);
}
int Mult(int a,int Index_a[],int b){
int N=128;
int ans=0,i=7;
while(b){
if(b/N){
ans^=Index_a[i];
b%=N;
}
N/=2;
i--;
}
return ans;
}
///////////////End////////////////////
void Print(){
int i,j;
char Hex[6]={'A','B','C','D','E','F'};
for(i=0;i<4;i++){
for(j=0;j<4;j++){
int a,b;
a=P[i][j]/16;
b=P[i][j]%16;
if(a<10)cout<<a;
else cout<<Hex[a-10];
if(b<10)cout<<b;
else cout<<Hex[b-10];
cout<<" ";
}
cout<<endl;
}
}
int FindSbox(int n){
int r,c;
c=n%16;
r=n/16;
return S[r][c];
}
void SubByte(){
int i,j,r,c;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
c=P[i][j]%16;
r=P[i][j]/16;
P[i][j]=S[r][c];
}
}
}
void InSubByte(){
int i,j,r,c;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
c=P[i][j]%16;
r=P[i][j]/16;
P[i][j]=IS[r][c];
}
}
}
void ShiftRow(){
int i,j,k,temp;
for(i=1;i<4;i++){
for(j=1;j<=i;j++){//左移次数
temp=P[i][0];
for(k=1;k<4;k++)P[i][k-1]=P[i][k];
P[i][4-1]=temp;
}
}
}
void InShiftRow(){
int i,j,k,temp;
for(i=1;i<4;i++){
for(j=1;j<=i;j++){//右移次数
temp=P[i][4-1];
for(k=4-1;k>0;k--)P[i][k]=P[i][k-1];
P[i][0]=temp;
}
}
}
void MixColum(){//OK!
int temp[4][4];
int a[4]={2,1,1,3},b3,b2,b1,b0;
int InA[4][8];
int i,j;
for(i=0;i<4;i++)Set_Index(InA[i],a[i]);
for(j=0;j<4;j++){
b0=P[0][j]; b1=P[1][j]; b2=P[2][j]; b3=P[3][j];
temp[0][j]=Mult(a[0],InA[0],b0)^Mult(a[3],InA[3],b1)^Mult(a[2],InA[2],b2)^Mult(a[1],InA[1],b3);//'*'操作
temp[1][j]=Mult(a[1],InA[1],b0)^Mult(a[0],InA[0],b1)^Mult(a[3],InA[3],b2)^Mult(a[2],InA[2],b3);
temp[2][j]=Mult(a[2],InA[2],b0)^Mult(a[1],InA[1],b1)^Mult(a[0],InA[0],b2)^Mult(a[3],InA[3],b3);
temp[3][j]=Mult(a[3],InA[3],b0)^Mult(a[2],InA[2],b1)^Mult(a[1],InA[1],b2)^Mult(a[0],InA[0],b3);
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)P[i][j]=temp[i][j];
}
void InMixColum(){
int temp[4][4];
int a[4]={14,9,13,11},b3,b2,b1,b0;
int InA[4][8];
int i,j;
for(i=0;i<4;i++)Set_Index(InA[i],a[i]);
for(j=0;j<4;j++){
b0=P[0][j]; b1=P[1][j]; b2=P[2][j]; b3=P[3][j];
temp[0][j]=Mult(a[0],InA[0],b0)^Mult(a[3],InA[3],b1)^Mult(a[2],InA[2],b2)^Mult(a[1],InA[1],b3);//'*'操作
temp[1][j]=Mult(a[1],InA[1],b0)^Mult(a[0],InA[0],b1)^Mult(a[3],InA[3],b2)^Mult(a[2],InA[2],b3);
temp[2][j]=Mult(a[2],InA[2],b0)^Mult(a[1],InA[1],b1)^Mult(a[0],InA[0],b2)^Mult(a[3],InA[3],b3);
temp[3][j]=Mult(a[3],InA[3],b0)^Mult(a[2],InA[2],b1)^Mult(a[1],InA[1],b2)^Mult(a[0],InA[0],b3);
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)P[i][j]=temp[i][j];
}
void AddRoundKey(int round){
int i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++)
P[i][j]=(P[i][j]^Key[i][round*4+j]);
}
}
///////////////////密钥扩展模块/////////////////////
void InitialRC(){
int i,In2[8];
Set_Index(In2,2);
RC[1]=1;
for(i=2;i<45;i++)RC[i]=Mult(2,In2,RC[i-1]);
}
void InMixColum_Key(int k){
int temp[4][4];
int a[4]={14,9,13,11},b3,b2,b1,b0;
int InA[4][8];
int i,j,l;
for(i=0;i<4;i++)Set_Index(InA[i],a[i]);
for(j=k*4,l=0;j<k*4+4;j++,l++){
b0=Key[0][j]; b1=Key[1][j]; b2=Key[2][j]; b3=Key[3][j];
temp[0][l]=Mult(a[0],InA[0],b0)^Mult(a[3],InA[3],b1)^Mult(a[2],InA[2],b2)^Mult(a[1],InA[1],b3);//'*'操作
temp[1][l]=Mult(a[1],InA[1],b0)^Mult(a[0],InA[0],b1)^Mult(a[3],InA[3],b2)^Mult(a[2],InA[2],b3);
temp[2][l]=Mult(a[2],InA[2],b0)^Mult(a[1],InA[1],b1)^Mult(a[0],InA[0],b2)^Mult(a[3],InA[3],b3);
temp[3][l]=Mult(a[3],InA[3],b0)^Mult(a[2],InA[2],b1)^Mult(a[1],InA[1],b2)^Mult(a[0],InA[0],b3);
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)Key[i][k*4+j]=temp[i][j];
}
void KeyExp(){
int i,j;
InitialRC();
for(i=4;i<4*(10+1);i++){
if(i%4){
for(j=0;j<4;j++)
Key[j][i]=Key[j][i-4]^Key[j][i-1];
}
else{
int temp[4];
for(j=0;j<4;j++)temp[j]=Key[(j+1)%4][i-1];//左移
for(j=0;j<4;j++)temp[j]=FindSbox(temp[j]);
temp[0]^=RC[i/4];
for(j=0;j<4;j++)Key[j][i]=Key[j][i-4]^temp[j];//SubByte
}
}
}
/////////////////////////////////////////////////
void InitialKey(){
int i,j,k,s;
char c;
/*初始化密钥*/
cout<<"Please inPut the original key:\n";
for(i=0;i<4;i++){
for(j=0;j<4;j++){
for(k=0,s=0;k<8;k++){
cin>>c;
s=s*2+c-'0';
}
Key[i][j]=s;
}
}
}
void InitialByte(){
int i,j,k,s;
char c;
/*初始化明文*/
cout<<"Please inPut the Plain text:\n";
for(i=0;i<4;i++){
for(j=0;j<4;j++){
for(k=0,s=0;k<8;k++){
cin>>c;
s=s*2+c-'0';
}
P[i][j]=s;
}
}
}
void AesEncrypt(){
InitialByte();
cout<<"初始明文的十六进制形式为:"<<endl;
Print();
InitialKey();
Print();
KeyExp();
AddRoundKey(0);
for(int i=1;i<10;i++){
SubByte();
ShiftRow();
MixColum();
AddRoundKey(i);
}
SubByte();
ShiftRow();
AddRoundKey(10);
cout<<"加密后的密文为:\n";
Print();
cout<<endl;
}
void AesDecrypt(){
int i;
KeyExp();
for(i=1;i<10;i++)InMixColum_Key(i);
AddRoundKey(10);
for(i=10-1;i>0;i--){
InSubByte();
InShiftRow();
InMixColum();
AddRoundKey(i);
}
InSubByte();
InShiftRow();
AddRoundKey(0);
cout<<"解密后的明文为:\n";
Print();
}
void main(){
while(1){
AesEncrypt();
AesDecrypt();
}
}
/*
B:
10101000010001010010101001001101
01000101011001010100100101001101
10101010001001100010101010011110
00100011001001110010101101001111
K:
00000000000001000000100000001100
00000001000001010000100100001101
00000010000001100000101000001110
00000011000001110000101100001111
Please inPut the Plain text:
10101000010001010010101001001101
01000101011001010100100101001101
10101010001001100010101010011110
00100011001001110010101101001111
初始明文的十六进制形式为:
A8 45 2A 4D
45 65 49 4D
AA 26 2A 9E
23 27 2B 4F
Please inPut the original key:
00000000000001000000100000001100
00000001000001010000100100001101
00000010000001100000101000001110
00000011000001110000101100001111
A8 45 2A 4D
45 65 49 4D
AA 26 2A 9E
23 27 2B 4F
加密后的密文为:
EE ED 44 CE
B6 D0 66 8C
B6 93 58 FE
17 85 24 35
解密后的明文为:
A8 45 2A 4D
45 65 49 4D
AA 26 2A 9E
23 27 2B 4F
Please inPut the Plain text:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -