主题:【原创】说些关于中国密码的事吧 -- ragtime
http://oeeee.com/gz/zsj/fs/t20060221_227162.html
这应该算是真正结合中国语言特点的密码了吧
MD5是有公开的标准算法的,在IETF里面,文件代号RFC1321。那里面有代码你可以参考。其他变种很多只是这个的优化。那里面有对FF,GG,HH,II的定义。
所以回到你的问题1,答案应该是(1)。请注意这里的g和f每16个循环变一次,所以这段程序分别对应FF(前16次循环),GG(次16此循环),HH(再次16次循环),II(最后16次循环)。
最后结果是简单相连,顺序和输入时反过来DCBA。
就要确定一份密码,好保持联系,互通声气.
可惜很少看到有记录具体内容和方法的资料.
这样比较合理,和现代银行使用的认证原理差不多。
反切语里的字音和广东话里的字音还是有一一对应关系。
我又细看了一下,除了http://en.wikipedia.org/wiki/MD5上给出的,其他所有的算法(包括RFC1321)都是(2),而且所有的代码也都是(2),还请ragtime兄再看一下。
还有,我想我的程序是不是32位相加产生了进位才有错误?
又得去糊口了。
其实这两个都是这些函数的定义。你看他们赋值号右边是一样的,区别只在与把值赋给谁。(1)把变换字和移位都完成了,(2)只是算出变换字,没有做移位。你在进入下一循环的转换钱要自己做移位,a->b, b->c, c->d, d->a,再调用FF/GG/HH/II函数。
MD5的转换每一次只改变一个32位字,也就是如你对(2)所说b,c,d不变。所以在下一步转换前要做移位,这样就相当于每4步,原来的128位数据就全变了。
我觉得(1)和(2)还是有区别的,因为每一步都要与512位的message 的其中32位相加。不过两个都不麻烦,改改就行,只要结果是简单相连,看看ABCD的值就行了。但都输不出正确结果,应该是我程序的问题。
A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
代码实现时就变成:
A = 0x67452301;
B = 0xefcdab89;
C = 0x98badcfe;
D = 0x10325476;
何解?
又发现一点:
.NET(win32)下的long的最大数是0x7fffffff, 算法给出的大部分常数都大于它,是不是因此会产生错误? 而unix下的long是64位,会好些?(记不清了,我周末用unix比较麻烦)
还有,是用C++写的,用了bitset<N>这个东东,写”+“重载时, 返回值用了reference, 又是这个Debug编译,返回值加referece(&)和不加referece(&)竟然不一样!? 而用release编译两者相同。 用relese编译完后,有一句:“代码生成结束。”而Debug编译完就没有这句话。 我想,是不是relese是最终的编译?
换成long也不是正确结果。周末好好想想。。。
(老兄要忙,就不要理我了,让我一个人意淫吧)
(1)的算法我以前用过,肯定没错。(2)也没错。不是这个的问题。写这种程序细节非常重要。进位,移位,变量类型,操作次序等等。
要不你把程序贴出来?
ragtime兄,本想这个周末把我理解的算法贴上来,不行啊,要糊口,而且程序要改的地方很多,暂时没时间,只好将这个小东东放一放。
已经献上2个通宝,望查收。
粗看了一下,第一个问题:你的F,G,H,I怎么都一样啊?这个不对啊。
比如F应该是((B) & (C)) | ((~B) & (D))。你的四个其实都是G的定义。
// Round 1
FF (a, b, c, d, M[ 0].to_ulong(), 7, 0Xd76aa478);
FF (d, a, b, c, M[ 1].to_ulong(), 12, 0Xe8c7b756);
FF (c, d, a, b, M[ 2].to_ulong(), 17, 0X242070db);
FF (b, c, d, a, M[ 3].to_ulong(), 22, 0Xc1bdceee);
FF (a, b, c, d, M[ 4].to_ulong(), 7, 0Xf57c0faf);
FF (d, a, b, c, M[ 5].to_ulong(), 12, 0X4787c62a);
FF (c, d, a, b, M[ 6].to_ulong(), 17, 0Xa8304613);
FF (b, c, d, a, M[ 7].to_ulong(), 22, 0Xfd469501);
FF (a, b, c, d, M[ 8].to_ulong(), 7, 0X698098d8);
FF (d, a, b, c, M[ 9].to_ulong(), 12, 0X8b44f7af);
FF (c, d, a, b, M[10].to_ulong(), 17, 0Xffff5bb1);
FF (b, c, d, a, M[11].to_ulong(), 22, 0X895cd7be);
FF (a, b, c, d, M[12].to_ulong(), 7, 0X6b901122);
FF (d, a, b, c, M[13].to_ulong(), 12, 0Xfd987193);
FF (c, d, a, b, M[14].to_ulong(), 17, 0Xa679438e);
FF (b, c, d, a, M[15].to_ulong(), 22, 0X49b40821);
// Round 2
GG (a, b, c, d, M[ 1].to_ulong(), 5, 0Xf61e2562);
GG (d, a, b, c, M[ 6].to_ulong(), 9, 0Xc040b340);
GG (c, d, a, b, M[11].to_ulong(), 14, 0X265e5a51);
GG (b, c, d, a, M[ 0].to_ulong(), 20, 0Xe9b6c7aa);
GG (a, b, c, d, M[ 5].to_ulong(), 5, 0Xd62f105d);
GG (d, a, b, c, M[10].to_ulong(), 9, 0X2441453);
GG (c, d, a, b, M[15].to_ulong(), 14, 0Xd8a1e681);
GG (b, c, d, a, M[ 4].to_ulong(), 20, 0Xe7d3fbc8);
GG (a, b, c, d, M[ 9].to_ulong(), 5, 0X21e1cde6);
GG (d, a, b, c, M[14].to_ulong(), 9, 0Xc33707d6);
GG (c, d, a, b, M[ 3].to_ulong(), 14, 0Xf4d50d87);
GG (b, c, d, a, M[ 8].to_ulong(), 20, 0X455a14ed);
GG (a, b, c, d, M[13].to_ulong(), 5, 0Xa9e3e905);
GG (d, a, b, c, M[ 2].to_ulong(), 9, 0Xfcefa3f8);
GG (c, d, a, b, M[ 7].to_ulong(), 14, 0X676f02d9);
GG (b, c, d, a, M[12].to_ulong(), 20, 0X8d2a4c8a);
// Round 3
HH (a, b, c, d, M[ 5].to_ulong(), 4, 0Xfffa3942);
HH (d, a, b, c, M[ 8].to_ulong(), 11, 0X8771f681);
HH (c, d, a, b, M[11].to_ulong(), 16, 0X6d9d6122);
HH (b, c, d, a, M[14].to_ulong(), 23, 0Xfde5380c);
HH (a, b, c, d, M[ 1].to_ulong(), 4, 0Xa4beea44);
HH (d, a, b, c, M[ 4].to_ulong(), 11, 0X4bdecfa9);
HH (c, d, a, b, M[ 7].to_ulong(), 16, 0Xf6bb4b60);
HH (b, c, d, a, M[10].to_ulong(), 23, 0Xbebfbc70);
HH (a, b, c, d, M[13].to_ulong(), 4, 0X289b7ec6);
HH (d, a, b, c, M[ 0].to_ulong(), 11, 0Xeaa127fa);
HH (c, d, a, b, M[ 3].to_ulong(), 16, 0Xd4ef3085);
HH (b, c, d, a, M[ 6].to_ulong(), 23, 0X4881d05);
HH (a, b, c, d, M[ 9].to_ulong(), 4, 0Xd9d4d039);
HH (d, a, b, c, M[12].to_ulong(), 11, 0Xe6db99e5);
HH (c, d, a, b, M[15].to_ulong(), 16, 0X1fa27cf8);
HH (b, c, d, a, M[ 2].to_ulong(), 23, 0Xc4ac5665);
// Round 4
II (a, b, c, d, M[ 0].to_ulong(), 6, 0Xf4292244);
II (d, a, b, c, M[ 7].to_ulong(), 10, 0X432aff97);
II (c, d, a, b, M[14].to_ulong(), 15, 0Xab9423a7);
II (b, c, d, a, M[ 5].to_ulong(), 21, 0Xfc93a039);
II (a, b, c, d, M[12].to_ulong(), 6, 0X655b59c3);
II (d, a, b, c, M[ 3].to_ulong(), 10, 0X8f0ccc92);
II (c, d, a, b, M[10].to_ulong(), 15, 0Xffeff47d);
II (b, c, d, a, M[ 1].to_ulong(), 21, 0X85845dd1);
II (a, b, c, d, M[ 8].to_ulong(), 6, 0X6fa87e4f);
II (d, a, b, c, M[15].to_ulong(), 10, 0Xfe2ce6e0);
II (c, d, a, b, M[ 6].to_ulong(), 15, 0Xa3014314);
II (b, c, d, a, M[13].to_ulong(), 21, 0X4e0811a1);
II (a, b, c, d, M[ 4].to_ulong(), 6, 0Xf7537e82);
II (d, a, b, c, M[11].to_ulong(), 10, 0Xbd3af235);
II (c, d, a, b, M[ 2].to_ulong(), 15, 0X2ad7d2bb);
II (b, c, d, a, M[ 9].to_ulong(), 21, 0Xeb86d391);
恭喜:意外获得【西西河通宝】一枚
谢谢:作者意外获得【西西河通宝】一枚
鲜花已经成功送出
返回
哈阿哈哈哈哈, 老铁不给俺转老兄通宝, 俺自己有招!
今天真爽,MD5完成,送你通宝的愿也还了,明天轻松糊口去!