五千年(敝帚自珍)

主题:【原创】说些关于中国密码的事吧 -- ragtime

共:💬28 🌺29
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 【文摘】反切语

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)也没错。不是这个的问题。写这种程序细节非常重要。进位,移位,变量类型,操作次序等等。

要不你把程序贴出来?

家园 MD5

ragtime兄,本想这个周末把我理解的算法贴上来,不行啊,要糊口,而且程序要改的地方很多,暂时没时间,只好将这个小东东放一放。

已经献上2个通宝,望查收。

MD5
家园 不必说这种话嘛

粗看了一下,第一个问题:你的F,G,H,I怎么都一样啊?这个不对啊。

比如F应该是((B) & (C)) | ((~B) & (D))。你的四个其实都是G的定义。

家园 FF,GG,HH,II 供调试用

// 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完成,送你通宝的愿也还了,明天轻松糊口去!

全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河