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

📄 aes.cpp

📁 通过这道程序的编写
💻 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 + -