aes.cpp

来自「信息安全相关」· C++ 代码 · 共 170 行

CPP
170
字号
#include<iostream>
using namespace std;
	 int Sbox[256]={  
			    0x63 ,0x7c ,0x77 ,0x7b ,0xf2 ,0x6b ,0x6f ,0xc5 ,0x30 ,0x01 ,0x67 ,0x2b ,0xfe ,0xd7 ,0xab ,0x76 ,
				0xca ,0x82 ,0xc9 ,0x7d ,0xfa ,0x59 ,0x47 ,0xf0 ,0xad ,0xd4 ,0xa2 ,0xaf ,0x9c ,0xa4 ,0x72 ,0xc0,
				0xb7 ,0xfd ,0x93 ,0x26 ,0x36 ,0x3f ,0xf7 ,0xcc ,0x34 ,0xa5 ,0xe5 ,0xf1 ,0x71 ,0xd8 ,0x31 ,0x15 ,
				0x04 ,0xc7 ,0x23 ,0xc3 ,0x18 ,0x96 ,0x05 ,0x9a ,0x07 ,0x12 ,0x80 ,0xe2 ,0xed ,0x27 ,0xb2 ,0x75 ,
				0x09 ,0x83 ,0x2c ,0x1a ,0x1b ,0x6e ,0x5a ,0xa0 ,0x52 ,0x3b ,0xd6 ,0xb3 ,0x29 ,0xe3 ,0x2f ,0x84 ,
				0x53 ,0xd1 ,0x00 ,0xed ,0x20 ,0xfc ,0xb1 ,0x5b ,0x6a ,0xcb ,0xbe ,0x39 ,0x4a ,0x4c ,0x58 ,0xcf ,
				0xd0 ,0xef ,0xaa ,0xfb ,0x43 ,0x4d ,0x33 ,0x85 ,0x45 ,0xf9 ,0x02 ,0x7f ,0x50 ,0x3c ,0x9f ,0xa8 ,
				0x51 ,0xa3 ,0x40 ,0x8f ,0x92 ,0x9d ,0x38 ,0xf5 ,0xbc ,0xb6 ,0xda ,0x21 ,0x10 ,0xff ,0xf3 ,0xd2 ,
				0xcd ,0x0c ,0x13 ,0xec ,0x5f ,0x97 ,0x44 ,0x17 ,0xc4 ,0xa7 ,0x7e ,0x3d ,0x64 ,0x5d ,0x19 ,0x73 ,
				0x60 ,0x81 ,0x4f ,0xdc ,0x22 ,0x2a ,0x90 ,0x88 ,0x46 ,0xee ,0xb8 ,0x14 ,0xde ,0x5e ,0x0b ,0xdb ,
				0xe0 ,0x32 ,0x3a ,0x0a ,0x49 ,0x06 ,0x24 ,0x5c ,0xc2 ,0xd3 ,0xac ,0x62 ,0x91 ,0x95 ,0xe4 ,0x79 ,
				0xe7 ,0xc8 ,0x37 ,0x6d ,0x8d ,0xd5 ,0x4e ,0xa9 ,0x6c ,0x56 ,0xf4 ,0xea ,0x65 ,0x7a ,0xae ,0x08 ,
				0xba ,0x78 ,0x25 ,0x2e ,0x1c ,0xa6 ,0xb4 ,0xc6 ,0xe8 ,0xdd ,0x74 ,0x1f ,0x4b ,0xbd ,0x8b ,0x8a ,
				0x70 ,0x3e ,0xb5 ,0x66 ,0x48 ,0x03 ,0xf6 ,0x0e ,0x61 ,0x35 ,0x57 ,0xb9 ,0x86 ,0xc1 ,0x1d ,0x9e ,
				0xe1 ,0xf8 ,0x98 ,0x11 ,0x69 ,0xd9 ,0x8e ,0x94 ,0x9b ,0x1e ,0x87 ,0xe9 ,0xce ,0x55 ,0x28 ,0xdf ,
				0x8c ,0xa1 ,0x89 ,0x0d ,0xbf ,0xe6 ,0x42 ,0x68 ,0x41 ,0x99 ,0x2d ,0x0f ,0xb0 ,0x54 ,0xbb ,0x16 ,
	};
	int input[4][4]={ {0x32,0x88,0x31,0xe0},
	                       {0x43,0x5a,0x31,0x37},
					       {0xf6,0x30,0x98,0x07},
					       {0xa8,0x8d,0xa2,0x34}
	};
	int subkey[4][4]={ {0x2b,0x28,0xab,0x09},
	                   {0x7e,0xae,0xf7,0xcf},
					   {0x15,0xd2,0x15,0x4f},
					   {0x16,0xa6,0x88,0x3c}
	};
	int shifcl[4][4]={
		{0x02,0x03,0x01,0x01},{ 0x01,0x02,0x03,0x01},
		{0x01,0x01,0x02,0x03},{0x03,0x01,0x01,0x02}
	};

	
	void Keyadd(int ip[4][4],int sk[4][4])
	{
		int i,j;
	    for(i=0;i<=3;i++)
			for(j=0;j<=3;j++)
			{
				ip[i][j]=ip[i][j]^sk[i][j];
			}
	}
	    
	void Substitution(int ip[4][4])
	{
		int i,j;
	    for(i=0;i<=3;i++)
			for(j=0;j<=3;j++)
			{
					ip[i][j]=Sbox[ip[i][j]];
			}
	}
	void Shiftrow(int ip[4][4])
	{
		int i,j;
		for(i=0;i<4;i++)
			  for(j=0;j<4;j++)
			  {
					  ip[i][j]=ip[i][(j+i)%4];
			  }
	}
	int xtime(int num){
		int result;
			if(num<0x80)
					result=(num<<1);
			else
					result=(0x1b^(num<<1))-0x100;
			return result;
	}
	int Mix(int m,int num)
{
		if(m==0x01)
			return num;
		else if(m==0x02)
		    xtime(num);
		else if(m==0x03)
		    return num=xtime(num)^num;
		else return 0;
			
}	
void Mixcolumn(int ip[4][4])
{
	int i,j;
	int n;
	for(i=0;i<=3;i++)
		for(j=0;j<=3;j++)
			for(n=0;n<=3;n++)
				ip[i][j]=ip[i][j]^Mix(shifcl[i][n],ip[n][j]);	
}

void OccurKey(int w[4][44])
{   
	int i,j;
	for(j=4;j<44;j++)
	{
			if(j%4!=0)
			{
				for(i=0;i<=3;i++)		
				    w[i][j]=w[i][j-4]^w[i][j-1];
			}
			else
			{
				int a[4]={w[1][j-1],w[2][j-1],w[3][j-1],w[0][j-1]};
				for(i=0;i<=3;i++)
					a[i]=Sbox[a[i]];
				int Rcon[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};
				a[0]^=Rcon[(j-4)/4];
				for(i=0;i<=3;i++)
					w[i][j]=w[i][j-4]^a[i];
			}
	}
}
	void main()
	{
	/*	int output[4][4];
		Keyadd(input,subkey);
        Substitution(input);
		 Shiftrow(input);
		 Mixcolumn(input);
         for(i=0;i<=3;i++)
	{
		for(j=0;j<=3;j++)
		{
            output[i][j]=input[i][j];
			cout<<hex<<output[i][j]<<'\t';
		}
		cout<<endl;*/
         int m,n;
		int i,j;
		int key[4][44];
		int output[4][4];
		for(i=0;i<=3;i++)
			for(j=0;j<=3;j++)
                key[i][j]=subkey[i][j];
		OccurKey(key);
		Keyadd(input,subkey);
		for(i=1;i<=9;i++)
		{
        Substitution(input);
		Shiftrow(input);
        Mixcolumn(input);
        int Roundkey_i[4][4];
         for(m=0;m<=3;m++)
		    for(n=0;n<=3;n++)
			   Roundkey_i[m][n]=key[m][n+4*i];
		 Keyadd(input,Roundkey_i);
		}
    Substitution(input);
	Shiftrow(input);
	int Roundkey_Last[4][4];
         for(m=0;m<=3;m++)
		    for(n=0;n<=3;n++)
               Roundkey_Last[m][n]=key[m][n+40];
    Keyadd(input,Roundkey_Last);
    for(i=0;i<=3;i++)
	{
		for(j=0;j<=3;j++)
		{
            output[i][j]=input[i][j];
			cout<<hex<<output[i][j]<<'\t';
		}
		cout<<endl;
	}
	}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?