快速业务通道

MD5应用的一点理解及Linux实现源码

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-05

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),相关的标准是RFC1321,MD5的算法描述可以查看这份RFC或者自己google,这里就不提这些概念性的问题了.

需要说明的是MD5加密是单向不可逆的,也就是说没有办法把已经加密的密文还原为明文.最常见的应用在于用户名密码在数据库中的保存,一般的做法是将密码用MD5加密后将密文存入数据库,用户登陆时再将用户输入的明文密码做MD5运算后与数据库进行密文比照,密文比照不符则证明密码输入错误了.如果密码丢失了就只能重置,没有人会知道数据库中保存的密文所对应的明文.网上有看到说破解,这个不想做过多研究,仅凭一点经验理解,基本知道只要明文设置的复杂一些,解密几乎是不可能的事情.

最近在做UDP传输过程中的MD5校验,即是将所传输的数据(大约10KB的字串)进行MD5运算,然后把10KB的数据和32位长的MD5值一并发向客户端,客户端收到后再对所收到的10KB字串做MD5运算,与传输过来的MD5值比对,就可知道收到的数据是否有误需要丢弃或通知重传了.或许传输过来的MD5也会有误,不知道这样的问题IETF是怎么考虑的,知道的麻烦告知.

以下是自己整理的一份对字符串MD5加密的源码,留备记录.

md5.h


#ifndef MD5_H

#define MD5_H



#ifdef __alpha

typedef unsigned int uint32;

#else

typedef unsigned long uint32;

#endif



struct MD5Context {

	uint32 buf[4];

	uint32 bits[2];

	unsigned char in[64];

};



void MD5Init(struct MD5Context *context);

void MD5Update(struct MD5Context *context, unsigned char const *buf,

	       unsigned len);

void MD5Final(unsigned char digest[16], struct MD5Context *context);

void MD5Transform(uint32 buf[4], uint32 const in[16]);



/*

 * This is needed to make RSAREF happy on some MS-DOS compilers.

 */

typedef struct MD5Context MD5_CTX;



#endif /* !MD5_H */

md5.c


/*

 * This code implements the MD5 message-digest algorithm.

 * The algorithm is due to Ron Rivest.  This code was

 * written by Colin Plumb in 1993, no copyright is claimed.

 * This code is in the public domain; do with it what you wish.

 *

 * Equivalent code is available from RSA Data Security, Inc.

 * This code has been tested against that, and is equivalent,

 * except that you don''t need to include two pages of legalese

 * with every copy.

 *

 * To compute the message digest of a chunk of bytes, declare an

 * MD5Context structure, pass it to MD5Init, call MD5Update as

 * needed on buffers full of bytes, and then call MD5Final, which

 * will fill a supplied 16-byte array with the digest.

 */

#include 		/* for memcpy() */

#include "md5.h"



#ifndef HIGHFIRST

#define byteReverse(buf, len)	/* Nothing */

#else

void byteReverse(unsigned char *buf, unsigned longs);



#ifndef ASM_MD5

/*

 * Note: this code is harmless on little-endian machines.

 */

void byteReverse(unsigned char *buf, unsigned longs)

{

    uint32 t;

    do {

	t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |

	    ((unsigned) buf[1] << 8 | buf[0]);

	*(uint32 *) buf = t;

	buf  = 4;

    } while (--longs);

}

#endif

#endif



/*

 * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious

 * initialization constants.

 */

void MD5Init(struct MD5Conte

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号