📄 md5hmac.cpp
字号:
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 + -