游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1569|回复: 3

我想问几个关于MD5加密的问题

[复制链接]

62

主题

296

帖子

302

积分

中级会员

Rank: 3Rank: 3

积分
302
QQ
发表于 2004-11-15 20:13:00 | 显示全部楼层 |阅读模式
实在看不懂标准上那串长长的C程序,所以只能在这里问了

1、两个DWORD相加的话,如果超过DWORD的最大值0xFFFF FFFF,要做什么处理么?RFC上好象就是简单的用+表示,是不是只要按C/C++默认的就行了?
2、关于补位之后最后加一个64位的“长度”信息,单位是字节还是字?
3、将最后a,b,c,d输出是什么顺序?就像这样 printf("%x%x%x%x", a, b, c, d)还是要做高低位的对调?

郁闷了好久了,就是得不到标准的答案!

0

主题

72

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2004-11-15 21:57:00 | 显示全部楼层

Re: 我想问几个关于MD5加密的问题

你把源码贴上来,再看看

15

主题

1268

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2004-11-15 22:49:00 | 显示全部楼层

Re:我想问几个关于MD5加密的问题

大家试试idea 据说还没有被破解过
下载pgp的代码,里面有

62

主题

296

帖子

302

积分

中级会员

Rank: 3Rank: 3

积分
302
QQ
 楼主| 发表于 2004-11-19 17:35:00 | 显示全部楼层

Re:我想问几个关于MD5加密的问题

//函数定义
#define df(x, y, z) (((x)&(y))|((~(x))&(z)))
#define dg(x, y, z) (((x)&(z))|((y)&(~(z))))
#define dh(x, y, z) ((x)^(y)^(z))
#define di(x, y, z) ((y)^((x)|(~(z))))

DWORD RotateLeft(DWORD x, CHAR o)
{
        return ((x << o) | (x >> (32 - o)));
}

void ff(DWORD &a, DWORD b, DWORD c, DWORD d, DWORD m, CHAR o, DWORD t)
{
        a += df(b, c, d) + m + t;
        a = RotateLeft(a, o);
        a += b;
}

void gg(DWORD &a, DWORD b, DWORD c, DWORD d, DWORD m, CHAR o, DWORD t)
{
        a += dg(b, c, d) + m + t;
        a = RotateLeft(a, o);
        a += b;
}

void hh(DWORD &a, DWORD b, DWORD c, DWORD d, DWORD m, CHAR o, DWORD t)
{
        a += dh(b, c, d) + m + t;
        a = RotateLeft(a, o);
        a += b;
}

void ii(DWORD &a, DWORD b, DWORD c, DWORD d, DWORD m, CHAR o, DWORD t)
{
        a += di(b, c, d) + m + t;
        a = RotateLeft(a, o);
        a += b;
}

//主程序
        DWORD i, j;
        BYTE *Data;
        DWORD oLen, nLen;
        DWORD m[16];

        UpdateData();
        oLen = m_Source.GetLength();
        nLen = ((oLen + 8) / 64 + 1) * 64;

        Data = new BYTE[nLen];
        LPTSTR s = m_Source.GetBuffer(oLen);
        memcpy(Data, s, oLen);
        s = NULL;
        m_Source.ReleaseBuffer();
        for (i = oLen; i < nLen - 8; i++)
                Data = 0;
        if (oLen != nLen - 8)
                Data[oLen] = 128;
        ULONGLONG l = oLen;
        Data[nLen - 1] = (BYTE)(l & 0xFF);
        Data[nLen - 2] = (BYTE)((l >> 8) & 0xFF);
        Data[nLen - 3] = (BYTE)((l >> 16) & 0xFF);
        Data[nLen - 4] = (BYTE)((l >> 24) & 0xFF);
        Data[nLen - 5] = (BYTE)((l >> 32) & 0xFF);
        Data[nLen - 6] = (BYTE)((l >> 40) & 0xFF);
        Data[nLen - 7] = (BYTE)((l >> 48) & 0xFF);
        Data[nLen - 8] = (BYTE)((l >> 56) & 0xFF);

        DWORD bA = 0x67452301;
        DWORD bB = 0xefcdab89;
        DWORD bC = 0x98badcfe;
        DWORD bD = 0x10325476;
        DWORD a, b, c, d;

        for (i = 0; i < nLen / 64; i++)
        {
                a = bA; b = bB; c = bC; d = bD;
                for (j = 0; j < 16; j++)
                {
                        m[j] = (Data[i * 64 + j * 4] << 24) + (Data[i * 64 + j * 4 + 1] << 16)
                                + (Data[i * 64 + j * 4 + 2] << 8) + Data[i * 64 + j * 4 + 3];
                }

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

                bA += a; bB += b; bC += c; bD += d;
        }

        delete [] Data;

        m_Dest.Format("%x%x%x%x", bA, bB, bC, bD);
        UpdateData(FALSE);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 09:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表