网页抓取 加密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 

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线