【转】根据王小云教授的算法写的MD5碰撞的程序[c源代码]
2014-01-13 09:55
483 查看
转:/article/8403997.html
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法5),是一种用于产生数字签名的单项散列算法,在1991年由MIT Laboratory for Computer Science(IT计算机科学实验室)和RSA Data Security Inc(RSA数据安全公司)的Ronald L. Rivest教授开发出来。
MD5算法可以将一个任意长度的“字节串”通过一个不可逆的变换算法变换成一个128bit的大整数,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数理论上说,是因为原始的字符串有无穷多个,而128bit的整数只有2的128次方,明显的多对一关系。为什么说理论上呢?就是说当这种摘要算法被完全攻破时,也就是说可以从签名恢复出任意原文,注意:是任意原文,因为所有的摘要算法的特点就是存在着一个无穷大的碰撞原文的集合。而真正的原文只是其中一份。对应这个无穷大的集合来说,这就是一个无穷小,解释得具体一点是这样:假设原文含有信息量(I),而签名的长度有限(如MD5的128位),则它的信息量只有(i),因为通常
i < I (除非原文非常短),所以可以这么说:I=i+i'。因为I没有限制,而i有限制,则 i' 也是一个没有限制的量。当进行摘要算法后,i' 信息就丢失了。反过来,如果现在这种摘要算法被攻破了,可以从 i 反推回去,但因为 i' 信息已经丢失,意味着 i + I' (其中 I' 为任意信息)都可能是 I (碰撞)。但 I' 是一个无穷集合,并且 i' 属于 I'。这说明:理论上可以从 I' 中找到 i' 从而恢复出原文 I ,但是可能性为零(1/∞=0)。
这里多次提到了碰撞,那么什么是碰撞呢,根据密码学的定义,如果内容不同的明文,通过散列算法得出的结果(密码学称为信息摘要)相同,就称为发生了“碰撞”。散列算法的用途不是对明文加密,让别人看不懂,而是通过对信息摘要的比对,判断原文是否被篡改。所以说对摘要算法来说,它只要能找到碰撞就足以让它失效,并不需要找到原文。具一个例子, Linux的用户安全机制,只要得到用户密码文件(其中记录了密码的MD5),然后随便生成一个碰撞的原文(不一定要跟原密码相同),就可以用这个密码登录了。
关于MD5算法的破解,一些黑客破获密码的方法是一种被称为“跑字典”的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。即使假设密码的最大长度为8,同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P (62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘组,而且这种方法还有一个前提,就是能获得目标账户的
密码MD5值的情况下才可以。在2004年8月17日的美国加州圣巴巴拉召开的国际密码学会议(Crypto’2004)上来自山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告。MD5和SHA-1属于散列算法,从设计原理来讲,就有产生碰撞的可能,王小云教授的方法缩短了找到碰撞的时间,是一项重要的成果。但她找到的是强无碰撞,要能找到弱无碰撞,才算真正破解,才有实际意义。(碰撞分为‘强无碰撞’和‘弱无碰撞’。强无碰撞是无法产生有实际意义的原文的,也就无法篡改和伪造出有意义的明文。”通过强无碰撞伪造一个谁也看不懂的东西,没有实际意义。),
国际密码学专家沙米尔(Shamir)在“RSA 2005”年会上就王小云教授找到一对强无碰撞发表观点:“这是个重要的事情,但不意味着密码被破解。”, 找到一对强无碰撞和找到有实际意义的碰撞,是有本质区别的。会议上王小去教授公布MD5已被破解的说法显然不确切。在‘RSA 2005’年会上,专家们认为SHA-1目前绝对安全,再使用5~10年没问题,计划在2010年以后考虑更换。”
我们知道理论上破解密码的方法,如果要在现实中实现,需要通过超级计算机海量的计算,所需时间一般是成千上万年。在实际应用中,破解时间太长意味着破解将失去现实意义。
中国金融认证中心(CFCA)的技术顾问、原中国建设银行科技部总工程师,曾参加《电子签名法》制定的关振胜介绍:“目前网上银行的认证采用多次散列 算法的加密手段。如B to B的交易,首先对网上银行的表单进行SHA-1的摘要计算;然后对客户填写的信息再计算;最后银行收到信息后还要进行签名。如果要篡改其中的信息,必须破 解3次(前提是能破解,现在还做不到),既使是你若干天或若干月后破解了,交易早已完成。同时,信息摘要的传输还要在PKI体系(公钥基础设施)下进行, PKI体系现在大多应用RSA算法,该算法的安全性大可放心。所以,对于银行这样的实时系统,篡改信息影响交易过程是绝对不可能的。”
如果集中所有的军用超级计算机来破解怎么办?哪我们想想,穷全美国之力,破解你一笔商业交易干什么。像散列算法这么弱的算法,政府部门是根本不会采用的。
另外,关总还介绍说:“伪造数字证书也是不可能的。数字证书包含了很多特定内容,只有具备了包括序列号等一系列特定信息,这个证书才有意义。根据特定的原文内容,伪造出相应的摘要信息是根本做不到的。”
我们看到,如果找不到弱无碰撞,或即使找到弱无碰撞但找不到超大型计算机,想干点篡改和伪造的勾当是不可能的。况且,当管理部门一旦发现算法的安全性可能出现风险,换一个新的算法不存在难度。
从事计算机安全的厂商,对所谓密码破解均不以为然。他们认为,任何产品都有生命周期,产品技术的改进工作时刻都在进行。虽然有人说密码算法不安全,但现在没有任何实质的危害发生。信息安全有多种防范措施保证,散列算法只是其中较弱的一种,不必过分担心。
魔高一尺,道高一丈。随着技术的发展,任何手段都不可能永远不变。当今世界是安全的,大可不必为了密码寝食难安。
产生了碰撞,就带来了问题。王小云等人发现了当前所用的散列算法存在的问题,必将帮助未来的新的散列算法设计者考虑到这方面的问题,使得新的散列算法 具有更好的安全性。比如DES开始不安全以后,更多更强的加密手段也一一涌现。不管破解的结果如何,王小云教授的成果足以让我们振奋,对商用密码的研究起 了促进作用。
========================================================
【转】根据王小云教授的算法写的MD5碰撞的程序[c源代码]
ps.以下代码是根据王小云教授的如何生成md5碰撞的算法论文http://www.infosec.sdu.edu.cn/paper/md5-attack.pdf
写的,不过作者似乎是老外
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法5),是一种用于产生数字签名的单项散列算法,在1991年由MIT Laboratory for Computer Science(IT计算机科学实验室)和RSA Data Security Inc(RSA数据安全公司)的Ronald L. Rivest教授开发出来。
MD5算法可以将一个任意长度的“字节串”通过一个不可逆的变换算法变换成一个128bit的大整数,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数理论上说,是因为原始的字符串有无穷多个,而128bit的整数只有2的128次方,明显的多对一关系。为什么说理论上呢?就是说当这种摘要算法被完全攻破时,也就是说可以从签名恢复出任意原文,注意:是任意原文,因为所有的摘要算法的特点就是存在着一个无穷大的碰撞原文的集合。而真正的原文只是其中一份。对应这个无穷大的集合来说,这就是一个无穷小,解释得具体一点是这样:假设原文含有信息量(I),而签名的长度有限(如MD5的128位),则它的信息量只有(i),因为通常
i < I (除非原文非常短),所以可以这么说:I=i+i'。因为I没有限制,而i有限制,则 i' 也是一个没有限制的量。当进行摘要算法后,i' 信息就丢失了。反过来,如果现在这种摘要算法被攻破了,可以从 i 反推回去,但因为 i' 信息已经丢失,意味着 i + I' (其中 I' 为任意信息)都可能是 I (碰撞)。但 I' 是一个无穷集合,并且 i' 属于 I'。这说明:理论上可以从 I' 中找到 i' 从而恢复出原文 I ,但是可能性为零(1/∞=0)。
这里多次提到了碰撞,那么什么是碰撞呢,根据密码学的定义,如果内容不同的明文,通过散列算法得出的结果(密码学称为信息摘要)相同,就称为发生了“碰撞”。散列算法的用途不是对明文加密,让别人看不懂,而是通过对信息摘要的比对,判断原文是否被篡改。所以说对摘要算法来说,它只要能找到碰撞就足以让它失效,并不需要找到原文。具一个例子, Linux的用户安全机制,只要得到用户密码文件(其中记录了密码的MD5),然后随便生成一个碰撞的原文(不一定要跟原密码相同),就可以用这个密码登录了。
关于MD5算法的破解,一些黑客破获密码的方法是一种被称为“跑字典”的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。即使假设密码的最大长度为8,同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P (62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘组,而且这种方法还有一个前提,就是能获得目标账户的
密码MD5值的情况下才可以。在2004年8月17日的美国加州圣巴巴拉召开的国际密码学会议(Crypto’2004)上来自山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告。MD5和SHA-1属于散列算法,从设计原理来讲,就有产生碰撞的可能,王小云教授的方法缩短了找到碰撞的时间,是一项重要的成果。但她找到的是强无碰撞,要能找到弱无碰撞,才算真正破解,才有实际意义。(碰撞分为‘强无碰撞’和‘弱无碰撞’。强无碰撞是无法产生有实际意义的原文的,也就无法篡改和伪造出有意义的明文。”通过强无碰撞伪造一个谁也看不懂的东西,没有实际意义。),
国际密码学专家沙米尔(Shamir)在“RSA 2005”年会上就王小云教授找到一对强无碰撞发表观点:“这是个重要的事情,但不意味着密码被破解。”, 找到一对强无碰撞和找到有实际意义的碰撞,是有本质区别的。会议上王小去教授公布MD5已被破解的说法显然不确切。在‘RSA 2005’年会上,专家们认为SHA-1目前绝对安全,再使用5~10年没问题,计划在2010年以后考虑更换。”
我们知道理论上破解密码的方法,如果要在现实中实现,需要通过超级计算机海量的计算,所需时间一般是成千上万年。在实际应用中,破解时间太长意味着破解将失去现实意义。
中国金融认证中心(CFCA)的技术顾问、原中国建设银行科技部总工程师,曾参加《电子签名法》制定的关振胜介绍:“目前网上银行的认证采用多次散列 算法的加密手段。如B to B的交易,首先对网上银行的表单进行SHA-1的摘要计算;然后对客户填写的信息再计算;最后银行收到信息后还要进行签名。如果要篡改其中的信息,必须破 解3次(前提是能破解,现在还做不到),既使是你若干天或若干月后破解了,交易早已完成。同时,信息摘要的传输还要在PKI体系(公钥基础设施)下进行, PKI体系现在大多应用RSA算法,该算法的安全性大可放心。所以,对于银行这样的实时系统,篡改信息影响交易过程是绝对不可能的。”
如果集中所有的军用超级计算机来破解怎么办?哪我们想想,穷全美国之力,破解你一笔商业交易干什么。像散列算法这么弱的算法,政府部门是根本不会采用的。
另外,关总还介绍说:“伪造数字证书也是不可能的。数字证书包含了很多特定内容,只有具备了包括序列号等一系列特定信息,这个证书才有意义。根据特定的原文内容,伪造出相应的摘要信息是根本做不到的。”
我们看到,如果找不到弱无碰撞,或即使找到弱无碰撞但找不到超大型计算机,想干点篡改和伪造的勾当是不可能的。况且,当管理部门一旦发现算法的安全性可能出现风险,换一个新的算法不存在难度。
从事计算机安全的厂商,对所谓密码破解均不以为然。他们认为,任何产品都有生命周期,产品技术的改进工作时刻都在进行。虽然有人说密码算法不安全,但现在没有任何实质的危害发生。信息安全有多种防范措施保证,散列算法只是其中较弱的一种,不必过分担心。
魔高一尺,道高一丈。随着技术的发展,任何手段都不可能永远不变。当今世界是安全的,大可不必为了密码寝食难安。
产生了碰撞,就带来了问题。王小云等人发现了当前所用的散列算法存在的问题,必将帮助未来的新的散列算法设计者考虑到这方面的问题,使得新的散列算法 具有更好的安全性。比如DES开始不安全以后,更多更强的加密手段也一一涌现。不管破解的结果如何,王小云教授的成果足以让我们振奋,对商用密码的研究起 了促进作用。
========================================================
【转】根据王小云教授的算法写的MD5碰撞的程序[c源代码]
ps.以下代码是根据王小云教授的如何生成md5碰撞的算法论文http://www.infosec.sdu.edu.cn/paper/md5-attack.pdf
写的,不过作者似乎是老外
/* MD5 Collision Generator by Patrick Stach * Implementation of paper by Xiaoyun Wang, et all. * * A few optimizations to make the solving method a bit more deterministic * * Usage: * ./md5coll or ./md5coll IV0 IV1 IV2 IV3 * * Requires being built as 32 bit (unsigned int as 32 bit) * * Any derivative works or references must cite the authors. */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #define F(x, y, z) (z ^ (x & (y ^ z))) #define G(x, y, z) F(z, x, y) #define H(x, y, z) (x ^ y ^ z) #define I(x, y, z) (y ^ (x | ~z)) #define RL(x, y) (((x) << (y)) | ((x) >> (32 - (y)))) #define RR(x, y) (((x) >> (y)) | ((x) << (32 - (y)))) unsigned int A0, B0, C0, D0; unsigned int A1, B1, C1, D1; unsigned int IV[4] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; unsigned int Q0[65], Q1[65]; unsigned int X0[32], X1[32]; void block1(void) { size_t i, max; block1_again: for(;;) { /* C1 */ Q0[ 3] = random() & ~0x00800040; Q1[ 3] = Q0[ 3]; /* B1 */ Q0[ 4] = (random() | 0x80080800) & ~(0x00800040 | 0x0077f780); Q0[ 4] |= (Q0[ 3] & 0x0077f780); Q1[ 4] = Q0[ 4]; /* A2 */ Q0[ 5] = (random() | 0x88400025) & ~0x02bfffc0; Q1[ 5] = Q0[ 5] - 0x00000040; /* D2 */ Q0[ 6] = (random() | 0x027fbc41) & ~(0x888043a4 | 0x7500001a); Q0[ 6] |= (Q0[ 5] & 0x7500001a); Q1[ 6] = Q0[ 6] - 0x7f800040; /* C2 */ Q0[ 7] = (random() | 0x03fef820) & ~0xfc0107df; Q1[ 7] = Q0[ 7] - 0x07800041; X0[ 6] = RR(Q0[ 7] - Q0[ 6], 17) - F(Q0[ 6], Q0[ 5], Q0[ 4]) - Q0[ 3] - 0xa8304613; X1[ 6] = RR(Q1[ 7] - Q1[ 6], 17) - F(Q1[ 6], Q1[ 5], Q1[ 4]) - Q1[ 3] - 0xa8304613; if(X0[ 6] != X1[ 6]) continue; /* B2 */ Q0[ 8] = (random() | 0x01910540) & ~0xfe0eaabf; Q1[ 8] = Q0[ 8] - 0x00827fff; X0[ 7] = RR(Q0[ 8] - Q0[ 7], 22) - F(Q0[ 7], Q0[ 6], Q0[ 5]) - Q0[ 4] - 0xfd469501; X1[ 7] = RR(Q1[ 8] - Q1[ 7], 22) - F(Q1[ 7], Q1[ 6], Q1[ 5]) - Q1[ 4] - 0xfd469501; if(X0[ 7] != X1[ 7]) continue; /* A3 */ Q0[ 9] = (random() | 0xfb102f3d) & ~(0x040f80c2 | 0x00001000); Q0[ 9] |= (Q0[ 8] & 0x00001000); Q1[ 9] = Q0[ 9] - 0x8000003f; X0[ 8] = RR(Q0[ 9] - Q0[ 8], 7) - F(Q0[ 8], Q0[ 7], Q0[ 6]) - Q0[ 5] - 0x698098d8; X1[ 8] = RR(Q1[ 9] - Q1[ 8], 7) - F(Q1[ 8], Q1[ 7], Q1[ 6]) - Q1[ 5] - 0x698098d8; if(X0[ 8] != X1[ 8]) continue; /* D3 */ Q0[10] = (random() | 0x401f9040) & ~0x80802183; Q1[10] = Q0[10] - 0x7ffff000; X0[ 9] = RR(Q0[10] - Q0[ 9], 12) - F(Q0[ 9], Q0[ 8], Q0[ 7]) - Q0[ 6] - 0x8b44f7af; X1[ 9] = RR(Q1[10] - Q1[ 9], 12) - F(Q1[ 9], Q1[ 8], Q1[ 7]) - Q1[ 6] - 0x8b44f7af; if(X0[ 9] != X1[ 9]) continue; /* C3 */ Q0[11] = (random() | 0x000180c2) & ~(0xc00e3101 | 0x00004000); Q0[11] |= (Q0[10] & 0x00004000); Q1[11] = Q0[11] - 0x40000000; X0[10] = RR(Q0[11] - Q0[10], 17) - F(Q0[10], Q0[ 9], Q0[ 8]) - Q0[ 7] - 0xffff5bb1; X1[10] = RR(Q1[11] - Q1[10], 17) - F(Q1[10], Q1[ 9], Q1[ 8]) - Q1[ 7] - 0xffff5bb1; if(X0[10] != X1[10]) continue; /* B3 */ Q0[12] = (random() | 0x00081100) & ~(0xc007e080 | 0x03000000); Q0[12] |= (Q0[11] & 0x03000000); Q1[12] = Q0[12] - 0x80002080; X0[11] = RR(Q0[12] - Q0[11], 22) - F(Q0[11], Q0[10], Q0[ 9]) - Q0[ 8] - 0x895cd7be; X1[11] = RR(Q1[12] - Q1[11], 22) - F(Q1[11], Q1[10], Q1[ 9]) - Q1[ 8] - 0x895cd7be; if((X0[11] ^ X1[11]) != 0x00008000) continue; /* A4 */ Q0[13] = (random() | 0x410fe008) & ~0x82000180; Q1[13] = Q0[13] - 0x7f000000; X0[12] = RR(Q0[13] - Q0[12], 7) - F(Q0[12], Q0[11], Q0[10]) - Q0[ 9] - 0x6b901122; X1[12] = RR(Q1[13] - Q1[12], 7) - F(Q1[12], Q1[11], Q1[10]) - Q1[ 9] - 0x6b901122; if(X0[12] != X1[12]) continue; /* D4 */ Q0[14] = (random() | 0x000be188) & ~0xa3040000; Q1[14] = Q0[14] - 0x80000000; X0[13] = RR(Q0[14] - Q0[13], 12) - F(Q0[13], Q0[12], Q0[11]) - Q0[10] - 0xfd987193; X1[13] = RR(Q1[14] - Q1[13], 12) - F(Q1[13], Q1[12], Q1[11]) - Q1[10] - 0xfd987193; if(X0[13] != X1[13]) continue; /* C4 */ Q0[15] = (random() | 0x21008000) & ~0x82000008; Q1[15] = Q0[15] - 0x80007ff8; X0[14] = RR(Q0[15] - Q0[14], 17) - F(Q0[14], Q0[13], Q0[12]) - Q0[11] - 0xa679438e; X1[14] = RR(Q1[15] - Q1[14], 17) - F(Q1[14], Q1[13], Q1[12]) - Q1[11] - 0xa679438e; if((X0[14] ^ X1[14]) != 0x80000000) continue; /* B4 */ Q0[16] = (random() | 0x20000000) & ~0x80000000; Q1[16] = Q0[16] - 0xa0000000; X0[15] = RR(Q0[16] - Q0[15], 22) - F(Q0[15], Q0[14], Q0[13]) - Q0[12] - 0x49b40821; X1[15] = RR(Q1[16] - Q1[15], 22) - F(Q1[15], Q1[14], Q1[13]) - Q1[12] - 0x49b40821; if(X0[15] != X1[15]) continue; break; } #define LOOP_11 300 for(i = 0; i < LOOP_11; i++) { /* A5 */ Q0[17] = random() & ~(0x80020000 | 0x00008008); Q0[17] |= (Q0[16] & 0x00008008); Q1[17] = Q0[17] - 0x80000000; X0[ 1] = RR(Q0[17] - Q0[16], 5) - G(Q0[16], Q0[15], Q0[14]) - Q0[13] - 0xf61e2562; X1[ 1] = RR(Q1[17] - Q1[16], 5) - G(Q1[16], Q1[15], Q1[14]) - Q1[13] - 0xf61e2562; if(X0[ 1] != X1[ 1]) continue; /* D5 */ Q0[18] = RL(G(Q0[17], Q0[16], Q0[15]) + Q0[14] + X0[ 6] + 0xc040b340, 9) + Q0[17]; if((Q0[18] & 0xa0020000) != (0x00020000 | (Q0[17] & 0x20000000))) { continue; } Q1[18] = RL(G(Q1[17], Q1[16], Q1[15]) + Q1[14] + X1[ 6] + 0xc040b340, 9) + Q1[17]; if((Q0[18] ^ Q1[18]) != 0x80000000) continue; /* C5 */ Q0[19] = RL(G(Q0[18], Q0[17], Q0[16]) + Q0[15] + X0[11] + 0x265e5a51, 14) + Q0[18]; if(Q0[19] & 0x80020000) continue; Q1[19] = RL(G(Q1[18], Q1[17], Q1[16]) + Q1[15] + X1[11] + 0x265e5a51, 14) + Q1[18]; if(Q0[19] - Q1[19] != 0x7ffe0000) continue; /* B5 */ Q0[20] = random() & ~0x80000000; Q1[20] = Q0[20] - 0x80000000; X0[ 0] = RR(Q0[20] - Q0[19], 20) - G(Q0[19], Q0[18], Q0[17]) - Q0[16] - 0xe9b6c7aa; X1[ 0] = RR(Q1[20] - Q1[19], 20) - G(Q1[19], Q1[18], Q1[17]) - Q1[16] - 0xe9b6c7aa; if(X0[ 0] != X1[ 0]) continue; Q0[ 1] = RL(F(IV[1], IV[2], IV[3]) + IV[0] + X0[ 0] + 0xd76aa478, 7) + IV[1]; Q1[ 1] = Q0[ 1]; Q0[ 2] = RL(F(Q0[ 1], IV[1], IV[2]) + IV[3] + X0[ 1] + 0xe8c7b756, 12) + Q0[ 1]; Q1[ 2] = Q0[ 2]; X0[ 2] = RR(Q0[ 3] - Q0[ 2], 17) - F(Q0[ 2], Q0[ 1], IV[1]) - IV[2] - 0x242070db; X1[ 2] = X0[ 2]; X0[ 3] = RR(Q0[ 4] - Q0[ 3], 22) - F(Q0[ 3], Q0[ 2], Q0[ 1]) - IV[1] - 0xc1bdceee; X1[ 3] = X0[ 3]; X0[ 4] = RR(Q0[ 5] - Q0[ 4], 7) - F(Q0[ 4], Q0[ 3], Q0[ 2]) - Q0[ 1] - 0xf57c0faf; X1[ 4] = RR(Q1[ 5] - Q1[ 4], 7) - F(Q1[ 4], Q1[ 3], Q1[ 2]) - Q1[ 1] - 0xf57c0faf; if((X0[ 4] ^ X1[ 4]) != 0x80000000) continue; X0[ 5] = RR(Q0[ 6] - Q0[ 5], 12) - F(Q0[ 5], Q0[ 4], Q0[ 3]) - Q0[ 2] - 0x4787c62a; X1[ 5] = RR(Q1[ 6] - Q1[ 5], 12) - F(Q1[ 5], Q1[ 4], Q1[ 3]) - Q1[ 2] - 0x4787c62a; if(X0[ 5] != X1[ 5]) continue; /* A6 */ Q0[21] = RL(G(Q0[20], Q0[19], Q0[18]) + Q0[17] + X0[ 5] + 0xd62f105d, 5) + Q0[20]; if((Q0[21] & 0x80020000) != (Q0[20] & 0x00020000)) continue; Q1[21] = RL(G(Q1[20], Q1[19], Q1[18]) + Q1[17] + X1[ 5] + 0xd62f105d, 5) + Q1[20]; if((Q0[21] ^ Q1[21]) != 0x80000000) continue; /* D6 */ Q0[22] = RL(G(Q0[21], Q0[20], Q0[19]) + Q0[18] + X0[10] + 0x02441453, 9) + Q0[21]; if(Q0[22] & 0x80000000) continue; Q1[22] = RL(G(Q1[21], Q1[20], Q1[19]) + Q1[18] + X1[10] + 0x02441453, 9) + Q1[21]; if((Q0[22] ^ Q1[22]) != 0x80000000) continue; /* C6 */ Q0[23] = RL(G(Q0[22], Q0[21], Q0[20]) + Q0[19] + X0[15] + 0xd8a1e681, 14) + Q0[22]; if(Q0[23] & 0x80000000) continue; Q1[23] = RL(G(Q1[22], Q1[21], Q1[20]) + Q1[19] + X1[15] + 0xd8a1e681, 14) + Q1[22]; if(Q0[23] != Q1[23]) continue; /* B6 */ Q0[24] = RL(G(Q0[23], Q0[22], Q0[21]) + Q0[20] + X0[ 4] + 0xe7d3fbc8, 20) + Q0[23]; Q1[24] = RL(G(Q1[23], Q1[22], Q1[21]) + Q1[20] + X1[ 4] + 0xe7d3fbc8, 20) + Q1[23]; if(Q0[24] != Q1[24]) continue; /* A7 */ Q0[25] = RL(G(Q0[24], Q0[23], Q0[22]) + Q0[21] + X0[ 9] + 0x21e1cde6, 5) + Q0[24]; Q1[25] = RL(G(Q1[24], Q1[23], Q1[22]) + Q1[21] + X1[ 9] + 0x21e1cde6, 5) + Q1[24]; if(Q0[25] != Q1[25]) continue; /* D7 */ Q0[26] = RL(G(Q0[25], Q0[24], Q0[23]) + Q0[22] + X0[14] + 0xc33707d6, 9) + Q0[25]; Q1[26] = RL(G(Q1[25], Q1[24], Q1[23]) + Q1[22] + X1[14] + 0xc33707d6, 9) + Q1[25]; if(Q0[26] != Q1[26]) continue; /* C7 */ Q0[27] = RL(G(Q0[26], Q0[25], Q0[24]) + Q0[23] + X0[ 3] + 0xf4d50d87, 14) + Q0[26]; Q1[27] = RL(G(Q1[26], Q1[25], Q1[24]) + Q1[23] + X1[ 3] + 0xf4d50d87, 14) + Q1[26]; if(Q0[27] != Q1[27]) continue; break; } if(i >= LOOP_11) goto block1_again; #define LOOP_12 0x20000000 for(i = 0; i < LOOP_12; i++) { /* B5 */ Q0[20] ^= (1 << (random() % 31)); Q1[20] = Q0[20] - 0x80000000; X0[ 0] = RR(Q0[20] - Q0[19], 20) - G(Q0[19], Q0[18], Q0[17]) - Q0[16] - 0xe9b6c7aa; X1[ 0] = RR(Q1[20] - Q1[19], 20) - G(Q1[19], Q1[18], Q1[17]) - Q1[16] - 0xe9b6c7aa; if(X0[ 0] != X1[ 0]) continue; Q0[ 1] = RL(F(IV[1], IV[2], IV[3]) + IV[0] + X0[ 0] + 0xd76aa478, 7) + IV[1]; Q1[ 1] = Q0[ 1]; Q0[ 2] = RL(F(Q0[ 1], IV[1], IV[2]) + IV[3] + X0[ 1] + 0xe8c7b756, 12) + Q0[ 1]; Q1[ 2] = Q0[ 2]; X0[ 2] = RR(Q0[ 3] - Q0[ 2], 17) - F(Q0[ 2], Q0[ 1], IV[1]) - IV[2] - 0x242070db; X1[ 2] = X0[ 2]; X0[ 3] = RR(Q0[ 4] - Q0[ 3], 22) - F(Q0[ 3], Q0[ 2], Q0[ 1]) - IV[1] - 0xc1bdceee; X1[ 3] = X0[ 3]; X0[ 4] = RR(Q0[ 5] - Q0[ 4], 7) - F(Q0[ 4], Q0[ 3], Q0[ 2]) - Q0[ 1] - 0xf57c0faf; X1[ 4] = RR(Q1[ 5] - Q1[ 4], 7) - F(Q1[ 4], Q1[ 3], Q1[ 2]) - Q1[ 1] - 0xf57c0faf; if((X0[ 4] ^ X1[ 4]) != 0x80000000) continue; X0[ 5] = RR(Q0[ 6] - Q0[ 5], 12) - F(Q0[ 5], Q0[ 4], Q0[ 3]) - Q0[ 2] - 0x4787c62a; X1[ 5] = RR(Q1[ 6] - Q1[ 5], 12) - F(Q1[ 5], Q1[ 4], Q1[ 3]) - Q1[ 2] - 0x4787c62a; if(X0[ 5] != X1[ 5]) continue; /* A6 */ Q0[21] = RL(G(Q0[20], Q0[19], Q0[18]) + Q0[17] + X0[ 5] + 0xd62f105d, 5) + Q0[20]; if((Q0[21] & 0x80020000) != (Q0[20] & 0x00020000)) continue; Q1[21] = RL(G(Q1[20], Q1[19], Q1[18]) + Q1[17] + X1[ 5] + 0xd62f105d, 5) + Q1[20]; if((Q0[21] ^ Q1[21]) != 0x80000000) continue; /* D6 */ Q0[22] = RL(G(Q0[21], Q0[20], Q0[19]) + Q0[18] + X0[10] + 0x02441453, 9) + Q0[21]; if(Q0[22] & 0x80000000) continue; Q1[22] = RL(G(Q1[21], Q1[20], Q1[19]) + Q1[18] + X1[10] + 0x02441453, 9) + Q1[21]; if((Q0[22] ^ Q1[22]) != 0x80000000) continue; /* C6 */ Q0[23] = RL(G(Q0[22], Q0[21], Q0[20]) + Q0[19] + X0[15] + 0xd8a1e681, 14) + Q0[22]; if(Q0[23] & 0x80000000) continue; Q1[23] = RL(G(Q1[22], Q1[21], Q1[20]) + Q1[19] + X1[15] + 0xd8a1e681, 14) + Q1[22]; if(Q0[23] != Q1[23]) continue; /* B6 */ Q0[24] = RL(G(Q0[23], Q0[22], Q0[21]) + Q0[20] + X0[ 4] + 0xe7d3fbc8, 20) + Q0[23]; Q1[24] = RL(G(Q1[23], Q1[22], Q1[21]) + Q1[20] + X1[ 4] + 0xe7d3fbc8, 20) + Q1[23]; if(Q0[24] != Q1[24]) continue; /* A7 */ Q0[25] = RL(G(Q0[24], Q0[23], Q0[22]) + Q0[21] + X0[ 9] + 0x21e1cde6, 5) + Q0[24]; Q1[25] = RL(G(Q1[24], Q1[23], Q1[22]) + Q1[21] + X1[ 9] + 0x21e1cde6, 5) + Q1[24]; if(Q0[25] != Q1[25]) continue; /* D7 */ Q0[26] = RL(G(Q0[25], Q0[24], Q0[23]) + Q0[22] + X0[14] + 0xc33707d6, 9) + Q0[25]; Q1[26] = RL(G(Q1[25], Q1[24], Q1[23]) + Q1[22] + X1[14] + 0xc33707d6, 9) + Q1[25]; if(Q0[26] != Q1[26]) continue; /* C7 */ Q0[27] = RL(G(Q0[26], Q0[25], Q0[24]) + Q0[23] + X0[ 3] + 0xf4d50d87, 14) + Q0[26]; Q1[27] = RL(G(Q1[26], Q1[25], Q1[24]) + Q1[23] + X1[ 3] + 0xf4d50d87, 14) + Q1[26]; if(Q0[27] != Q1[27]) continue; /* B7 */ Q0[28] = RL(G(Q0[27], Q0[26], Q0[25]) + Q0[24] + X0[ 8] + 0x455a14ed, 20) + Q0[27]; Q1[28] = RL(G(Q1[27], Q1[26], Q1[25]) + Q1[24] + X1[ 8] + 0x455a14ed, 20) + Q1[27]; if(Q0[28] != Q1[28]) continue; /* A8 */ Q0[29] = RL(G(Q0[28], Q0[27], Q0[26]) + Q0[25] + X0[13] + 0xa9e3e905, 5) + Q0[28]; Q1[29] = RL(G(Q1[28], Q1[27], Q1[26]) + Q1[25] + X1[13] + 0xa9e3e905, 5) + Q1[28]; if(Q0[29] != Q1[29]) continue; /* D8 */ Q0[30] = RL(G(Q0[29], Q0[28], Q0[27]) + Q0[26] + X0[ 2] + 0xfcefa3f8, 9) + Q0[29]; Q1[30] = RL(G(Q1[29], Q1[28], Q1[27]) + Q1[26] + X1[ 2] + 0xfcefa3f8, 9) + Q1[29]; if(Q0[30] != Q1[30]) continue; /* C8 */ Q0[31] = RL(G(Q0[30], Q0[29], Q0[28]) + Q0[27] + X0[ 7] + 0x676f02d9, 14) + Q0[30]; Q1[31] = RL(G(Q1[30], Q1[29], Q1[28]) + Q1[27] + X1[ 7] + 0x676f02d9, 14) + Q1[30]; if(Q0[31] != Q1[31]) continue; /* B8 */ Q0[32] = RL(G(Q0[31], Q0[30], Q0[29]) + Q0[28] + X0[12] + 0x8d2a4c8a, 20) + Q0[31]; Q1[32] = RL(G(Q1[31], Q1[30], Q1[29]) + Q1[28] + X1[12] + 0x8d2a4c8a, 20) + Q1[31]; if(Q0[32] != Q1[32]) continue; /* A9 */ Q0[33] = RL(H(Q0[32], Q0[31], Q0[30]) + Q0[29] + X0[ 5] + 0xfffa3942, 4) + Q0[32]; Q1[33] = RL(H(Q1[32], Q1[31], Q1[30]) + Q1[29] + X1[ 5] + 0xfffa3942, 4) + Q1[32]; if(Q0[33] != Q1[33]) continue; /* D9 */ Q0[34] = RL(H(Q0[33], Q0[32], Q0[31]) + Q0[30] + X0[ 8] + 0x8771f681, 11) + Q0[33]; Q1[34] = RL(H(Q1[33], Q1[32], Q1[31]) + Q1[30] + X1[ 8] + 0x8771f681, 11) + Q1[33]; if(Q0[34] != Q1[34]) continue; /* C9 */ Q0[35] = RL(H(Q0[34], Q0[33], Q0[32]) + Q0[31] + X0[11] + 0x6d9d6122, 16) + Q0[34]; Q1[35] = RL(H(Q1[34], Q1[33], Q1[32]) + Q1[31] + X1[11] + 0x6d9d6122, 16) + Q1[34]; if((Q0[35] ^ Q1[35]) != 0x80000000) continue; /* B9 */ Q0[36] = RL(H(Q0[35], Q0[34], Q0[33]) + Q0[32] + X0[14] + 0xfde5380c, 23) + Q0[35]; Q1[36] = RL(H(Q1[35], Q1[34], Q1[33]) + Q1[32] + X1[14] + 0xfde5380c, 23) + Q1[35]; if((Q0[36] ^ Q1[36]) != 0x80000000) continue; /* A10 */ Q0[37] = RL(H(Q0[36], Q0[35], Q0[34]) + Q0[33] + X0[ 1] + 0xa4beea44, 4) + Q0[36]; Q1[37] = RL(H(Q1[36], Q1[35], Q1[34]) + Q1[33] + X1[ 1] + 0xa4beea44, 4) + Q1[36]; if((Q0[37] ^ Q1[37]) != 0x80000000) continue; /* D10 */ Q0[38] = RL(H(Q0[37], Q0[36], Q0[35]) + Q0[34] + X0[ 4] + 0x4bdecfa9, 11) + Q0[37]; Q1[38] = RL(H(Q1[37], Q1[36], Q1[35]) + Q1[34] + X1[ 4] + 0x4bdecfa9, 11) + Q1[37]; if((Q0[38] ^ Q1[38]) != 0x80000000) continue; /* C10 */ Q0[39] = RL(H(Q0[38], Q0[37], Q0[36]) + Q0[35] + X0[ 7] + 0xf6bb4b60, 16) + Q0[38]; Q1[39] = RL(H(Q1[38], Q1[37], Q1[36]) + Q1[35] + X1[ 7] + 0xf6bb4b60, 16) + Q1[38]; if((Q0[39] ^ Q1[39]) != 0x80000000) continue; /* B10 */ Q0[40] = RL(H(Q0[39], Q0[38], Q0[37]) + Q0[36] + X0[10] + 0xbebfbc70, 23) + Q0[39]; Q1[40] = RL(H(Q1[39], Q1[38], Q1[37]) + Q1[36] + X1[10] + 0xbebfbc70, 23) + Q1[39]; if((Q0[40] ^ Q1[40]) != 0x80000000) continue; /* A11 */ Q0[41] = RL(H(Q0[40], Q0[39], Q0[38]) + Q0[37] + X0[13] + 0x289b7ec6, 4) + Q0[40]; Q1[41] = RL(H(Q1[40], Q1[39], Q1[38]) + Q1[37] + X1[13] + 0x289b7ec6, 4) + Q1[40]; if((Q0[41] ^ Q1[41]) != 0x80000000) continue; /* D11 */ Q0[42] = RL(H(Q0[41], Q0[40], Q0[39]) + Q0[38] + X0[ 0] + 0xeaa127fa, 11) + Q0[41]; Q1[42] = RL(H(Q1[41], Q1[40], Q1[39]) + Q1[38] + X1[ 0] + 0xeaa127fa, 11) + Q1[41]; if((Q0[42] ^ Q1[42]) != 0x80000000) continue; /* C11 */ Q0[43] = RL(H(Q0[42], Q0[41], Q0[40]) + Q0[39] + X0[ 3] + 0xd4ef3085, 16) + Q0[42]; Q1[43] = RL(H(Q1[42], Q1[41], Q1[40]) + Q1[39] + X1[ 3] + 0xd4ef3085, 16) + Q1[42]; if((Q0[43] ^ Q1[43]) != 0x80000000) continue; /* B11 */ Q0[44] = RL(H(Q0[43], Q0[42], Q0[41]) + Q0[40] + X0[ 6] + 0x04881d05, 23) + Q0[43]; Q1[44] = RL(H(Q1[43], Q1[42], Q1[41]) + Q1[40] + X1[ 6] + 0x04881d05, 23) + Q1[43]; if((Q0[44] ^ Q1[44]) != 0x80000000) continue; /* A12 */ Q0[45] = RL(H(Q0[44], Q0[43], Q0[42]) + Q0[41] + X0[ 9] + 0xd9d4d039, 4) + Q0[44]; Q1[45] = RL(H(Q1[44], Q1[43], Q1[42]) + Q1[41] + X1[ 9] + 0xd9d4d039, 4) + Q1[44]; if((Q0[45] ^ Q1[45]) != 0x80000000) continue; /* D12 */ Q0[46] = RL(H(Q0[45], Q0[44], Q0[43]) + Q0[42] + X0[12] + 0xe6db99e5, 11) + Q0[45]; Q1[46] = RL(H(Q1[45], Q1[44], Q1[43]) + Q1[42] + X1[12] + 0xe6db99e5, 11) + Q1[45]; if((Q0[46] ^ Q1[46]) != 0x80000000) continue; /* C12 */ Q0[47] = RL(H(Q0[46], Q0[45], Q0[44]) + Q0[43] + X0[15] + 0x1fa27cf8, 16) + Q0[46]; Q1[47] = RL(H(Q1[46], Q1[45], Q1[44]) + Q1[43] + X1[15] + 0x1fa27cf8, 16) + Q1[46]; if((Q0[47] ^ Q1[47]) != 0x80000000) continue; /* B12 */ Q0[48] = RL(H(Q0[47], Q0[46], Q0[45]) + Q0[44] + X0[ 2] + 0xc4ac5665, 23) + Q0[47]; if((Q0[48] ^ Q0[46]) & 0x80000000) continue; Q1[48] = RL(H(Q1[47], Q1[46], Q1[45]) + Q1[44] + X1[ 2] + 0xc4ac5665, 23) + Q1[47]; if((Q0[48] ^ Q1[48]) != 0x80000000) continue; /* A13 */ Q0[49] = RL(I(Q0[48], Q0[47], Q0[46]) + Q0[45] + X0[ 0] + 0xf4292244, 6) + Q0[48]; if((Q0[49] ^ Q0[47]) & 0x80000000) continue; Q1[49] = RL(I(Q1[48], Q1[47], Q1[46]) + Q1[45] + X1[ 0] + 0xf4292244, 6) + Q1[48]; if((Q0[49] ^ Q1[49]) != 0x80000000) continue; /* D13 */ Q0[50] = RL(I(Q0[49], Q0[48], Q0[47]) + Q0[46] + X0[ 7] + 0x432aff97, 10) + Q0[49]; if(!((Q0[50] ^ Q0[48]) & 0x80000000)) continue; Q1[50] = RL(I(Q1[49], Q1[48], Q1[47]) + Q1[46] + X1[ 7] + 0x432aff97, 10) + Q1[49]; if((Q0[50] ^ Q1[50]) != 0x80000000) continue; /* C13 */ Q0[51] = RL(I(Q0[50], Q0[49], Q0[48]) + Q0[47] + X0[14] + 0xab9423a7, 15) + Q0[50]; if((Q0[51] ^ Q0[49]) & 0x80000000) continue; Q1[51] = RL(I(Q1[50], Q1[49], Q1[48]) + Q1[47] + X1[14] + 0xab9423a7, 15) + Q1[50]; if((Q0[51] ^ Q1[51]) != 0x80000000) continue; /* B13 */ Q0[52] = RL(I(Q0[51], Q0[50], Q0[49]) + Q0[48] + X0[ 5] + 0xfc93a039, 21) + Q0[51]; if((Q0[52] ^ Q0[50]) & 0x80000000) continue; Q1[52] = RL(I(Q1[51], Q1[50], Q1[49]) + Q1[48] + X1[ 5] + 0xfc93a039, 21) + Q1[51]; if((Q0[52] ^ Q1[52]) != 0x80000000) continue; /* A14 */ Q0[53] = RL(I(Q0[52], Q0[51], Q0[50]) + Q0[49] + X0[12] + 0x655b59c3, 6) + Q0[52]; if((Q0[53] ^ Q0[51]) & 0x80000000) continue; Q1[53] = RL(I(Q1[52], Q1[51], Q1[50]) + Q1[49] + X1[12] + 0x655b59c3, 6) + Q1[52]; if((Q0[53] ^ Q1[53]) != 0x80000000) continue; /* D14 */ Q0[54] = RL(I(Q0[53], Q0[52], Q0[51]) + Q0[50] + X0[ 3] + 0x8f0ccc92, 10) + Q0[53]; if((Q0[54] ^ Q0[52]) & 0x80000000) continue; Q1[54] = RL(I(Q1[53], Q1[52], Q1[51]) + Q1[50] + X1[ 3] + 0x8f0ccc92, 10) + Q1[53]; if((Q0[54] ^ Q1[54]) != 0x80000000) continue; /* C14 */ Q0[55] = RL(I(Q0[54], Q0[53], Q0[52]) + Q0[51] + X0[10] + 0xffeff47d, 15) + Q0[54]; if((Q0[55] ^ Q0[53]) & 0x80000000) continue; Q1[55] = RL(I(Q1[54], Q1[53], Q1[52]) + Q1[51] + X1[10] + 0xffeff47d, 15) + Q1[54]; if((Q0[55] ^ Q1[55]) != 0x80000000) continue; /* B14 */ Q0[56] = RL(I(Q0[55], Q0[54], Q0[53]) + Q0[52] + X0[ 1] + 0x85845dd1, 21) + Q0[55]; if((Q0[56] ^ Q0[54]) & 0x80000000) continue; Q1[56] = RL(I(Q1[55], Q1[54], Q1[53]) + Q1[52] + X1[ 1] + 0x85845dd1, 21) + Q1[55]; if((Q0[56] ^ Q1[56]) != 0x80000000) continue; /* A15 */ Q0[57] = RL(I(Q0[56], Q0[55], Q0[54]) + Q0[53] + X0[ 8] + 0x6fa87e4f, 6) + Q0[56]; if((Q0[57] ^ Q0[55]) & 0x80000000) continue; Q1[57] = RL(I(Q1[56], Q1[55], Q1[54]) + Q1[53] + X1[ 8] + 0x6fa87e4f, 6) + Q1[56]; if((Q0[57] ^ Q1[57]) != 0x80000000) continue; /* D15 */ Q0[58] = RL(I(Q0[57], Q0[56], Q0[55]) + Q0[54] + X0[15] + 0xfe2ce6e0, 10) + Q0[57]; if((Q0[58] ^ Q0[56]) & 0x80000000) continue; Q1[58] = RL(I(Q1[57], Q1[56], Q1[55]) + Q1[54] + X1[15] + 0xfe2ce6e0, 10) + Q1[57]; if((Q0[58] ^ Q1[58]) != 0x80000000) continue; /* C15 */ Q0[59] = RL(I(Q0[58], Q0[57], Q0[56]) + Q0[55] + X0[ 6] + 0xa3014314, 15) + Q0[58]; if((Q0[59] ^ Q0[57]) & 0x80000000) continue; Q1[59] = RL(I(Q1[58], Q1[57], Q1[56]) + Q1[55] + X1[ 6] + 0xa3014314, 15) + Q1[58]; if((Q0[59] ^ Q1[59]) != 0x80000000) continue; /* B15 */ Q0[60] = RL(I(Q0[59], Q0[58], Q0[57]) + Q0[56] + X0[13] + 0x4e0811a1, 21) + Q0[59]; if(Q0[60] & 0x02000000) continue; Q1[60] = RL(I(Q1[59], Q1[58], Q1[57]) + Q1[56] + X1[13] + 0x4e0811a1, 21) + Q1[59]; if((Q0[60] ^ Q1[60]) != 0x80000000) continue; /* A16 */ Q0[61] = RL(I(Q0[60], Q0[59], Q0[58]) + Q0[57] + X0[ 4] + 0xf7537e82, 6) + Q0[60]; A0 = IV[0] + Q0[61]; Q1[61] = RL(I(Q1[60], Q1[59], Q1[58]) + Q1[57] + X1[ 4] + 0xf7537e82, 6) + Q1[60]; A1 = IV[0] + Q1[61]; if((A0 ^ A1) != 0x80000000) continue; /* D16 */ Q0[62] = RL(I(Q0[61], Q0[60], Q0[59]) + Q0[58] + X0[11] + 0xbd3af235, 10) + Q0[61]; D0 = IV[3] + Q0[62]; if(D0 & 0x02000000) continue; Q1[62] = RL(I(Q1[61], Q1[60], Q1[59]) + Q1[58] + X1[11] + 0xbd3af235, 10) + Q1[61]; D1 = IV[3] + Q1[62]; if((D0 - D1) != 0x7e000000) continue; /* C16 */ Q0[63] = RL(I(Q0[62], Q0[61], Q0[60]) + Q0[59] + X0[ 2] + 0x2ad7d2bb, 15) + Q0[62]; C0 = IV[2] + Q0[63]; if((C0 & 0x86000000) != ((D0 & 0x80000000) | 0x02000000)) continue; Q1[63] = RL(I(Q1[62], Q1[61], Q1[60]) + Q1[59] + X1[ 2] + 0x2ad7d2bb, 15) + Q1[62]; C1 = IV[2] + Q1[63]; if((C0 - C1) != 0x7e000000) continue; /* B16 */ Q0[64] = RL(I(Q0[63], Q0[62], Q0[61]) + Q0[60] + X0[ 9] + 0xeb86d391, 21) + Q0[63]; B0 = IV[1] + Q0[64]; if((B0 & 0x86000020) != (C0 & 0x80000000)) continue; Q1[64] = RL(I(Q1[63], Q1[62], Q1[61]) + Q1[60] + X1[ 9] + 0xeb86d391, 21) + Q1[63]; B1 = IV[1] + Q1[64]; if((B0 - B1) != 0x7e000000) continue; break; } if(i >= LOOP_12) goto block1_again; return; } const unsigned int mask22[30] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x40000000 }; void block2(void) { size_t i; block2_again: for(;;) { /* A1 */ Q0[ 1] = (random() | 0x84200000) & ~0x0a000820; Q1[ 1] = Q0[ 1] - 0x7e000000; X0[16] = RR(Q0[ 1] - B0, 7) - F(B0, C0, D0) - A0 - 0xd76aa478; X1[16] = RR(Q1[ 1] - B1, 7) - F(B1, C1, D1) - A1 - 0xd76aa478; if(X0[16] != X1[16]) continue; break; } for(i = 0; i < 10; i++) { /* D1 */ Q0[ 2] = (random() | 0x8c000800) & ~(0x02208026 | 0x701f10c0); Q0[ 2] |= (Q0[ 1] & 0x701f10c0); Q1[ 2] = Q0[ 2] - 0x7dffffe0; X0[17] = RR(Q0[ 2] - Q0[ 1], 12) - F(Q0[ 1], B0, C0) - D0 - 0xe8c7b756; X1[17] = RR(Q1[ 2] - Q1[ 1], 12) - F(Q1[ 1], B1, C1) - D1 - 0xe8c7b756; if(X0[17] != X1[17]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* C1 */ Q0[ 3] = (random() | 0xbe1f0966) & ~(0x40201080 | 0x00000018); Q0[ 3] |= (Q0[ 2] & 0x00000018); Q1[ 3] = Q0[ 3] - 0x7dfef7e0; X0[18] = RR(Q0[ 3] - Q0[ 2], 17) - F(Q0[ 2], Q0[ 1], B0) - C0 - 0x242070db; X1[18] = RR(Q1[ 3] - Q1[ 2], 17) - F(Q1[ 2], Q1[ 1], B1) - C1 - 0x242070db; if(X0[18] != X1[18]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* B1 */ Q0[ 4] = (random() | 0xba040010) & ~(0x443b19ee | 0x00000601); Q0[ 4] |= (Q0[ 3] & 0x00000601); Q1[ 4] = Q0[ 4] - 0x7dffffe2; X0[19] = RR(Q0[ 4] - Q0[ 3], 22) - F(Q0[ 3], Q0[ 2], Q0[ 1]) - B0 - 0xc1bdceee; X1[19] = RR(Q1[ 4] - Q1[ 3], 22) - F(Q1[ 3], Q1[ 2], Q1[ 1]) - B1 - 0xc1bdceee; if(X0[19] != X1[19]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* A2 */ Q0[ 5] = (random() | 0x482f0e50) & ~0xb41011af; Q1[ 5] = Q0[ 5] - 0x7ffffcbf; X0[20] = RR(Q0[ 5] - Q0[ 4], 7) - F(Q0[ 4], Q0[ 3], Q0[ 2]) - Q0[ 1] - 0xf57c0faf; X1[20] = RR(Q1[ 5] - Q1[ 4], 7) - F(Q1[ 4], Q1[ 3], Q1[ 2]) - Q1[ 1] - 0xf57c0faf; if((X0[20] ^ X1[20]) != 0x80000000) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* D2 */ Q0[ 6] = (random() | 0x04220c56) & ~0x9a1113a9; Q1[ 6] = Q0[ 6] - 0x80110000; X0[21] = RR(Q0[ 6] - Q0[ 5], 12) - F(Q0[ 5], Q0[ 4], Q0[ 3]) - Q0[ 2] - 0x4787c62a; X1[21] = RR(Q1[ 6] - Q1[ 5], 12) - F(Q1[ 5], Q1[ 4], Q1[ 3]) - Q1[ 2] - 0x4787c62a; if(X0[21] != X1[21]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* C2 */ Q0[ 7] = (random() | 0x96011e01) & ~(0x083201c0 | 0x01808000); Q0[ 7] |= (Q0[ 6] & 0x01808000); Q1[ 7] = Q0[ 7] - 0x88000040; X0[22] = RR(Q0[ 7] - Q0[ 6], 17) - F(Q0[ 6], Q0[ 5], Q0[ 4]) - Q0[ 3] - 0xa8304613; X1[22] = RR(Q1[ 7] - Q1[ 6], 17) - F(Q1[ 6], Q1[ 5], Q1[ 4]) - Q1[ 3] - 0xa8304613; if(X0[22] != X1[22]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* B2 */ Q0[ 8] = (random() | 0x843283c0) & ~(0x1b810001 | 0x00000002); Q0[ 8] |= (Q0[ 7] & 0x00000002); Q1[ 8] = Q0[ 8] - 0x80818000; X0[23] = RR(Q0[ 8] - Q0[ 7], 22) - F(Q0[ 7], Q0[ 6], Q0[ 5]) - Q0[ 4] - 0xfd469501; X1[23] = RR(Q1[ 8] - Q1[ 7], 22) - F(Q1[ 7], Q1[ 6], Q1[ 5]) - Q1[ 4] - 0xfd469501; if(X0[23] != X1[23]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* A3 */ Q0[ 9] = (random() | 0x9c0101c1) & ~(0x03828202 | 0x00001000); Q0[ 9] |= (Q0[ 8] & 0x00001000); Q1[ 9] = Q0[ 9] - 0x7fffffbf; X0[24] = RR(Q0[ 9] - Q0[ 8], 7) - F(Q0[ 8], Q0[ 7], Q0[ 6]) - Q0[ 5] - 0x698098d8; X1[24] = RR(Q1[ 9] - Q1[ 8], 7) - F(Q1[ 8], Q1[ 7], Q1[ 6]) - Q1[ 5] - 0x698098d8; if(X0[24] != X1[24]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* D3 */ Q0[10] = (random() | 0x878383c0) & ~0x00041003; Q1[10] = Q0[10] - 0x7ffff000; X0[25] = RR(Q0[10] - Q0[ 9], 12) - F(Q0[ 9], Q0[ 8], Q0[ 7]) - Q0[ 6] - 0x8b44f7af; X1[25] = RR(Q1[10] - Q1[ 9], 12) - F(Q1[ 9], Q1[ 8], Q1[ 7]) - Q1[ 6] - 0x8b44f7af; if(X0[25] != X1[25]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* C3 */ Q0[11] = (random() | 0x800583c3) & ~(0x00021000 | 0x00086000); Q0[11] |= (Q0[10] & 0x00086000); Q1[11] = Q0[11] - 0x80000000; X0[26] = RR(Q0[11] - Q0[10], 17) - F(Q0[10], Q0[ 9], Q0[ 8]) - Q0[ 7] - 0xffff5bb1; X1[26] = RR(Q1[11] - Q1[10], 17) - F(Q1[10], Q1[ 9], Q1[ 8]) - Q1[ 7] - 0xffff5bb1; if(X0[26] != X1[26]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* B3 */ Q0[12] = (random() | 0x80081080) & ~(0x0007e000 | 0x7f000000); Q0[12] |= (Q0[11] & 0x7f000000); Q1[12] = Q0[12] - 0x80002080; X0[27] = RR(Q0[12] - Q0[11], 22) - F(Q0[11], Q0[10], Q0[ 9]) - Q0[ 8] - 0x895cd7be; X1[27] = RR(Q1[12] - Q1[11], 22) - F(Q1[11], Q1[10], Q1[ 9]) - Q1[ 8] - 0x895cd7be; if((X0[27] ^ X1[27]) != 0x00008000) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* A4 */ Q0[13] = (random() | 0x3f0fe008) & ~0x80000080; Q1[13] = Q0[13] - 0x7f000000; X0[28] = RR(Q0[13] - Q0[12], 7) - F(Q0[12], Q0[11], Q0[10]) - Q0[ 9] - 0x6b901122; X1[28] = RR(Q1[13] - Q1[12], 7) - F(Q1[12], Q1[11], Q1[10]) - Q1[ 9] - 0x6b901122; if(X0[28] != X1[28]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* D4 */ Q0[14] = (random() | 0x400be088) & ~0xbf040000; Q1[14] = Q0[14] - 0x80000000; X0[29] = RR(Q0[14] - Q0[13], 12) - F(Q0[13], Q0[12], Q0[11]) - Q0[10] - 0xfd987193; X1[29] = RR(Q1[14] - Q1[13], 12) - F(Q1[13], Q1[12], Q1[11]) - Q1[10] - 0xfd987193; if(X0[29] != X1[29]) continue; break; } if(i >= 10) goto block2_again; for(i = 0; i < 10; i++) { /* C4 */ Q0[15] = (random() | 0x7d000000) & ~0x82008008; Q1[15] = Q0[15] - 0x7fff7ff8; X0[30] = RR(Q0[15] - Q0[14], 17) - F(Q0[14], Q0[13], Q0[12]) - Q0[11] - 0xa679438e; X1[30] = RR(Q1[15] - Q1[14], 17) - F(Q1[14], Q1[13], Q1[12]) - Q1[11] - 0xa679438e; if((X0[30] ^ X1[30]) != 0x80000000) continue; break; } if(i >= 10) goto block2_again; #define LOOP_21 1000 for(i = 0; i < LOOP_21; i++) { /* B4 */ Q0[16] = (random() | 0x20000000) & ~0x80000000; Q1[16] = Q0[16] - 0xa0000000; X0[31] = RR(Q0[16] - Q0[15], 22) - F(Q0[15], Q0[14], Q0[13]) - Q0[12] - 0x49b40821; X1[31] = RR(Q1[16] - Q1[15], 22) - F(Q1[15], Q1[14], Q1[13]) - Q1[12] - 0x49b40821; if(X0[31] != X1[31]) continue; /* A5 */ Q0[17] = RL(G(Q0[16], Q0[15], Q0[14]) + Q0[13] + X0[17] + 0xf61e2562, 5) + Q0[16]; if((Q0[17] & 0x80028008) != (Q0[16] & 0x00008008)) continue; Q1[17] = RL(G(Q1[16], Q1[15], Q1[14]) + Q1[13] + X1[17] + 0xf61e2562, 5) + Q1[16]; if((Q0[17] ^ Q1[17]) != 0x80000000) continue; /* D5 */ Q0[18] = RL(G(Q0[17], Q0[16], Q0[15]) + Q0[14] + X0[22] + 0xc040b340, 9) + Q0[17]; if((Q0[18] & 0xa0020000) != ((Q0[17] & 0x20000000) | 0x00020000)) { continue; } Q1[18] = RL(G(Q1[17], Q1[16], Q1[15]) + Q1[14] + X1[22] + 0xc040b340, 9) + Q1[17]; if((Q0[18] ^ Q1[18]) != 0x80000000) continue; /* C5 */ Q0[19] = RL(G(Q0[18], Q0[17], Q0[16]) + Q0[15] + X0[27] + 0x265e5a51, 14) + Q0[18]; if(Q0[19] & 0x80020000) continue; Q1[19] = RL(G(Q1[18], Q1[17], Q1[16]) + Q1[15] + X1[27] + 0x265e5a51, 14) + Q1[18]; if((Q0[19] - Q1[19]) != 0x7ffe0000) continue; /* B5 */ Q0[20] = RL(G(Q0[19], Q0[18], Q0[17]) + Q0[16] + X0[16] + 0xe9b6c7aa, 20) + Q0[19]; if(Q0[20] & 0x80000000) continue; Q1[20] = RL(G(Q1[19], Q1[18], Q1[17]) + Q1[16] + X1[16] + 0xe9b6c7aa, 20) + Q1[19]; if((Q0[20] ^ Q1[20]) != 0x80000000) continue; /* A6 */ Q0[21] = RL(G(Q0[20], Q0[19], Q0[18]) + Q0[17] + X0[21] + 0xd62f105d, 5) + Q0[20]; if((Q0[21] & 0x80020000) != (Q0[20] & 0x00020000)) continue; Q1[21] = RL(G(Q1[20], Q1[19], Q1[18]) + Q1[17] + X1[21] + 0xd62f105d, 5) + Q1[20]; if((Q0[21] ^ Q1[21]) != 0x80000000) continue; break; } if(i >= LOOP_21) goto block2_again; #define LOOP_22 0x4000000 for(i = 0; i < LOOP_22; i++) { /* B4 */ Q0[16] ^= mask22[random() % 30]; Q1[16] = Q0[16] - 0xa0000000; X0[31] = RR(Q0[16] - Q0[15], 22) - F(Q0[15], Q0[14], Q0[13]) - Q0[12] - 0x49b40821; X1[31] = RR(Q1[16] - Q1[15], 22) - F(Q1[15], Q1[14], Q1[13]) - Q1[12] - 0x49b40821; if(X0[31] != X1[31]) continue; /* A5 */ Q0[17] = RL(G(Q0[16], Q0[15], Q0[14]) + Q0[13] + X0[17] + 0xf61e2562, 5) + Q0[16]; if((Q0[17] & 0x80028008) != (Q0[16] & 0x00008008)) continue; Q1[17] = RL(G(Q1[16], Q1[15], Q1[14]) + Q1[13] + X1[17] + 0xf61e2562, 5) + Q1[16]; if((Q0[17] ^ Q1[17]) != 0x80000000) continue; /* D5 */ Q0[18] = RL(G(Q0[17], Q0[16], Q0[15]) + Q0[14] + X0[22] + 0xc040b340, 9) + Q0[17]; if((Q0[18] & 0xa0020000) != ((Q0[17] & 0x20000000) | 0x00020000)) { continue; } Q1[18] = RL(G(Q1[17], Q1[16], Q1[15]) + Q1[14] + X1[22] + 0xc040b340, 9) + Q1[17]; if((Q0[18] ^ Q1[18]) != 0x80000000) continue; /* C5 */ Q0[19] = RL(G(Q0[18], Q0[17], Q0[16]) + Q0[15] + X0[27] + 0x265e5a51, 14) + Q0[18]; if(Q0[19] & 0x80020000) continue; Q1[19] = RL(G(Q1[18], Q1[17], Q1[16]) + Q1[15] + X1[27] + 0x265e5a51, 14) + Q1[18]; if((Q0[19] - Q1[19]) != 0x7ffe0000) continue; /* B5 */ Q0[20] = RL(G(Q0[19], Q0[18], Q0[17]) + Q0[16] + X0[16] + 0xe9b6c7aa, 20) + Q0[19]; if(Q0[20] & 0x80000000) continue; Q1[20] = RL(G(Q1[19], Q1[18], Q1[17]) + Q1[16] + X1[16] + 0xe9b6c7aa, 20) + Q1[19]; if((Q0[20] ^ Q1[20]) != 0x80000000) continue; /* A6 */ Q0[21] = RL(G(Q0[20], Q0[19], Q0[18]) + Q0[17] + X0[21] + 0xd62f105d, 5) + Q0[20]; if((Q0[21] & 0x80020000) != (Q0[20] & 0x00020000)) continue; Q1[21] = RL(G(Q1[20], Q1[19], Q1[18]) + Q1[17] + X1[21] + 0xd62f105d, 5) + Q1[20]; if((Q0[21] ^ Q1[21]) != 0x80000000) continue; /* D6 */ Q0[22] = RL(G(Q0[21], Q0[20], Q0[19]) + Q0[18] + X0[26] + 0x02441453, 9) + Q0[21]; if(Q0[22] & 0x80000000) continue; Q1[22] = RL(G(Q1[21], Q1[20], Q1[19]) + Q1[18] + X1[26] + 0x02441453, 9) + Q1[21]; if((Q0[22] ^ Q1[22]) != 0x80000000) continue; /* C6 */ Q0[23] = RL(G(Q0[22], Q0[21], Q0[20]) + Q0[19] + X0[31] + 0xd8a1e681, 14) + Q0[22]; if(Q0[23] & 0x80000000) continue; Q1[23] = RL(G(Q1[22], Q1[21], Q1[20]) + Q1[19] + X1[31] + 0xd8a1e681, 14) + Q1[22]; if(Q0[23] != Q1[23]) continue; /* B6 */ Q0[24] = RL(G(Q0[23], Q0[22], Q0[21]) + Q0[20] + X0[20] + 0xe7d3fbc8, 20) + Q0[23]; Q1[24] = RL(G(Q1[23], Q1[22], Q1[21]) + Q1[20] + X1[20] + 0xe7d3fbc8, 20) + Q1[23]; if(Q0[24] != Q1[24]) continue; /* A7 */ Q0[25] = RL(G(Q0[24], Q0[23], Q0[22]) + Q0[21] + X0[25] + 0x21e1cde6, 5) + Q0[24]; Q1[25] = RL(G(Q1[24], Q1[23], Q1[22]) + Q1[21] + X1[25] + 0x21e1cde6, 5) + Q1[24]; if(Q0[25] != Q1[25]) continue; /* D7 */ Q0[26] = RL(G(Q0[25], Q0[24], Q0[23]) + Q0[22] + X0[30] + 0xc33707d6, 9) + Q0[25]; Q1[26] = RL(G(Q1[25], Q1[24], Q1[23]) + Q1[22] + X1[30] + 0xc33707d6, 9) + Q1[25]; if(Q0[26] != Q1[26]) continue; /* C7 */ Q0[27] = RL(G(Q0[26], Q0[25], Q0[24]) + Q0[23] + X0[19] + 0xf4d50d87, 14) + Q0[26]; Q1[27] = RL(G(Q1[26], Q1[25], Q1[24]) + Q1[23] + X1[19] + 0xf4d50d87, 14) + Q1[26]; if(Q0[27] != Q1[27]) continue; /* B7 */ Q0[28] = RL(G(Q0[27], Q0[26], Q0[25]) + Q0[24] + X0[24] + 0x455a14ed, 20) + Q0[27]; Q1[28] = RL(G(Q1[27], Q1[26], Q1[25]) + Q1[24] + X1[24] + 0x455a14ed, 20) + Q1[27]; if(Q0[28] != Q1[28]) continue; /* A8 */ Q0[29] = RL(G(Q0[28], Q0[27], Q0[26]) + Q0[25] + X0[29] + 0xa9e3e905, 5) + Q0[28]; Q1[29] = RL(G(Q1[28], Q1[27], Q1[26]) + Q1[25] + X1[29] + 0xa9e3e905, 5) + Q1[28]; if(Q0[29] != Q1[29]) continue; /* D8 */ Q0[30] = RL(G(Q0[29], Q0[28], Q0[27]) + Q0[26] + X0[18] + 0xfcefa3f8, 9) + Q0[29]; Q1[30] = RL(G(Q1[29], Q1[28], Q1[27]) + Q1[26] + X1[18] + 0xfcefa3f8, 9) + Q1[29]; if(Q0[30] != Q1[30]) continue; /* C8 */ Q0[31] = RL(G(Q0[30], Q0[29], Q0[28]) + Q0[27] + X0[23] + 0x676f02d9, 14) + Q0[30]; Q1[31] = RL(G(Q1[30], Q1[29], Q1[28]) + Q1[27] + X1[23] + 0x676f02d9, 14) + Q1[30]; if(Q0[31] != Q1[31]) continue; /* B8 */ Q0[32] = RL(G(Q0[31], Q0[30], Q0[29]) + Q0[28] + X0[28] + 0x8d2a4c8a, 20) + Q0[31]; Q1[32] = RL(G(Q1[31], Q1[30], Q1[29]) + Q1[28] + X1[28] + 0x8d2a4c8a, 20) + Q1[31]; if(Q0[32] != Q1[32]) continue; /* A9 */ Q0[33] = RL(H(Q0[32], Q0[31], Q0[30]) + Q0[29] + X0[21] + 0xfffa3942, 4) + Q0[32]; Q1[33] = RL(H(Q1[32], Q1[31], Q1[30]) + Q1[29] + X1[21] + 0xfffa3942, 4) + Q1[32]; if(Q0[33] != Q1[33]) continue; /* D9 */ Q0[34] = RL(H(Q0[33], Q0[32], Q0[31]) + Q0[30] + X0[24] + 0x8771f681, 11) + Q0[33]; Q1[34] = RL(H(Q1[33], Q1[32], Q1[31]) + Q1[30] + X1[24] + 0x8771f681, 11) + Q1[33]; if(Q0[34] != Q1[34]) continue; /* C9 */ Q0[35] = RL(H(Q0[34], Q0[33], Q0[32]) + Q0[31] + X0[27] + 0x6d9d6122, 16) + Q0[34]; Q1[35] = RL(H(Q1[34], Q1[33], Q1[32]) + Q1[31] + X1[27] + 0x6d9d6122, 16) + Q1[34]; if((Q0[35] ^ Q1[35]) != 0x80000000) continue; /* B9 */ Q0[36] = RL(H(Q0[35], Q0[34], Q0[33]) + Q0[32] + X0[30] + 0xfde5380c, 23) + Q0[35]; Q1[36] = RL(H(Q1[35], Q1[34], Q1[33]) + Q1[32] + X1[30] + 0xfde5380c, 23) + Q1[35]; if((Q0[36] ^ Q1[36]) != 0x80000000) continue; /* A10 */ Q0[37] = RL(H(Q0[36], Q0[35], Q0[34]) + Q0[33] + X0[17] + 0xa4beea44, 4) + Q0[36]; Q1[37] = RL(H(Q1[36], Q1[35], Q1[34]) + Q1[33] + X1[17] + 0xa4beea44, 4) + Q1[36]; if((Q0[37] ^ Q1[37]) != 0x80000000) continue; /* D10 */ Q0[38] = RL(H(Q0[37], Q0[36], Q0[35]) + Q0[34] + X0[20] + 0x4bdecfa9, 11) + Q0[37]; Q1[38] = RL(H(Q1[37], Q1[36], Q1[35]) + Q1[34] + X1[20] + 0x4bdecfa9, 11) + Q1[37]; if((Q0[38] ^ Q1[38]) != 0x80000000) continue; /* C10 */ Q0[39] = RL(H(Q0[38], Q0[37], Q0[36]) + Q0[35] + X0[23] + 0xf6bb4b60, 16) + Q0[38]; Q1[39] = RL(H(Q1[38], Q1[37], Q1[36]) + Q1[35] + X1[23] + 0xf6bb4b60, 16) + Q1[38]; if((Q0[39] ^ Q1[39]) != 0x80000000) continue; /* B10 */ Q0[40] = RL(H(Q0[39], Q0[38], Q0[37]) + Q0[36] + X0[26] + 0xbebfbc70, 23) + Q0[39]; Q1[40] = RL(H(Q1[39], Q1[38], Q1[37]) + Q1[36] + X1[26] + 0xbebfbc70, 23) + Q1[39]; if((Q0[40] ^ Q1[40]) != 0x80000000) continue; /* A11 */ Q0[41] = RL(H(Q0[40], Q0[39], Q0[38]) + Q0[37] + X0[29] + 0x289b7ec6, 4) + Q0[40]; Q1[41] = RL(H(Q1[40], Q1[39], Q1[38]) + Q1[37] + X1[29] + 0x289b7ec6, 4) + Q1[40]; if((Q0[41] ^ Q1[41]) != 0x80000000) continue; /* D11 */ Q0[42] = RL(H(Q0[41], Q0[40], Q0[39]) + Q0[38] + X0[16] + 0xeaa127fa, 11) + Q0[41]; Q1[42] = RL(H(Q1[41], Q1[40], Q1[39]) + Q1[38] + X1[16] + 0xeaa127fa, 11) + Q1[41]; if((Q0[42] ^ Q1[42]) != 0x80000000) continue; /* C11 */ Q0[43] = RL(H(Q0[42], Q0[41], Q0[40]) + Q0[39] + X0[19] + 0xd4ef3085, 16) + Q0[42]; Q1[43] = RL(H(Q1[42], Q1[41], Q1[40]) + Q1[39] + X1[19] + 0xd4ef3085, 16) + Q1[42]; if((Q0[43] ^ Q1[43]) != 0x80000000) continue; /* B11 */ Q0[44] = RL(H(Q0[43], Q0[42], Q0[41]) + Q0[40] + X0[22] + 0x04881d05, 23) + Q0[43]; Q1[44] = RL(H(Q1[43], Q1[42], Q1[41]) + Q1[40] + X1[22] + 0x04881d05, 23) + Q1[43]; if((Q0[44] ^ Q1[44]) != 0x80000000) continue; /* A12 */ Q0[45] = RL(H(Q0[44], Q0[43], Q0[42]) + Q0[41] + X0[25] + 0xd9d4d039, 4) + Q0[44]; Q1[45] = RL(H(Q1[44], Q1[43], Q1[42]) + Q1[41] + X1[25] + 0xd9d4d039, 4) + Q1[44]; if((Q0[45] ^ Q1[45]) != 0x80000000) continue; /* D12 */ Q0[46] = RL(H(Q0[45], Q0[44], Q0[43]) + Q0[42] + X0[28] + 0xe6db99e5, 11) + Q0[45]; Q1[46] = RL(H(Q1[45], Q1[44], Q1[43]) + Q1[42] + X1[28] + 0xe6db99e5, 11) + Q1[45]; if((Q0[46] ^ Q1[46]) != 0x80000000) continue; /* C12 */ Q0[47] = RL(H(Q0[46], Q0[45], Q0[44]) + Q0[43] + X0[31] + 0x1fa27cf8, 16) + Q0[46]; Q1[47] = RL(H(Q1[46], Q1[45], Q1[44]) + Q1[43] + X1[31] + 0x1fa27cf8, 16) + Q1[46]; if((Q0[47] ^ Q1[47]) != 0x80000000) continue; /* B12 */ Q0[48] = RL(H(Q0[47], Q0[46], Q0[45]) + Q0[44] + X0[18] + 0xc4ac5665, 23) + Q0[47]; if((Q0[48] & 0x80000000) != (Q0[46] & 0x80000000)) continue; Q1[48] = RL(H(Q1[47], Q1[46], Q1[45]) + Q1[44] + X1[18] + 0xc4ac5665, 23) + Q1[47]; if((Q0[48] ^ Q1[48]) != 0x80000000) continue; /* A13 */ Q0[49] = RL(I(Q0[48], Q0[47], Q0[46]) + Q0[45] + X0[16] + 0xf4292244, 6) + Q0[48]; if((Q0[49] & 0x80000000) != (Q0[47] & 0x80000000)) continue; Q1[49] = RL(I(Q1[48], Q1[47], Q1[46]) + Q1[45] + X1[16] + 0xf4292244, 6) + Q1[48]; if((Q0[49] ^ Q1[49]) != 0x80000000) continue; /* D13 */ Q0[50] = RL(I(Q0[49], Q0[48], Q0[47]) + Q0[46] + X0[23] + 0x432aff97, 10) + Q0[49]; Q1[50] = RL(I(Q1[49], Q1[48], Q1[47]) + Q1[46] + X1[23] + 0x432aff97, 10) + Q1[49]; if((Q0[50] ^ Q1[50]) != 0x80000000) continue; /* C13 */ Q0[51] = RL(I(Q0[50], Q0[49], Q0[48]) + Q0[47] + X0[30] + 0xab9423a7, 15) + Q0[50]; if((Q0[51] & 0x80000000) != (Q0[49] & 0x80000000)) continue; Q1[51] = RL(I(Q1[50], Q1[49], Q1[48]) + Q1[47] + X1[30] + 0xab9423a7, 15) + Q1[50]; if((Q0[51] ^ Q1[51]) != 0x80000000) continue; /* B13 */ Q0[52] = RL(I(Q0[51], Q0[50], Q0[49]) + Q0[48] + X0[21] + 0xfc93a039, 21) + Q0[51]; if((Q0[52] & 0x80000000) != (Q0[50] & 0x80000000)) continue; Q1[52] = RL(I(Q1[51], Q1[50], Q1[49]) + Q1[48] + X1[21] + 0xfc93a039, 21) + Q1[51]; if((Q0[52] ^ Q1[52]) != 0x80000000) continue; /* A14 */ Q0[53] = RL(I(Q0[52], Q0[51], Q0[50]) + Q0[49] + X0[28] + 0x655b59c3, 6) + Q0[52]; if((Q0[53] & 0x80000000) != (Q0[51] & 0x80000000)) continue; Q1[53] = RL(I(Q1[52], Q1[51], Q1[50]) + Q1[49] + X1[28] + 0x655b59c3, 6) + Q1[52]; if((Q0[53] ^ Q1[53]) != 0x80000000) continue; /* D14 */ Q0[54] = RL(I(Q0[53], Q0[52], Q0[51]) + Q0[50] + X0[19] + 0x8f0ccc92, 10) + Q0[53]; if((Q0[54] & 0x80000000) != (Q0[52] & 0x80000000)) continue; Q1[54] = RL(I(Q1[53], Q1[52], Q1[51]) + Q1[50] + X1[19] + 0x8f0ccc92, 10) + Q1[53]; if((Q0[54] ^ Q1[54]) != 0x80000000) continue; /* C14 */ Q0[55] = RL(I(Q0[54], Q0[53], Q0[52]) + Q0[51] + X0[26] + 0xffeff47d, 15) + Q0[54]; if((Q0[55] & 0x80000000) != (Q0[53] & 0x80000000)) continue; Q1[55] = RL(I(Q1[54], Q1[53], Q1[52]) + Q1[51] + X1[26] + 0xffeff47d, 15) + Q1[54]; if((Q0[55] ^ Q1[55]) != 0x80000000) continue; /* B14 */ Q0[56] = RL(I(Q0[55], Q0[54], Q0[53]) + Q0[52] + X0[17] + 0x85845dd1, 21) + Q0[55]; if((Q0[56] & 0x80000000) != (Q0[54] & 0x80000000)) continue; Q1[56] = RL(I(Q1[55], Q1[54], Q1[53]) + Q1[52] + X1[17] + 0x85845dd1, 21) + Q1[55]; if((Q0[56] ^ Q1[56]) != 0x80000000) continue; /* A15 */ Q0[57] = RL(I(Q0[56], Q0[55], Q0[54]) + Q0[53] + X0[24] + 0x6fa87e4f, 6) + Q0[56]; if((Q0[57] & 0x80000000) != (Q0[55] & 0x80000000)) continue; Q1[57] = RL(I(Q1[56], Q1[55], Q1[54]) + Q1[53] + X1[24] + 0x6fa87e4f, 6) + Q1[56]; if((Q0[57] ^ Q1[57]) != 0x80000000) continue; /* D15 */ Q0[58] = RL(I(Q0[57], Q0[56], Q0[55]) + Q0[54] + X0[31] + 0xfe2ce6e0, 10) + Q0[57]; if((Q0[58] & 0x80000000) != (Q0[56] & 0x80000000)) continue; Q1[58] = RL(I(Q1[57], Q1[56], Q1[55]) + Q1[54] + X1[31] + 0xfe2ce6e0, 10) + Q1[57]; if((Q0[58] ^ Q1[58]) != 0x80000000) continue; /* C15 */ Q0[59] = RL(I(Q0[58], Q0[57], Q0[56]) + Q0[55] + X0[22] + 0xa3014314, 15) + Q0[58]; if((Q0[59] & 0x80000000) != (Q0[57] & 0x80000000)) continue; Q1[59] = RL(I(Q1[58], Q1[57], Q1[56]) + Q1[55] + X1[22] + 0xa3014314, 15) + Q1[58]; if((Q0[59] ^ Q1[59]) != 0x80000000) continue; /* B15 */ Q0[60] = RL(I(Q0[59], Q0[58], Q0[57]) + Q0[56] + X0[29] + 0x4e0811a1, 21) + Q0[59]; Q1[60] = RL(I(Q1[59], Q1[58], Q1[57]) + Q1[56] + X1[29] + 0x4e0811a1, 21) + Q1[59]; if((Q0[60] ^ Q1[60]) != 0x80000000) continue; /* A16 */ Q0[61] = RL(I(Q0[60], Q0[59], Q0[58]) + Q0[57] + X0[20] + 0xf7537e82, 6) + Q0[60]; Q1[61] = RL(I(Q1[60], Q1[59], Q1[58]) + Q1[57] + X1[20] + 0xf7537e82, 6) + Q1[60]; if((Q0[61] ^ Q1[61]) != 0x80000000) continue; if((A0 + Q0[61]) != (A1 + Q1[61])) continue; /* D16 */ Q0[62] = RL(I(Q0[61], Q0[60], Q0[59]) + Q0[58] + X0[27] + 0xbd3af235, 10) + Q0[61]; Q1[62] = RL(I(Q1[61], Q1[60], Q1[59]) + Q1[58] + X1[27] + 0xbd3af235, 10) + Q1[61]; if((D0 + Q0[62]) != (D1 + Q1[62])) continue; /* C16 */ Q0[63] = RL(I(Q0[62], Q0[61], Q0[60]) + Q0[59] + X0[18] + 0x2ad7d2bb, 15) + Q0[62]; Q1[63] = RL(I(Q1[62], Q1[61], Q1[60]) + Q1[59] + X1[18] + 0x2ad7d2bb, 15) + Q1[62]; if((C0 + Q0[63]) != (C1 + Q1[63])) continue; /* B16 */ Q0[64] = RL(I(Q0[63], Q0[62], Q0[61]) + Q0[60] + X0[25] + 0xeb86d391, 21) + Q0[63]; Q1[64] = RL(I(Q1[63], Q1[62], Q1[61]) + Q1[60] + X1[25] + 0xeb86d391, 21) + Q1[63]; if((B0 + Q0[64]) != (B1 + Q1[64])) continue; break; } if(i >= LOOP_22) goto block2_again; return; } int main(int argc, char *argv[]) { size_t i; if(argc == 5) { IV[0] = strtoul(argv[1], NULL, 0); IV[1] = strtoul(argv[2], NULL, 0); IV[2] = strtoul(argv[3], NULL, 0); IV[3] = strtoul(argv[4], NULL, 0); } srandom(time(NULL) ^ (getpid() << 16)); block1(); printf("block #1 done/n"); block2(); printf("block #2 done/n"); printf("unsigned int m0[32] = {/n"); for(i = 0; i < 32; i++) { printf("0x%08x, ", X0[ i]); if((i & 3) == 3) printf("/n"); } printf("};/n/n"); printf("unsigned int m1[32] = {/n"); for(i = 0; i < 32; i++) { printf("0x%08x, ", X1[ i]); if((i & 3) == 3) printf("/n"); } printf("};/n/n"); return 0; }
相关文章推荐
- 【转】根据王小云教授的算法写的MD5碰撞的程序[c源代码]
- 根据王小云教授的算法写的MD5碰撞的程序[c源代码]
- MD5 Collision Generator(根据王小云教授的算法写的MD5碰撞的程序[c源代码])
- md5 算法 说明 以及 c源代码
- 密码学领域重大发现:山东大学王小云教授成功破解MD5
- [贴]MD5密码算法C程序
- MD5碰撞的源代码放出了
- .NET平台上编写算法走迷宫的小游戏 (程序+详细文档+源代码)
- ADA +GTKADA 物理碰撞模拟程序(全部源代码)
- 自动安装程序的实现算法和源代码
- 本人目前最短的迷宫生成算法程序源代码
- MD5加密的算法程序源代码
- 密码学领域重大发现:山东大学王小云教授成功破解MD5
- 如何碰撞两个功能不一样,但 MD5 值一样的程序的方法 + 源码公布
- 密码学领域重大发现:山东大学王小云教授成功破解MD5
- 密码学领域重大发现:山东大学王小云教授成功破解MD5
- 自动安装程序的实现算法和源代码
- [突破]山东大学王小云教授成功破解MD5!
- 山东大学王小云教授成功破解MD5
- 密码学领域重大发现:山东大学王小云教授成功破解MD5 (转载)