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

📄 aes.cpp

📁 基于WIN32的经典的AES算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	printf("enter your InitialKey: \n");
	scanf("%s",InitialKey);
    KeyExpansion(InitialKey,RoundKey);

	
    int t=0;
	int d=0;
    
	if(mode=='0') //加密模式
    {
	    while((t=fread(Ptxt,1,16,fp_in))==16)  // 判断能否成功读取128bit(一个分组)
		{
			if(d) //判断上一次是否成功读取128bit(一个分组)  
			{
				fwrite(Ctxt,1,16,fp_out);  // 若成功则输出上一次分组的加密结果
			}
            
			Cipher(Ptxt,Ctxt);  // 对当前分组进行加密

			d=1; // 确定成功读取128bit(一个分组)并完成对该分组加密 
		}
	    
		if(d==0)  //未能读取一个分组
		{
			printf("your file need not be encryted.\n");
			fclose(fp_in);
            fclose(fp_out); 
			exit(0); //解密结束
		} 
		
		if(t) //判断是否进行密文挪用
		{
			byte finalch[16];
            for(int j=0;j<t;j++)
			{
				finalch[j]=Ctxt[j];
			}//选择上一个分组的加密结果的头t个字节作为最后一组加密结果

            byte tailtxt[16];
            for(j=t;j<16;j++)
			{
				tailtxt[j]=Ctxt[j];
			}// 选择上一个分组的加密结果的后16-t个字节
 
            for(j=t;j<16;j++)
			{
				Ptxt[j]=tailtxt[j];
			}//tailtxt作为下一个待加密分组的后16-t个字节
             //至此新的一个128bit分组产生
            Cipher(Ptxt,Ctxt);  // 对当前分组进行加密

            fwrite(Ctxt,1,16,fp_out);  //输出当前分组的加密结果

            fwrite(finalch,1,t,fp_out);  //输出最后一组加密结果

		    printf("Encyption is finished.\n");  // 完成加密
		}
	    else  // 确定不进行密文挪用
		{
			fwrite(Ctxt,1,16,fp_out);  //输出当前分组的加密结果 
		    printf("Encyption is finished.\n");  // 完成加密
		}
	    fclose(fp_in);
        fclose(fp_out);  // 关闭文件
	}
    //加密模式结束

    
	if(mode=='1') //解密模式
	{
	    while((t=fread(Ctxt,1,16,fp_in))==16)
		{
			if(d)	
			{
				fwrite(Ptxt,1,16,fp_out);
			}
                
			InvCipher(Ctxt,Ptxt);

			d=1;
			
		}

		if(d==0)
		{
			fclose(fp_in);
            fclose(fp_out); 
			exit(0);
		}

	    if(t)
		{
			char finalch[16];
            for(int j=0;j<t;j++)
			{
				finalch[j]=Ptxt[j];
			}

            char tailtxt[16];
            for(j=t;j<16;j++)
			{
				tailtxt[j]=Ptxt[j];
			}
 
            for(j=t;j<16;j++)
			{
				Ctxt[j]=tailtxt[j];
			}

            InvCipher(Ctxt,Ptxt);

            fwrite(Ptxt,1,16,fp_out);

            fwrite(finalch,1,t,fp_out);
		    
			printf("Decyption is finished.\n");
		}
	    else
		{
			fwrite(Ctxt,1,16,fp_out);
			printf("Decyption is finished.\n");
		}
	    fclose(fp_in);
        fclose(fp_out);  // 关闭文件
	} //解密模式结束
} //主程序结束
/*----------------------------------------------------------------*/ 
void Cipher(byte Ptxt[],byte Ctxt[]) //定义Cipher函数(AES核心算法)
{
    for(int i=0;i<16;i++)
	{
		state[i]=Ptxt[i]; //初始化状态矩阵
	}

	AddRoundKey(state,0);
	for(i=1;i<Nr;i++)
	{
		SubBytes(state);
		ShiftRows(state);
		MixColumns(state);
        AddRoundKey(state,i*Nb);
	}

    SubBytes(state);
    ShiftRows(state);
    AddRoundKey(state,Nr*Nb);

	for(i=0;i<16;i++)
	{
		Ctxt[i]=state[i];  //得到密文
	}
} 
/*----------------------------------------------------------------*/
void KeyExpansion(byte in[], word out[]) //定义密钥扩展函数
{
	word temp;
	byte s[4];

	for(int i=0;i<Nk;i++)
	{
		out[i]=((word)in[4*i]<<24)|((word)in[4*i+1]<<16)|((word)in[4*i+2]<<8)|(word)in[4*i+3];
	} //4个字节组成1个字(32bit)
	
	for(i=Nk;i<Nb*(Nr+1);i++)
	{
		temp=out[i-1];
		
		if(i%Nk==0)
		{   
			RotWord(temp);
			SubWord(temp);
            temp=temp^Rcon[i/Nk-1];
		}
		
		if(Nk==8&&(i%Nk==4))
		{
			SubWord(temp);
		}
		
		out[i]=temp^out[i-Nk];//输出轮密钥
	}
}
/*----------------------------------------------------------------*/
void AddRoundKey(byte state[],int n)
{
	word temp[4];

	temp[0]=((word)state[0]<<24)|((word)state[1]<<16)|((word)state[2]<<8)|(word)state[3];
	temp[1]=((word)state[4]<<24)|((word)state[5]<<16)|((word)state[6]<<8)|(word)state[7];
	temp[2]=((word)state[8]<<24)|((word)state[9]<<16)|((word)state[10]<<8)|(word)state[11];
	temp[3]=((word)state[12]<<24)|((word)state[13]<<16)|((word)state[14]<<8)|(word)state[15];
	//4个字节组成1个字(32bit)
    
	temp[0]=temp[0]^RoundKey[n];
	temp[1]=temp[1]^RoundKey[n+1];
	temp[2]=temp[2]^RoundKey[n+2];
	temp[3]=temp[3]^RoundKey[n+3];

	for(int i=0;i<4;i++)
	{
		state[4*i]=(byte)(temp[i]>>24);
		state[4*i+1]=(byte)(temp[i]>>16);
		state[4*i+2]=(byte)(temp[i]>>8);
		state[4*i+3]=(byte)temp[i];
		//1个字分解成为4个字节
	}
}
/*----------------------------------------------------------------*/
void SubBytes(byte state[])
{
	for(int i=0;i<16;i++)
	{
        state[i]=Sbox[state[i]>>4][state[i]&0x0f];//使用S盒
	}
}
/*----------------------------------------------------------------*/
void ShiftRows(byte state[])
{
    byte temp[16];
	for(int i=0;i<16;i++)
	{
		temp[i]=state[ShiftRows_table[i]-1]; //使用变换表
	}
	for(i=0;i<16;i++)
	{
		state[i]=temp[i];
	}
}
/*----------------------------------------------------------------*/
void MixColumns(byte state[])
{
	byte s[4];
	for(int i=0;i<16;i=i+4)
	{
		s[0]=state[i];   s[1]=state[i+1];
		s[2]=state[i+2];  s[3]=state[i+3];
		
		state[i]=Mul02_table[s[0]]^Mul03_table[s[1]]^s[2]^s[3];
		state[i+1]=s[0]^Mul02_table[s[1]]^Mul03_table[s[2]]^s[3];
		state[i+2]=s[0]^s[1]^Mul02_table[s[2]]^Mul03_table[s[3]];
		state[i+3]=Mul03_table[s[0]]^s[1]^s[2]^Mul02_table[s[3]];
		//使用模乘表
	}
}
/*----------------------------------------------------------------*/
void InvCipher(byte Ctxt[],byte Ptxt[]) //定义InvCipher函数(AES核心算法)
{
	
    for(int i=0;i<16;i++)
	{
		state[i]=Ctxt[i];
	}

	AddRoundKey(state,Nr*Nb);
	InvShiftRows(state);
	InvSubBytes(state);

	for(i=Nr-1;i>0;i--)
	{
		AddRoundKey(state,i*Nb);
		InvMixColumns(state);
		InvShiftRows(state);
		InvSubBytes(state);
	}

	AddRoundKey(state,0);

	for(i=0;i<16;i++)
	{
		Ptxt[i]=state[i];
	}
} //定义InvCipher函数结束
/*----------------------------------------------------------------*/
void InvSubBytes(byte state[])
{
	for(int i=0;i<16;i++)
	{
        state[i]=InvSbox[state[i]>>4][state[i]&0x0f];//使用逆S盒
	}
}
/*----------------------------------------------------------------*/
void InvShiftRows(byte state[])
{
	byte temp[16];
	for(int i=0;i<16;i++)
	{
		temp[i]=state[InvShiftRows_table[i]-1];//使用变换表
	}
	for(i=0;i<16;i++)
	{
		state[i]=temp[i];
	}
}
/*----------------------------------------------------------------*/
void InvMixColumns(byte state[])
{
	byte s[4];
	for(int i=0;i<16;i=i+4)
	{
		s[0]=state[i];   s[1]=state[i+1];
		s[2]=state[i+2];  s[3]=state[i+3];
		
		state[i]=  Mul0e_table[s[0]]^Mul0b_table[s[1]]^Mul0d_table[s[2]]^Mul09_table[s[3]];
		state[i+1]=Mul09_table[s[0]]^Mul0e_table[s[1]]^Mul0b_table[s[2]]^Mul0d_table[s[3]];
		state[i+2]=Mul0d_table[s[0]]^Mul09_table[s[1]]^Mul0e_table[s[2]]^Mul0b_table[s[3]];
		state[i+3]=Mul0b_table[s[0]]^Mul0d_table[s[1]]^Mul09_table[s[2]]^Mul0e_table[s[3]];
		//使用模乘表
	}
}
/*----------------------------------------------------------------*/
/* THE END */

⌨️ 快捷键说明

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