当前位置:主页 > 澳门威尼斯人网址 >

C语言中关于带密钥的md5算法库md5lib.h的使用说明

文章出处:威尼斯人官网 人气:发表时间:2018-10-11

/* MD5lib.h - md5 library*/
    /*   带密钥的md5算法库md5lib.h共有下列函数:
    char* MDString  (char *);
    输入任意一个字符串,经过md5算法处理后,返回结果:一个定长(32个字符)字符串
    char* MDFile  (char *);
    输入任意一个文件名,文件内容经过md5算法处理后,返回结果:一个定长(32个字符)字符串
    char* hmac_md5(char* text, char* key);
    输入任意一个字符串text,和一个用做密钥的字符串key,经过hmac_md5算法处理,返回处理结果:一个定长字符串(32个字符)
    具体使用方法可参考例子sample.c,其运行结果在本文后面。
    注意在调用时需要添加头文件 #include "md5lib.h"
    */
    #include <stdio.h>
    #include <time.h>
    #include <string.h>
    #define MD 5
    /* GLOBAL.H - RSAREF types and constants
    */
    /* PROTOTYPES should be set to one if and only if the compiler supports
    function argument prototyping.
    The following makes PROTOTYPES default to 0 if it has not already
    been defined with C compiler flags.
    */
    #ifndef PROTOTYPES
    #define PROTOTYPES 0
    #endif
    /* POINTER defines a generic pointer type */
    typedef unsigned char *POINTER;
    /* UINT2 defines a two byte word */
    typedef unsigned short int UINT2;
    /* UINT4 defines a four byte word */
    typedef unsigned long int UINT4;
    /* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
    If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
    returns an empty list.
    */
    #if PROTOTYPES
    #define PROTO_LIST(list) list
    #else
    #define PROTO_LIST(list) ()
    #endif
    /* Length of test block, number of test blocks.
    */
    #define TEST_BLOCK_LEN 1000
    #define TEST_BLOCK_COUNT 1000
    /* 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
    char* MDString PROTO_LIST ((char *));
    char* MDFile PROTO_LIST ((char *));
    char* hmac_md5(char* text, char* key);
    typedef struct {
    UINT4 state[4];                                   /* state (ABCD) */
    UINT4 count[2];        /* number of bits, modulo 2^64 (lsb first) */
    unsigned char buffer[64];                         /* input buffer */
    } 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_CT X *));
    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 and I are basic MD5 functions.
    */
    #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 rotates x left n bits.
    */
    #define ROTATE_LEFT(x, n) (((x) 《 (n)) | ((x) 》 (32-(n))))
    /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
    Rotation is separate from addition to prevent recomputation.
    */
    #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);}
    void MD5Init (MD5_CTX *context);
    void MD5Update(MD5_CTX *context, unsigned char *input,unsigned int inputLen);
    void MD5Final (unsigned char digest[16], MD5_CTX *context);
    static void MD5Transform  (UINT4 [4], unsigned char [64]) ;
    static void Encode(unsigned char *, UINT4 *, unsigned int);
    static void Decode (UINT4 *, unsigned char *, unsigned int);
    static void MD5_memcpy(POINTER, POINTER, unsigned int);
    static void MD5_memset(POINTER, int, unsigned int);
    /* MD5 initialization. Begins an MD5 operation, writing a new context.
    */
    void MD5Init (MD5_CTX *context)
    /* context */
    {
    context->count[0] = context->count[1] = 0;
    /* Load magic initialization constants.
    */
    context->state[0] = 0x67452301;
    context->state[1] = 0xefcdab89;
    context->state[2] = 0x98badcfe;
    context->state[3] = 0x10325476;
    }
    /* MD5 block update operation. Continues an MD5 message-digest
    operation, processing another message block, and updating the
    context.
    */
    void MD5Update (MD5_CTX *context, unsigned char *input,unsigned int inputLen  )
    /* context */
    /* input block */
    /* length of input block */
    {
    unsigned int i, index, partLen;
    /* Compute number of bytes mod 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);
    partLen = 64 - index;
    /* Transform as many times as possible.
    */
    if (inputLen >= partLen) {
    MD5_memcpy
    ((POINTER)&context->buffer[index], (POINTER)input, partLen);
    MD5Transform (context->state, context->buffer);
    for (i = partLen; i + 63 < inputLen; i += 64)
    MD5Transform (context->state, &input[i]);
    index = 0;
    }
    else
    i = 0;
    /* Buffer remaining input */
    MD5_memcpy
    ((POINTER)&context->buffer[index], (POINTER)&input[i],
    inputLen-i);
    }
    /* MD5 finalization. Ends an MD5 message-digest operation, writing the
    the message digest and zeroizing the context.
    */
    void MD5Final (unsigned char digest[16], MD5_CTX *context)
    /* message digest */
    /* context */
    {
    unsigned char bits[8];
    unsigned int index, padLen;
    /* Save number of bits */
    Encode (bits, context->count, 8);
    /* Pad out to 56 mod 64.
    */
    index = (unsigned int)((context->count[0] 》 3) & 0x3f);
    padLen = (index < 56) ? (56 - index) : (120 - index);
    MD5Update (context,(unsigned char*) PADDING, padLen);
    /* Append length (before padding) */
    MD5Update (context, bits, 8);
    /* Store state in digest */
    Encode (digest, context->state, 16);
    /* Zeroize sensitive information.
    */
    MD5_memset ((POINTER)context, 0, sizeof (*context));
    }
    /* MD5 basic transformation. Transforms state based on block.
    */
    static void MD5Transform (UINT4 state[4],
    unsigned char block[64])

返回顶部