• 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;

  • 相关阅读:
    结对编程收获
    《程序员修炼之道》读书笔记
    《梦断代码》读书笔记
    《编程珠玑》和《梦断代码》(部分) 读书笔记
    团队项目个人心得
    团队项目Alpha阶段心得感悟
    第9周读书笔记
    第8周读书笔记
    结对编程收获
    第七周读书笔记
  • 原文地址:https://www.cnblogs.com/NoSoul/p/2756806.html
Copyright © 2020-2023  润新知