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

📄 myaes.cpp

📁 AES加密算法, 一个AES的C++语言具体实现.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			state[i][j]=temp[i][j];  		
}

void MixColumns(BYTE state[4][4])                   //伽罗瓦运算{0x53}·{0x02}.... 查表
{
 	int i,j;	
	BYTE temp[4][4];
	for (i=0; i<4; i++)
	{	
		temp[0][i] = GFMul02(state[0][i])^GFMul03(state[1][i])
			^GFMul01(state[2][i])^GFMul01(state[3][i]);
		temp[1][i] = GFMul01(state[0][i])^GFMul02(state[1][i])
			^GFMul03(state[2][i])^GFMul01(state[3][i]);		
		temp[2][i] = GFMul01(state[0][i])^GFMul01(state[1][i])
			^GFMul02(state[2][i])^GFMul03(state[3][i]); 
		temp[3][i] = GFMul03(state[0][i])^GFMul01(state[1][i])
			^GFMul01(state[2][i])^GFMul02(state[3][i]);
	}

	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			state[i][j]=temp[i][j];  			
}

void InvMixColumns(BYTE state[4][4])                       //伽罗瓦运算
{
	int i,j;	
	BYTE temp[4][4];
	for (i=0; i<4; i++)
	{	
		temp[0][i] = GFMul0E(state[0][i])^GFMul0B(state[1][i])
			^GFMul0D(state[2][i])^GFMul09(state[3][i]);
		temp[1][i] = GFMul09(state[0][i])^GFMul0E(state[1][i])
			^GFMul0B(state[2][i])^GFMul0D(state[3][i]);		
		temp[2][i] = GFMul0D(state[0][i])^GFMul09(state[1][i])
			^GFMul0E(state[2][i])^GFMul0B(state[3][i]); 
		temp[3][i] = GFMul0B(state[0][i])^GFMul0D(state[1][i])
			^GFMul09(state[2][i])^GFMul0E(state[3][i]);
	}

	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			state[i][j]=temp[i][j];
}

void Cipher(BYTE state[4][4],BYTE w[4*(Nr+1)][4])           //加密函数
{	
	int i,j,round;
	BYTE wTemp[4][4];
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			wTemp[i][j]=w[i][j];
		
	printf("\nCIPHER (ENCRYPT):");		
	printf("\nround[ 0].input   ");                    //start[0]  = state   state按照列序存储

	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			printf("%02x ",state[j][i]);  
		 			
	printf("\nround[ 0].k_sch   ");                    //key_sch[0]
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			printf("%02x ",w[i][j]);

	AddRoundKey(state,wTemp); 
  		
	for(round=1;round<Nr;round++)                       //round 1 --> Nr-1 
	{
		for(i=0;i<4;i++)
			for(j=0;j<4;j++)		
				wTemp[i][j]=w[i+round*4][j];

		printf("\nround[ %d].start   ",round);          //start[round]
		for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				printf("%02x ",state[j][i]);

		SubBytes(state);                                //SubBytes[round]     

		printf("\nround[ %d].s_box   ",round);         
	    for(i=0;i<4;i++)
			for(j=0;j<4;j++)		
				printf("%02x ",state[j][i]);			

		ShiftRows(state);                               //ShiftRows[round]     

		printf("\nround[ %d].s_row   ",round);         
	    for(i=0;i<4;i++)
			for(j=0;j<4;j++)	
				printf("%02x ",state[j][i]);
					
		MixColumns(state);                              //MixColumns[round]

		printf("\nround[ %d].m_col   ",round);
	    for(i=0;i<4;i++)
			for(j=0;j<4;j++)		
				printf("%02x ",state[j][i]);		
	
		printf("\nround[ %d].k_sch   ",round);          //key_sch[round]
		for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				printf("%02x ",w[i+round*4][j]);

		AddRoundKey(state,wTemp);	
	}
	
	for(i=0;i<4;i++)
		for(j=0;j<4;j++){
			wTemp[i][j]=w[i+Nr*4][j];
		}

	printf("\nround[%d].start   ",Nr);                     //start[Nr]
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			printf("%02x ",state[j][i]);

	SubBytes(state);                                    //SubBytes[Nr]     

	printf("\nround[%d].s_box   ",Nr);
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			printf("%02x ",state[j][i]);	

	ShiftRows(state);                                   //ShiftRows[Nr]   

	printf("\nround[%d].s_row   ",Nr);            
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			printf("%02x ",state[j][i]);

	printf("\nround[%d].k_sch   ",Nr);                     //key_sch[Nr]
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			printf("%02x ",w[i+Nr*4][j]);

	AddRoundKey(state, wTemp);	
	
	printf("\nround[%d].output  ",Nr);                      //output --> result
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			printf("%02x ",state[j][i]);
}

//解密函数
void InvCipher(BYTE state[4][4],BYTE w[4*(Nr+1)][4])  
{
	int i,j,round;	
	BYTE wTemp[4][4];
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			wTemp[i][j]=w[i+4*Nr][j];
	
	printf("\n\nINVERSE CIPHER (DECRYPT):");			
	printf("\nround[ 0].iinput   ");                    //istart[0] = result   result按照列序存储

	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			printf("%02x ",state[j][i]);  
		 			
	printf("\nround[ 0].ik_sch   ");                    //key_sch[Nr]      第Nr组扩展密钥
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			printf("%02x ",w[i+4*Nr][j]);

	AddRoundKey(state, wTemp);
	
	for(round=Nr-1 ;round>0 ;round--)                   //ronud  Nr-1 --> 1 
	{			
		for(i=0;i<4;i++)
			for(j=0;j<4;j++)		
					wTemp[i][j]=w[i+round*4][j];
					
		printf("\nround[ %d].istart   ",Nr-round);      //istart[Nr-round]
		for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				printf("%02x ",state[j][i]);
			
		InvShiftRows(state);                            //InvShiftRows[Nr-round]
		
		printf("\nround[ %d].is_row   ",Nr-round);
	    for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				printf("%02x ",state[j][i]);
				
		InvSubBytes(state);                             //InvSubBytes[Nr-round]
		
		printf("\nround[ %d].is_box   ",Nr-round);
	    for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				printf("%02x ",state[j][i]);
			
		printf("\nround[ %d].ik_sch   ",Nr-round);       //key_sch[round]
	    for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				printf("%02x ",w[i+4*round][j]);
		
		AddRoundKey(state, wTemp);
		
		printf("\nround[ %d].ik_add   ",Nr-round);     
	    for(i=0;i<4;i++)
			for(j=0;j<4;j++)		
				printf("%02x ",state[j][i]);	
		
		InvMixColumns(state);                              //InvMixColumns[Nr-round]
	}

	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			wTemp[i][j]=w[i][j];
		
	InvShiftRows(state);                                   //InvShiftRows[Nr]

	printf("\nround[%d].is_row   ",Nr);            
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			printf("%02x ",state[j][i]);

	InvSubBytes(state);                                    //InvSubBytes[Nr] 

	printf("\nround[%d].is_box   ",Nr);
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			printf("%02x ",state[j][i]);	

    printf("\nround[%d].ik_sch   ",Nr);                       //key_sch[0]
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			printf("%02x ",w[i][j]);

	AddRoundKey(state, wTemp);	
	
	printf("\nround[%d].ioutput  ",Nr);                       //ioutput --> result
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			printf("%02x ",state[j][i]);
}

void strtoHex(char ch[32],BYTE block[16])
{
	int i;	
	for(i=0;i<16;i++)
	{ 
        if((ch[2*i] >= '0' && ch[2*i] <= '9')&&(ch[2*i+1] >= '0' && ch[2*i+1] <= '9'))
            block[i] = ((ch[2*i]-'0') << 4) + ch[2*i+1] - '0';
        else if((ch[2*i] >= 'A' && ch[i] <= 'F')&&(ch[2*i+1] >= 'A' && ch[2*i+1] <= 'F'))
            block[i] = ((ch[2*i]-'A'+10) << 4) + ch[2*i+1] - 'A'+10;
		    else if((ch[2*i] >= 'a' && ch[i] <= 'f')&&(ch[2*i+1] >= 'a' && ch[2*i+1] <= 'f'))
            block[i] = ((ch[2*i]-'a'+10) << 4) + ch[2*i+1] - 'a'+10;
        else                    // error if not hexadecimal
        {
            printf("It must be in hexadecimal notation\n");
            exit(0);
        }	
	}
}

void main()
{ 
 	int i,j;  
    BYTE block[16]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};	
    BYTE key[Nk][4]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f}; //可根据需要填写key,可为16、24、32byte
	BYTE state[4][4];	
	BYTE w[4*(Nr+1)][4];

	printf("/*  AES加密算法 -- key = 128bit */");    //等待用户输入32个字符的数据	
	printf("\nPlease input your data (32 Hex Numbers):\n");
	
	char ch[32];
	for(i=0;i<32;i++)
		scanf("%c",&ch[i]);
	strtoHex(ch,block);			

	printf("\nPLAINTEXT:        ");
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			printf("%02x ",block[4*i+j]);

	printf("\nKEY:              ");
	for(i=0;i<Nk;i++)
		for(j=0;j<4;j++)
			printf("%02x ",key[i][j]);

	printf("\nState Size= %d bits, Key Size= %d bits",4*32,Nk*32);	
	//block--> state
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			state[i][j]=block[4*j+i];            //state按照列序存储,打印的时候按照列序打印

    KeyExpansion(key,w);                    //密钥扩展
			
    Cipher(state, w);                       //加密  
    printf("\n\nEncrypt=          ");
    for(i=0;i<4;i++)
		for(j=0;j<4;j++)		
			printf("%02x ",state[j][i]);	

	InvCipher(state, w);                    //解密
	printf("\n\nDecrypt=           ");
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)	
			printf("%02x ",state[j][i]);
		 
	printf("\n");
}


⌨️ 快捷键说明

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