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

📄 md5hmac.cpp

📁 MD5算法 实现加密解密过程并对正确性设计验证途径。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		inputLen-i); //对于"abc" i=0;
	for(int k=0 ;k<inputLen-i+index;k++)
	{
		//	unsigned int uintTempSwap=ByteSwap(context->state[i]);
		if((k%2==0)) {//printf("\n");
			pstroutput+=sprintf(pstroutput,"\n\t\t\t\t\t");}
		
		unsigned int uintTempSawpLen=sizeof(context->buffer[k]);
		//printf("buffer[%d]:\t",k);
		pstroutput+=sprintf(pstroutput,"buffer[%d]:\t",k);
		OutputBitOfBytes((unsigned char *)(&context->buffer[k]),uintTempSawpLen);
		//	
	}
	//	printf("\n");
	pstroutput+=sprintf(pstroutput,"\n");
} 
//处理最后的一个分组
void MD5Final (unsigned char digest[16],MD5_CTX *context) 

{ 
	unsigned char bits[8]; 
	unsigned int index, padLen; 
	//将64bit 长度位转换成 字节串;
	Encode (bits, context->count, 8); 
	
	index = (unsigned int)((context->count[0] >> 3) & 0x3f); 
	//一个分组填不下,再加一分组
	//index =57;padLen=128-8-57=63
	padLen = (index < 56) ? (56 - index) : (120 - index); 
	//填充长度=64-8-3=53 //8bytes 长度位,3bytes是最后一个分组的长度
	//	printf("padLen:%d\n",padLen);
	pstroutput+=sprintf(pstroutput,"padLen:%d\n",padLen);
	//附加填充位
	MD5Update (context, PADDING, padLen); 
	//附加长度位
	MD5Update (context, bits, 8); 
	//将状态置转为字节型串输出为哈希
	pstroutput+=sprintf(pstroutput,"\n");
	pstroutput+=sprintf(pstroutput,"状态1:\t\t\t\t\t");
	printfaint(context->state[0]);
	pstroutput+=sprintf(pstroutput,"状态2:\t\t\t\t\t");
	printfaint(context->state[1]);
	pstroutput+=sprintf(pstroutput,"状态3:\t\t\t\t\t");
	printfaint(context->state[2]);
	pstroutput+=sprintf(pstroutput,"状态4:\t\t\t\t\t");
	printfaint(context->state[3]);
	
	Encode (digest, context->state, 16); 
	MD5_memset ((POINTER)context, 0, sizeof (*context)); 
}
void ReturnMD5(char * pstr,int nstrlen,unsigned char *pmd5)
{
	unsigned char hashvalue[16];
	unsigned int lenMessage=nstrlen;
	/*	pstroutput+=sprintf(pstroutput,"\nhashed message s is \t%s\n",pstr);	
	
	  pstroutput+=sprintf(pstroutput,"strlen(s):\t%d\n",lenMessage);
	  for (int i=0;i<lenMessage;i++) //二进制格式
	  {
	  if(i%2==0 )	pstroutput+=sprintf(pstroutput,"\n\t\t\t\t\t");
	  
		pstroutput+=sprintf(pstroutput,"pstr[%d]:\t",i);
		OutputBitOfByte(pstr[i]);
		pstroutput+=sprintf(pstroutput,"\t");
		
		  
}*/
	MD5_CTX* pMd5_ctx=new MD5_CTX;
	//初始化MD5环境
	MD5Init(pMd5_ctx);
	//输入Mesage 及其长度。
	//将可哈多哈希的分组做掉
	MD5Update(pMd5_ctx,(unsigned char *)pstr,lenMessage);
	//附加填充位,长度位 再做最后一个分组
	MD5Final(hashvalue,pMd5_ctx);
	
	
	for ( int i=0;i<16;i++) //十六进制格式
	{
		*pmd5=hashvalue[i];pmd5++;
		
	}//左补零输出
	delete pMd5_ctx;
} 
void MD5(char * pstr)
{
	unsigned char hashvalue[16];
	pstroutput+=sprintf(pstroutput,"\nhashed message s is \t%s\n",pstr);	
	unsigned int lenMessage=strlen((const char *)pstr);
	pstroutput+=sprintf(pstroutput,"strlen(s):\t%d\n",lenMessage);
	for (int i=0;i<lenMessage;i++) //二进制格式
	{
		if(i%2==0 )	pstroutput+=sprintf(pstroutput,"\n\t\t\t\t\t");
		
		pstroutput+=sprintf(pstroutput,"pstr[%d]:\t",i);
		OutputBitOfByte(pstr[i]);
		pstroutput+=sprintf(pstroutput,"\t");
		
		
	}
	MD5_CTX* pMd5_ctx=new MD5_CTX;
	//初始化MD5环境
	MD5Init(pMd5_ctx);
	//输入Mesage 及其长度。
	//将可哈多哈希的分组做掉
	MD5Update(pMd5_ctx,(unsigned char *)pstr,lenMessage);
	//附加填充位,长度位 再做最后一个分组
	MD5Final(hashvalue,pMd5_ctx);
	
	//输出HASH值;
	for (i=0;i<16;i++) //二进制格式
	{
		if(i%4==0 )	pstroutput+=sprintf(pstroutput,"\n哈希值组%d:\t\t\t",int(i/4+1));
		
		pstroutput+=sprintf(pstroutput,"\t");
		OutputBitOfByte(hashvalue[i]);
		
		
	}//左补零输出
	for ( i=0;i<16;i++) //十六进制格式
	{
		if(i%4==0 )	pstroutput+=sprintf(pstroutput,"\n哈希值组%d:\t\t\t",int(i/4+1));
		pstroutput+=sprintf(pstroutput,"\t");
		pstroutput+=sprintf(pstroutput,"%02X",hashvalue[i]);
		
	}//左补零输出
	delete pMd5_ctx;
}
//以
void MD5_HMAC( char message[], char strKey[],int OutputMode)
{
	//
	char iPAD[128]={0};
	char oPAD[128]={0};
	for(int i=0;i<64;i++) {iPAD[i]=0x36;oPAD[i]=0x5C;}
	char key[64]={0};
	
	for(i=0;i<strlen(strKey);i++) key[64-strlen(strKey)+i]=strKey[i];
	for(i=0;i<64;i++) {iPAD[i]^=key[i];oPAD[i]^=key[i];}
	
	strcat(iPAD,message);
	char md5[16]={0};
	ReturnMD5(iPAD,64+strlen(message),(unsigned char *)md5);
	strcat(oPAD,md5);
	unsigned char md5MAC[16]={0};
	ReturnMD5(oPAD,64+16,md5MAC);
	if(OutputMode){//输出到文件
		for ( i=0;i<16;i++) //十六进制格式
		{
			if(i%4==0 )	pstroutput+=sprintf(pstroutput,"\nMD5 HMAC值组%d:\t\t\t",int(i/4+1));
			pstroutput+=sprintf(pstroutput,"\t");
			pstroutput+=sprintf(pstroutput,"%02X",md5MAC[i]);
			
		}//左补零输出
	}
	else //输出到屏幕
	{
		for (int  i=0;i<16;i++) //十六进制格式
		{
			if(i%4==0 )	printf("\nMD5 HMAC值组%d:\t\t\t",int(i/4+1));
			printf("\t");
			printf("%02X",md5MAC[i]);
			
		}//左补零输出
	}
}
void DisplayHelpInfo()
{
	//	cout <<"输入c:启动RC4加密!\n";
	//	cout <<"输入r:无种子,演示随机数发生器rand()!\n";
	//	cout <<"输入s:有种子,每次取时间值为种子,演示随机数发生器srand()!\n";
	cout <<"输入f:启动MD5-HMAC功能,结果输出到工程目录\Md5.txt!\n";
	cout <<"输入s:启动MD5-HMAC功能,结果输出到屏幕!\n";
	cout <<"输入h:获得命令帮助!\n";
	cout <<"输入e:退出程序!\n";
	cout <<"请输入指令:";
}
int main(int argc, char* argv[])
{
	char command;
	
	printf("\n");
	DisplayHelpInfo();
loop:
	
	cin >> command;
	switch (command)
	{
	case 'f':
		{
			char message[100]={0};
			char strKey[100]={0};
			cout <<"\n请输入姓名全拉小写作为消息:(<100 chars): ";
			cin >> message;				
			printf("请确认你输入的姓名全拼小写为 :%s\n",message);
			cout <<"\n右6位学号为密钥:(<100 chars): ";
			cin >> strKey;				
			printf("请确认的你的6位学号为 :%s\n",strKey);
			if(strlen(message)>0 && strlen(strKey)>0)
			{
				MD5_HMAC(message,strKey,1);	
				
			}
			
			fstream  filetemp;
			
			char strtempfile[256]={0};
			GetCurrentDirectory(256,strtempfile);
			char strfilename[256]="\\md5.txt";
			strcat(strtempfile,strfilename);		
			filetemp.open(strtempfile,ios::out,filebuf::openprot);
			filetemp.write((unsigned char const *)pstroutput0,pstroutput-pstroutput0);
			filetemp.close();
			DisplayHelpInfo();
			goto loop;
		}		
	case 's':
		{
			char message[100]={0};
			char strKey[100]={0};
			cout <<"\n请输入姓名全拼小写作为消息:(<100 chars): ";
			cin >> message;				
			printf("请确认你输入的姓名全拼小写为 :%s\n",message);
			cout <<"\n右6位学号为密钥:(<100 chars): ";
			cin >> strKey;				
			printf("请确认你的6位学号为 :%s\n",strKey);
			if(strlen(message)>0 && strlen(strKey)>0)
			{
				MD5_HMAC(message,strKey,0);	
				
			}
			
			printf("\n");
			DisplayHelpInfo();
			goto loop;
		}
	case 'e':
		{
			return;
		}
		
	case 'h': ;
		
			  {
				  DisplayHelpInfo();
				  goto loop;
			  }
	default:goto loop;
	}
	return ;
	
	/*	char message[]="abc";
	char strKey[]="123";
	MD5_HMAC(message,strKey,1);		
	fstream  filetemp;
	
	  char strtempfile[256]={0};
	  GetCurrentDirectory(256,strtempfile);
	  char strfilename[256]="\\md5.txt";
	  strcat(strtempfile,strfilename);		
	  filetemp.open(strtempfile,ios::out,filebuf::openprot);
	  filetemp.write((unsigned char const *)pstroutput0,pstroutput-pstroutput0);
	  filetemp.close();
	*/
	
	free(pstroutput0);
	return ;
}

⌨️ 快捷键说明

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