当前位置: 首页 > 科技观察

用C语言实现MD5加密就是这么简单!

时间:2023-03-18 16:38:16 科技观察

1。摘要算法摘要算法也称为散列算法。意思是输入任意长度的数据,输出固定长度的数据。其主要特点是加密过程不需要密钥,加密后的数据无法解密。目前只有CRC32算法可以解密和逆向。只有输入相同的明文数据,通过相同的消息摘要算法,才能得到相同的密文。消息摘要算法不存在密钥管理和分发的问题,适用于分布式网络。由于其加密计算工作量巨大,以往的算法通常只在数据量有限的情况下才用于加密。MessageDigest算法分为三类:MD(MessageDigest):消息摘要SHA(SecureHashAlgorithm):SecureHashMAC(MessageAuthenticationCode):MessageAuthenticationCode这三类算法的主要作用:验证完整性二、MD5简介MD5是Message-DigestAlgorithm5(信息摘要算法)。属于摘要算法,是一个不可逆的过程,即不管数据有多大,经过算法运算后,都会产生固定长度的数据,结果会是一个128位的二进制字符串,以16进制显示.通常表示为一串32个十六进制数。MD5有什么用?用于保证信息传输的完整性和一致性。是计算机广泛使用的哈希算法之一(又译为摘要算法、散列算法),MD5一般在主流编程语言中都有实现。多用于文档校验,生成密钥检测文档是否被篡改。3、在线MD5加密在线进行MD5加密的网站有很多,如下:http://www.metools.info/code/c26.html例子:加密字符串12334567。如图结果为:32135A337F8DC8E2BB9A9B80D86BDFD0四、C语言实现MD5算法源文件如下:md5.h#ifndefMD5_H#defineMD5_Htypedefstruct{unsignedintcount[2];unsignedintstate[4];MDunsignedcharbuffer[64];#unsignedcharbuffer[64];z)((x&y)|(~x&z))#defineG(x,y,z)((x&z)|(y&~z))#defineH(x,y,z)(x^y^z)#defineI(x,y,z)(y^(x|~z))#defineROTATE_LEFT(x,n)((x<>(32-n)))#defineFF(a,b,c,d,x,s,ac)\{\a+=F(b,c,d)+x+ac;\a=ROTATE_LEFT(a,s);\a+=b;\}#defineGG(a,b,c,d,x,s,ac)\{\a+=G(b,c,d)+x+ac;\a=ROTATE_LEFT(a,s);\a+=b;\}#defineHH(a,b,c,d,x,s,ac)\{\a+=H(b,c,d)+x+ac;\a=ROTATE_LEFT(a,s);\a+=b;\}#defineII(a,b,c,d,x,s,ac)\{\a+=I(b,c,d)+x+ac;\a=ROTATE_LEFT(a,s);\a+=b;\}voidMD5Init(MD5_CTX*context);voidMD5Update(MD5_CTX*context,unsignedchar*input,unsignedintinputlen);voidMD5Final(MD5_CTX*context,unsignedchardigest[16]);voidMD5Transform(unsignedintstate[4],unsignedcharblock[64]);voidMD5Encode(unsignedchar*输出,unsignedint*输入,unsignedintlen);voidMD5Decode(unsignedint*输出,无符号char*input,unsignedintlen);#endifmd5.c#include#include"md5.h"unsignedcharPADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};voidMD5Init(MD5_CTX*context){context->count[0]=0;context->count[1]=0;context->state[0]=0x67452301;context->state[1]=0xEFCDAB89;context->state[2]=0x98BADCFE;context->state[3]=0x10325476;}voidMD5Update(MD5_CTX*context,unsignedchar*input,unsignedintinputlen){unsignedinti=0,index=0,partlen=0;index=(context->count[0]>>3)&0x3F;partlen=64-index;context->count[0]+=inputlen<<3;if(context->count[0]<(inputlen<<3))context->count[1]++;context->count[1]+=inputlen>>29;if(inputlen>=partlen){memcpy(&context->buffer[index],input,partlen);MD5Transform(context->state,context->buffer);for(i=partlen;i+64<=inputlen;i+=64)MD5Transform(context->state,&input[i]);index=0;}else{i=0;}memcpy(&context->buffer[index],&input[i],inputlen-i);}voidMD5Final(MD5_CTX*context,unsignedchardigest[16]){unsignedintindex=0,padlen=0;unsignedcharbits[8];index=(context->count[0]>>3)&0x3F;padlen=(index<56)?(56-index):(120-index);MD5Encode(bits,context->count,8);MD5Update(context,PADDING,padlen);MD5Update(context,bits,8);MD5Encode(digest,context->state,16);}voidMD5Encode(unsignedchar*output,unsignedint*input,unsignedintlen){unsignedinti=0,j=0;while(j>8)&0xFF;output[j+2]=(input[i]>>16)&0xFF;output[j+3]=(input[i]>>24)&0xFF;i++;j+=4;}}voidMD5Decode(unsignedint*输出,unsignedchar*input,unsignedintlen){unsignedinti=0,j=0;while(j2#include3#include"md5.h"4#include5#include6#include7#include89voidmain(void)10{11intread_len;12inti;13chartemp[8]={0};14unsignedchardigest[16];//存储结果15charhexbuf[128]="12334567";16unsignedchardecrypt[16]={0};17unsignedchardecrypt32[64]={0};1819MD5_CTXmd5c;2021MD5Init(&md5c);//初始化22read_len=strlen(hexbuf);23MD5Update(&md5c,(unsignedchar*)hexbuf,read_len);2425MD5Final(&md5c,decrypt);26strcpy((char*)decrypt32,"");2728for(i=0;i<16;i++)29{30sprintf(temp,"%02x",decrypt[i]);31strcat((char*)decrypt32,temp);32}33printf("md5:%s\n",decrypt32);3435return;36}执行结果如下:本例中字符串12334567被加密,并且结果和在线加密结果是一致的。实例2文件加密对文件进行加密#include#include#include"md5.h"#include#include#include#include#defineFORWORD_fw"123.c"intcalc_md5(char*filename,char*dest){inti;intfilelen=0;intread_len;chartemp[8]={0};charhexbuf[128]={0};unsignedchardecrypt[16]={0};unsignedchardecrypt32[64]={0};MD5_CTXmd5;charfw_path[128];intfdf;fdf=open(filename,O_RDWR);if(fdf<0){printf("%snotexist\n",FORWORD_fw);return-1;}MD5Init(&md5);while(1){read_len=read(fdf,hexbuf,sizeof(hexbuf));if(read_len<0){close(fdf);return-1;}if(read_len==0){break;}filelen+=read_len;MD5Update(&md5,(unsignedchar*)hexbuf,read_len);}MD5Final(&md5,decrypt);strcpy((char*)decrypt32,"");for(i=0;i<16;i++){sprintf(temp,"%02x",decrypt[i]);strcat((char*)decrypt32,temp);}strcpy(dest,decrypt32);printf("md5:%slen=%d\n",dest,filelen);close(fdf);returnfilelen;}intmain(intargc,char*argv[]){intret;intfilelen;charmd5_str[64]={0};charcmd[256]={0};filelen=calc_md5(FORWORD_fw,md5_str);if(filelen<0){printf("calc_md5fail\n");return-1;}return0;}运行结果:在线验证结果对比:http://www.metools.info/other/o21.htmlResult本文转载自微信公众号《一口Linux》,可通过以下二维码关注和转载本文,请联系一口Linux公众号。