网页抓取 加密html(本文详细讲解《C语言实现MD5算法》(组图))
优采云 发布时间: 2022-01-28 21:23网页抓取 加密html(本文详细讲解《C语言实现MD5算法》(组图))
本文详细解释视频如下:
《MD5算法的C语言实现》
一、总结算法
摘要算法也称为哈希算法。
表示任意长度的输入数据和固定长度的输出数据。它的主要特点是加密过程不需要密钥,加密后的数据无法解密。
目前只有CRC32算法可以解密和反转,通过相同的消息摘要算法输入相同的明文数据才能得到相同的密文。
消息摘要算法不存在密钥管理和分发的问题,适用于分布式网络。由于其加密计算的工作量巨大,以往的算法通常只在数据量有限的情况下才用于加密。
消息摘要算法分为三类:
这三类算法的主要作用:验证数据的完整性
二、MD5简介
MD5 是 Message-Digest Algorithm 5(信息摘要算法)。
属于摘要算法,是一个不可逆的过程,即无论数据有多大,经过算法运算后,都会生成固定长度的数据,结果是以十六进制显示的128位二进制字符串. 通常表示为由 32 个十六进制数字组成的字符串。
MD5有什么用?
用于保证完整一致的信息传输。它是计算机广泛使用的散列算法之一(也译作摘要算法、散列算法),MD5一般在主流编程语言中实现。多用于文档验证,用于生成密钥来检测文档是否被篡改。
三、在线MD5加密
MD5加密网上有很多网站,如下:
示例:加密字符串 12334567。
结果如下:
32135A337F8DC8E2BB9A9B80D86BDFD0
四、C语言实现MD5算法
源文件如下:md5.h
#ifndef MD5_H
#define MD5_H
typedef struct
{
unsigned int count[2];
unsigned int state[4];
unsigned char buffer[64];
}MD5_CTX;
#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (y & ~z))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y ^ (x | ~z))
#define ROTATE_LEFT(x,n) ((x (32-n)))
#define FF(a,b,c,d,x,s,ac) \
{ \
a += F(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define GG(a,b,c,d,x,s,ac) \
{ \
a += G(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define HH(a,b,c,d,x,s,ac) \
{ \
a += H(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define II(a,b,c,d,x,s,ac) \
{ \
a += I(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
void MD5Init(MD5_CTX *context);
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
void MD5Final(MD5_CTX *context,unsigned char digest[16]);
void MD5Transform(unsigned int state[4],unsigned char block[64]);
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);
#endif
md5.c
<p>#include
#include "md5.h"
unsigned char PADDING[]={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};
void MD5Init(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;
}
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)
{
unsigned int i = 0,index = 0,partlen = 0;
index = (context->count[0] >> 3) & 0x3F;
partlen = 64 - index;
context->count[0] += inputlen 29;
if(inputlen >= partlen)
{
memcpy(&context->buffer[index],input,partlen);
MD5Transform(context->state,context->buffer);
for(i = partlen;i+64 state,&input[i]);
index = 0;
}
else
{
i = 0;
}
memcpy(&context->buffer[index],&input[i],inputlen-i);
}
void MD5Final(MD5_CTX *context,unsigned char digest[16])
{
unsigned int index = 0,padlen = 0;
unsigned char bits[8];
index = (context->count[0] >> 3) & 0x3F;
padlen = (index count,8);
MD5Update(context,PADDING,padlen);
MD5Update(context,bits,8);
MD5Encode(digest,context->state,16);
}
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)
{
unsigned int i = 0,j = 0;
while(j > 8) & 0xFF;
output[j+2] = (input[i] >> 16) & 0xFF;
output[j+3] = (input[i] >> 24) & 0xFF;
i++;
j+=4;
}
}
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len)
{
unsigned int i = 0,j = 0;
while(j