±¾¸½Â¼°üÀ¨ÒÔÏÂÎļþ£º£¨Õª×ÔRSAREF: A Cryptographic Toolkit for Privacy-Enhanced Mail:£© global.h £ È«¾ÖÍ·Îļþ md5.h -- MD5Í·Îļþ md5c.c -- MD5Ô´´úÂë
£¨ÒªµÃµ½¸ü¶àµÄRSAREFÐÅÏ¢£¬Çë·¢e-maiµ½:
mddriver.c£MD2, MD4 and MD5µÄ²âÊÔÇý¶¯³ÌÐò¡£ Çý¶¯³ÌÐòĬÈÏÇé¿öϱàÒëMD5£¬µ«Èç¹ûÔÚCµÄ±àÒëÃüÁîÐн«MD5²ÎÊýÉè³É2»ò4£¬ÔòÒ²¿ÉÒÔ±àÒë MD2ºÍMD4
´ËÓ¦ÓóÌÐòÊÇ·½±ãʹÓõģ¬¿ÉÓÃÔÚ²»Í¬µÄƽ̨ÉÏ£¬ÔÚÌØÊâµÄƽ̨ÉÏÓÅ»¯ËüÒ²²¢²»À§ÄÑ£¬ÕâÁô¸ø¶Á
Õß×÷ΪÁ·Ï°¡£ÀýÈ磬ÔÚ¡°little-endian¡±Æ½Ì¨ÉÏ£¬´Ëƽ̨32λ×ÖµÄ×îµÍµØÖ·×Ö½Ú×îÎÞÒâÒåµÄ×Ö½Ú£¬
²¢ÇÒûÓжÓÁÐÏÞÖÆ£¬ÔÚMD5±ä»»ÖеĽâÂëµÄÃüÁîµ÷ÓÿÉÒÔ±»ÏàÓ¦µÄÀàÐÍÌæ´ú¡£ A1 global.h
/* GLOBAL.H - RSAREF ÀàÐͺͳ£Êý*/
/* µ±ÇÒ½öµ±±àÒëÆ÷Ö§³Öº¯ÊýÔÐ͵ÄÉùÃ÷ʱ£¬PROTOTYPES±ØÐë±»ÉèÖÃÒ»´Î Èç¹û»¹Ã»Óж¨ÒåC±àÒëÆ÷µÄ±ê¼Ç£¬ÏÂÃæµÄ´úÂëʹPROTOTYPESÖÃΪ0¡£*/ #ifndef PROTOTYPES #define PROTOTYPES 0 #endif
/* POINTER ¶¨Òå³ÉÒ»¸öÆÕͨµÄÖ¸ÕëÀàÐÍ */ typedef unsigned char *POINTER;
/* UINT2 ¶¨Òå³ÉÁ½×Ö½ÚµÄ×Ö */
typedef unsigned short int UINT2;
/* UINT4¶¨Ò»³ÉËÄ×Ö½ÚµÄ×Ö */ typedef unsigned long int UINT4; /* PROTO_LISTµÄ¶¨ÒåÒÀÀµÓÚÉÏÃæPROTOTYPESµÄ¶¨Ò壬Èç¹ûʹÓÃÁËPROTOTYPES£¬ÄÇô
PROTO_LIST·µ»Ø´ËÁÐ±í£¬·ñÔò·µ»ØÒ»¸ö¿ÕÁÐ±í¡£*/ #if PROTOTYPES
#define PROTO_LIST(list) list #else
#define PROTO_LIST(list) () #endif A.2 md5.h
/*MD5.H - MD5C.CÍ·Îļþ*/
/*±¾Èí¼þÔÊÐí±»¸´ÖÆ»òÔËÓ㬵«±ØÐëÔÚËùÓÐÌá¼°ºÍ²Î¿¼µÄµØ·½±ê×¢¡°RSA Data
Security, Inc. MD5 Message-Digest Algorithm¡±£¬Ò²ÔÊÐí²úÉú»òÔËÓÃÅÉÉúÈí¼þ£¬µ«±ØÐëÔÚËùÓÐÌá¼°ºÍ²Î¿¼µÄµØ·½±êÃ÷ ¡°derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm¡± RSAÊý¾Ý°²È«¹«Ë¾£¨RSA Data Security, Inc.£©´ÓÀ´Ã»ÓгöÓÚÈκÎÌØ¶¨Ä¿µÄ³ÂÊö¹ý¹ØÓÚ´Ë
Èí¼þµÄ¿ÉÂòÐÔºÍʵÓÃÐÔ£¬ËüÌṩÁË¡°as is¡±,ûÓбí´ï»ò°µÊ¾¹ýÈκÎÀíÓÉ¡£ ´ËÉùÃ÷±ØÐëÔÚÈκδËÎļþºÍÈí¼þµÄÈκο½±´Öб£Áô¡£*/
/* MD5 context. */ typedef struct {
UINT4 state[4]; /* state (ABCD) */ UINT4 count[2]; /* λÊýÁ¿, Ä£ 2^64 (µÍλÔÚǰ) */
unsigned char buffer[64]; /* ÊäÈ뻺³åÆ÷ */ } MD5_CTX;
void MD5Init PROTO_LIST ((MD5_CTX *)); void MD5Update PROTO_LIST
((MD5_CTX *, unsigned char *, unsigned int));
void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *)); A.3 md5c.c
/* MD5C.C ¨C RSAÊý¾Ý°²È«¹«Ë¾£¬MD5±¨ÎÄÕªÒªËã·¨*/
/*±¾Èí¼þÔÊÐí±»¸´ÖÆ»òÔËÓ㬵«±ØÐëÔÚËùÓÐÌá¼°ºÍ²Î¿¼µÄµØ·½±ê×¢¡°RSA Data Security, Inc. MD5 Message-Digest Algorithm¡±Ò²ÔÊÐí²úÉú»òÔËÓÃÅÉÉúÈí¼þ£¬µ«±ØÐëÔÚËùÓÐÌá¼°ºÍ²Î¿¼µÄµØ·½±êÃ÷
¡°derived from the RSA Data RSAÊý¾Ý°²È«¹«Ë¾£¨RSA Data Security, Inc.£©´ÓÀ´Ã»ÓгöÓÚÈκÎ
ÌØ¶¨Ä¿µÄ³ÂÊö¹ý¹ØÓÚ´ËÈí¼þµÄ¿ÉÂòÐÔºÍʵÓÃÐÔ£¬ËüÌṩÁË¡°as is¡±,ûÓбí´ï»ò°µÊ¾¹ýÈκÎÀíÓÉ¡£
´ËÉùÃ÷±ØÐëÔÚÈκδËÎļþºÍÈí¼þµÄÈκο½±´Öб£Áô¡£*/
#include \#include \
/* Constants for MD5Transform routine. */
#define S11 7 #define S12 12 #define S13 17 #define S14 22
#define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21
static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64])); static void Encode PROTO_LIST
((unsigned char *, UINT4 *, unsigned int)); static void Decode PROTO_LIST
((UINT4 *, unsigned char *, unsigned int));
static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int)); static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
static unsigned char PADDING[64] = {
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 };
/* F, G, H ºÍ I ÊÇ»ù±¾MD5º¯Êý */
#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)))
/* ROTATE_LEFT ½«xÑ»·×óÒÆnλ */
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
/* Ñ»·´Ó¼Ó·¨ÖзÖÀë³öÊÇΪÁË·ÀÖ¹ÖØ¸´¼ÆËã*/ #define FF(a, b, c, d, x, s, ac) { \\
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \\ (a) = ROTATE_LEFT ((a), (s)); \\ (a) += (b); \\ }
#define GG(a, b, c, d, x, s, ac) { \\
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \\
(a) = ROTATE_LEFT ((a), (s)); \\ (a) += (b); \\ }
#define HH(a, b, c, d, x, s, ac) { \\
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \\ (a) = ROTATE_LEFT ((a), (s)); \\ (a) += (b); \\ }
#define II(a, b, c, d, x, s, ac) { \\
(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \\ (a) = ROTATE_LEFT ((a), (s)); \\ (a) += (b); \\ }
/* MD5 ³õʼ»¯. ¿ªÊ¼Ò»¸öMD5²Ù×÷дһ¸öеÄcontext. */ void MD5Init (context)
MD5_CTX *context; /* context */ {
context->count[0] = context->count[1] = 0; context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; }
/*MD5 ·Ö×é¸üвÙ×÷. ¼ÌÐøÒ»¸öMD5²Ù×÷,´¦ÀíÁíÒ»¸öÏûÏ¢·Ö×é²¢¸üÐÂcontext. */
void MD5Update (context, input, inputLen)
MD5_CTX *context; /* context */ unsigned char *input; /* ÊäÈë·Ö×é*/ unsigned int inputLen; /* ÊäÈëµÄ·Ö×éµÄ³¤¶È */ {
unsigned int i, index, partLen;
/* ¼ÆËã×Ö½ÚÊýÄ£64µÄÖµ */
index = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* Update number of bits */
if ((context->count[0] += ((UINT4)inputLen << 3))
< ((UINT4)inputLen << 3)) context->count[1]++;
context->count[1] += ((UINT4)inputLen >> 29);
Ïà¹ØÍÆ¼ö£º