MD5算法

函数入口参数

void MD5(UC *data)

  输入为一个任意长度的字符串,加密结果是32位的16进制数,如:MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72

算法流程

  1.对于输入的字符串,按位填补一个1以及若干个0使得填补后的位数为 N*512+448(按字节的话就是N*64+56),N>=0

  2.再添加一个64位(8个字节)的数,该数字为原始长度,使得最后的字符串变为(N+1)*512位(既(N+1)*64字节)。 

  3.初始化四个32位的数,A=0x67452301;B=0xefcdab89;C=0x98badcfe;D=0x10325476;

  4.将字符串分成N+1块,每块512位(64个字节),循环N+1次,对于每次循环:

    1)令a=A;b=B;c=C;d=D;

    2)将当前的64个字节转为16个32位的数M[0~15]。

    3)进行64轮操作。

    4)A+=a;B+=b;C+=c;D+=d;

  5.输出ABCD的级联。

完整代码

View Code
#include <stdio.h>
#include <string.h>

#define MAXINLEN 1000
#define PP(x) ((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24))
#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 ROL(x,y) (((x)<<(y))|((x)>>(32-(y))))
#define FF(a,b,c,d,M,s,t) a=b+ROL(a+F(b,c,d)+M+t,s)
#define GG(a,b,c,d,M,s,t) a=b+ROL(a+G(b,c,d)+M+t,s)
#define HH(a,b,c,d,M,s,t) a=b+ROL(a+H(b,c,d)+M+t,s)
#define II(a,b,c,d,M,s,t) a=b+ROL(a+I(b,c,d)+M+t,s)

typedef __int64 LL;
typedef unsigned int UI;
typedef unsigned char UC;

void Fill(UC *data,int add,LL len)
{
    int i;
    LL temp=len<<3;
    if(add)
    {
        data[len++]=(1<<7);
        while(--add)
        {
            data[len++]=0;
        }
    }
    for(i=len; i<len+8; i++)
    {
        data[i]=temp%(1<<8);
        temp/=(1<<8);
    }
    return;
}

void MD5_Trans(UC *data,UI *A,UI *B,UI *C,UI *D)
{
    UI a,b,c,d;
    UI M[16];
    int i;
    a=*A,b=*B,c=*C,d=*D;
    for(i=0; i<16; ++i)
    {
        M[i]=data[(i<<2)]|(data[(i<<2)+1]<<8)|(data[(i<<2)+2]<<16)|(data[(i<<2)+3]<<24);
    }
    FF(a,b,c,d,M[0],7,0xd76aa478);
    FF(d,a,b,c,M[1],12,0xe8c7b756);
    FF(c,d,a,b,M[2],17,0x242070db);
    FF(b,c,d,a,M[3],22,0xc1bdceee);
    FF(a,b,c,d,M[4],7,0xf57c0faf);
    FF(d,a,b,c,M[5],12,0x4787c62a);
    FF(c,d,a,b,M[6],17,0xa8304613);
    FF(b,c,d,a,M[7],22,0xfd469501);
    FF(a,b,c,d,M[8],7,0x698098d8);
    FF(d,a,b,c,M[9],12,0x8b44f7af);
    FF(c,d,a,b,M[10],17,0xffff5bb1);
    FF(b,c,d,a,M[11],22,0x895cd7be);
    FF(a,b,c,d,M[12],7,0x6b901122);
    FF(d,a,b,c,M[13],12,0xfd987193);
    FF(c,d,a,b,M[14],17,0xa679438e);
    FF(b,c,d,a,M[15],22,0x49b40821);
    GG(a,b,c,d,M[1],5,0xf61e2562);
    GG(d,a,b,c,M[6],9,0xc040b340);
    GG(c,d,a,b,M[11],14,0x265e5a51);
    GG(b,c,d,a,M[0],20,0xe9b6c7aa);
    GG(a,b,c,d,M[5],5,0xd62f105d);
    GG(d,a,b,c,M[10],9,0x02441453);
    GG(c,d,a,b,M[15],14,0xd8a1e681);
    GG(b,c,d,a,M[4],20,0xe7d3fbc8);
    GG(a,b,c,d,M[9],5,0x21e1cde6);
    GG(d,a,b,c,M[14],9,0xc33707d6);
    GG(c,d,a,b,M[3],14,0xf4d50d87);
    GG(b,c,d,a,M[8],20,0x455a14ed);
    GG(a,b,c,d,M[13],5,0xa9e3e905);
    GG(d,a,b,c,M[2],9,0xfcefa3f8);
    GG(c,d,a,b,M[7],14,0x676f02d9);
    GG(b,c,d,a,M[12],20,0x8d2a4c8a);
    HH(a,b,c,d,M[5],4,0xfffa3942);
    HH(d,a,b,c,M[8],11,0x8771f681);
    HH(c,d,a,b,M[11],16,0x6d9d6122);
    HH(b,c,d,a,M[14],23,0xfde5380c);
    HH(a,b,c,d,M[1],4,0xa4beea44);
    HH(d,a,b,c,M[4],11,0x4bdecfa9);
    HH(c,d,a,b,M[7],16,0xf6bb4b60);
    HH(b,c,d,a,M[10],23,0xbebfbc70);
    HH(a,b,c,d,M[13],4,0x289b7ec6);
    HH(d,a,b,c,M[0],11,0xeaa127fa);
    HH(c,d,a,b,M[3],16,0xd4ef3085);
    HH(b,c,d,a,M[6],23,0x04881d05);
    HH(a,b,c,d,M[9],4,0xd9d4d039);
    HH(d,a,b,c,M[12],11,0xe6db99e5);
    HH(c,d,a,b,M[15],16,0x1fa27cf8);
    HH(b,c,d,a,M[2],23,0xc4ac5665);
    II(a,b,c,d,M[0],6,0xf4292244);
    II(d,a,b,c,M[7],10,0x432aff97);
    II(c,d,a,b,M[14],15,0xab9423a7);
    II(b,c,d,a,M[5],21,0xfc93a039);
    II(a,b,c,d,M[12],6,0x655b59c3);
    II(d,a,b,c,M[3],10,0x8f0ccc92);
    II(c,d,a,b,M[10],15,0xffeff47d);
    II(b,c,d,a,M[1],21,0x85845dd1);
    II(a,b,c,d,M[8],6,0x6fa87e4f);
    II(d,a,b,c,M[15],10,0xfe2ce6e0);
    II(c,d,a,b,M[6],15,0xa3014314);
    II(b,c,d,a,M[13],21,0x4e0811a1);
    II(a,b,c,d,M[4],6,0xf7537e82);
    II(d,a,b,c,M[11],10,0xbd3af235);
    II(c,d,a,b,M[2],15,0x2ad7d2bb);
    II(b,c,d,a,M[9],21,0xeb86d391);
    *A+=a,*B+=b,*C+=c,*D+=d;
    return;
}

void MD5(UC *data)
{
    int i,addlen;
    UI A,B,C,D;
    LL Len;
    Len=strlen((const char *)data);
    addlen=(64+56-Len%64)%64;
    Fill(data,addlen,Len);
    Len=Len+addlen+8;
    A=0x67452301;
    B=0xefcdab89;
    C=0x98badcfe;
    D=0x10325476;
    for(i=0; i<Len; i+=64)
    {
        MD5_Trans(&data[i],&A,&B,&C,&D);
    }
    printf("%08X %08X %08X %08X\n",PP(A),PP(B),PP(C),PP(D));
    return;
}

int main()
{
    //freopen("IO","r",stdin);
    UC Str[MAXINLEN+64];
    while(gets((char *)Str)!=NULL)
    {
        printf("MD5(\"%s\") = ",Str);
        MD5(Str);
    }
    return 0;
}
/*
IO:

a
abc
message digest
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy cog
*/

    

16color: #000000;

原文地址:https://www.cnblogs.com/NoSoul/p/2756806.html