有人用c语言写过计算md5的么

syj52417 2014-06-16 04:59:27
计算一个字符串的md5和计算一个文件的md5有什么区别?


...全文
95 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_16635639 2014-06-18
  • 打赏
  • 举报
回复
恩恩,好用,好用 你也下吧
707wk 2014-06-16
  • 打赏
  • 举报
回复
百度上有现成的代码
赵4老师 2014-06-16
  • 打赏
  • 举报
回复
仅供参考
#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[i]=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[i][0],i);
            index++;
            func(hash[3],hash[0],hash[1],hash[2],M[serial[index]],t[index],s[i][1],i);
            index++;
            func(hash[2],hash[3],hash[0],hash[1],M[serial[index]],t[index],s[i][2],i);
            index++;
            func(hash[1],hash[2],hash[3],hash[0],M[serial[index]],t[index],s[i][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[i],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[i]);
    printf("\n");
    return 0;
}
MD5的全称是Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输完整一致。在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和c语言源代码在Internet RFC 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IETF提交。   MD5最广泛被用于各种软件的密码认证和钥匙识别上。通俗的讲就是人们讲的序列号,   Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验和将产生MD2冲突。MD2算法的加密后结果是唯一的--即没有重复。   为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。   尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。   一年以后,即1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4稍微慢一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD5完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。   Van oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。   2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。   令世界顶尖密码学家想象不到的是,破解MD5之后,2005年2月,王小云教授又破解了另一国际密码SHA-1。因为SHA-1在美国等国际社会有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。
MD5全称是Message-DigestAlgorithm5(信息-摘要算法)在90年代初由 MITLaboratoryforComputerScience和RSADataSecurityIncRonaldL.Rivest开发出来经MD2、MD3和 MD4发展而来它作用是让大容量信息在用数字签名软件Software签署私人密匙前被"压缩"成种保密格式(就是 把个任意长度字节串变换成定长大整数)不管是MD2、MD4还是MD5它们都需要获得个随机长度信息并产生个 128位信息摘要虽然这些算法结构或多或少有些相似但MD2设计和MD4和MD5完全区别那是MD2是为8位机器 做过设计优化而MD4和MD5却是面向32位电脑这 3个算法描述和C语言源代码在InternetRFCs1321中有详细 描述http://www.ietf.org/rfc/rfc1321.txt)这是份最权威文档由RonaldL.Rivest在1992年8月向IEFT提交   Rivest在1989年开发出MD2算法在这个算法中首先对信息进行数据补位使信息字节长度是16倍数然后以个 16位检验和追加到信息末尾并且根据这个新产生信息计算出散列值后来Rogier和Chauvaud发现如果忽略了检 验和将产生MD2冲突MD2算法加密后结果是唯--既没有重复   为了加强算法安全性Rivest在1990年又开发出MD4算法MD4算法同样需要填补信息以确保信息字节长度 加上448后能被512整除(信息字节长度mod512=448)然后个以64位 2进制表示信息最初长度被添加进来信息 被处理成512位Damg?rd/Merkle迭代结构区块而且每个区块要通过 3个区别步骤处理DenBoer和 Bosselaers以及其他人很快发现了攻击MD4版本中第步和第 3步漏洞Dobbertin向大家演示了如何利用部普通 个人电脑在几分钟内找到MD4完整版本中冲突(这个冲突实际上是种漏洞它将导致对区别内容进行加密却可能得 到相同加密后结果)毫无疑问MD4就此被淘汰掉了   尽管MD4算法在安全上有个这么大漏洞但它对在其后才被开发出来好几种信息安全加密算法出现却有着不 可忽视引导作用除了MD5以外其中比较有名还有SHA-1、RIPE-MD以及HAVAL等   年以后即1991年Rivest开发出技术上更为趋近成熟MD5算法它在MD4基础上增加了"安全-带子"(Safety- Belts)概念虽然MD5比MD4稍微慢些但却更为安全这个算法很明显由 4个和MD4设计有少许区别步骤组成在 MD5算法中信息-摘要大小和填充必要条件和MD4完全相同DenBoer和Bosselaers曾发现MD5算法中假冲突 (Pseudo-Collisions)但除此的外就没有其他被发现加密后结果了   VanOorschot和Wiener曾经考虑过个在散列中暴力搜寻冲突(Brute-ForceHashFunction)而且他们猜测个 被设计专门用来搜索MD5冲突机器(这台机器在1994年制造成本大约是百万美元)可以平均每24天就找到个冲突 但单从1991年到2001年这10年间竟没有出现替代MD5算法MD6或被叫做其他什么名字新算法这点我们就可以 看出这个瑕疵并没有太多影响MD5安全性上面所有这些都不足以成为MD5在实际应用中问题并且由于MD5算 法使用不需要支付任何版权费用所以在般情况下(非绝密应用领域但即便是应用在绝密领域内MD5也不失为种非 常优秀中间技术)MD5如何都应该算得上是非常安全了
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和C语言源代码在Internet RFCs 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IEFT提交。   Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验和将产生MD2冲突。MD2算法的加密后结果是唯一的--既没有重复。   为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位Damg?rd/Merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den Boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。   尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了MD5以外,其中比较有名的还有SHA-1、RIPE-MD以及HAVAL等。   一年以后,即1991年,Rivest开发出技术上更为趋近成熟的MD5算法。它在MD4的基础上增加了"安全-带子"(Safety-Belts)的概念。虽然MD5比MD4稍微慢一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den Boer和Bosselaers曾发现MD5算法中的假冲突(Pseudo-Collisions),但除此之外就没有其他被发现的加密后结果了。   Van Oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(Brute-Force Hash Function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧