免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4035 | 回复: 12
打印 上一主题 下一主题

C语言实现的MD5代码?请诸位大侠教下!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-03 17:30 |只看该作者 |倒序浏览
请教大虾们,在linux下用C语言实现MD5算法,对于大虾们也许是小菜一碟,但第一次接触这算法,还有些不太懂的地方。。。。有没有大侠们有源码之类的,讲解比较清晰的

论坛徽章:
0
2 [报告]
发表于 2011-05-03 18:00 |只看该作者
md5.rar (5.39 KB, 下载次数: 37)

以前在网上搜到的,试试看,行不行

论坛徽章:
0
3 [报告]
发表于 2011-05-03 18:07 |只看该作者
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <memory.h>
const unsigned int s[4][4]={{7,12,17,22},{5,9,14,20},{4,11,16,23},{6,10,15,21}};
const unsigned long t[64]={//t=4294967296*fabs(sin(i+1));
0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,
0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,
0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,
0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
};
const int serial[64]={
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,
5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,
0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9
};
void func(unsigned long& a,
          unsigned long b,
          unsigned long c,
          unsigned long d,
          unsigned long M,
          unsigned long t,
          int s,
          int turn) {
    unsigned long temp;
    switch(turn) {
    case 0:
        temp=(b&c)|((~b)&d);
        break;
    case 1:
        temp=(d&b)|((~d)&c);
        break;
    case 2:
        temp=b^c^d;
        break;
    case 3:
        temp=c^(b|(~d));
        break;
    }
    temp+=M+t+a;
    _asm {
        mov ecx,s
        rol temp,cl
    }
    a=b+temp;
}
void MD512(const unsigned long M[16],unsigned long hash[4]) {
    int i,j,index=0;
    for (i=0;i<4;i++)
        for (j=0;j<4;j++) {
            func(hash[0],hash[1],hash[2],hash[3],M[serial[index]],t[index],s[0],i);
            index++;
            func(hash[3],hash[0],hash[1],hash[2],M[serial[index]],t[index],s[1],i);
            index++;
            func(hash[2],hash[3],hash[0],hash[1],M[serial[index]],t[index],s[2],i);
            index++;
            func(hash[1],hash[2],hash[3],hash[0],M[serial[index]],t[index],s[3],i);
            index++;
        }
}

void MD5(char* M,int nLen,unsigned long output[4]) {
    int i,j;
    unsigned long Hash[4]={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
    unsigned long hash[4];

    //填充
    __int64 BitsLen=nLen*8;
    int oldlen=nLen;
    while(nLen%64!=56) {
        M[nLen++]=0;
    }
    M[oldlen]=0x80u;
    *(__int64*)(M+nLen)=BitsLen;
    nLen+=8;

    //开始处理分组
    for (i=0;i<nLen;i+=64) {
        memcpy(hash,Hash,sizeof(long)*4);
        MD512((const unsigned long*)&M,hash);//处理512bits分组
        for (j=0;j<4;j++)
            Hash[j]+=hash[j];
    }

    //处理输出。
    for (i=0;i<4;i++)
        for (j=3;j>=0;j--) {
            *((char*)(output+i)+j)=*((char*)(Hash+i)+3-j);
        }
}
int main() {
    int i;
    char szMessage[1000]={0};
    printf("input a string:\n>>>";
    scanf("%s",szMessage);
    unsigned long output[4];
    MD5(szMessage,strlen(szMessage),output);
    for (i=0;i<4;i++)
        printf("%08lx",output);
    printf("\n";
    return 0;
}

C语言、嵌入式知识,欢迎交流!

论坛徽章:
0
4 [报告]
发表于 2011-05-03 18:15 |只看该作者
拜谢2、3楼!!!!!谢谢分享!

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
5 [报告]
发表于 2011-05-03 23:35 |只看该作者
3楼带汇编和vc保留字,不可移植

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
6 [报告]
发表于 2011-05-04 07:32 |只看该作者
到sf.net看看。

论坛徽章:
0
7 [报告]
发表于 2011-05-04 08:14 |只看该作者
网上搜一下多的是啊

论坛徽章:
0
8 [报告]
发表于 2011-05-04 08:26 |只看该作者
.....MD5算法的发明者当初在发表 RFC 1321时候,算法就作为附录,代码全部都在论文里了。C语言的。

搜一下,妥妥的

论坛徽章:
0
9 [报告]
发表于 2011-05-04 09:17 |只看该作者
MD5算法在openssl中有的,楼主有兴趣可以去看看,openssl还有很多的算法,如果楼主要学习算法,那个到是很好的资料呀

论坛徽章:
0
10 [报告]
发表于 2011-05-04 09:47 |只看该作者
OK,谢谢诸位大侠!!!都是好人!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP