本帖最后由 是要不要骑牛您 于 2011-6-26 23:08 编辑
今天试着用易语言写了下MD5的处理过程,发现够累的,还有不少问题,输出总是不对,和标准不同,这里特请高手指点迷津- .版本 2
- .支持库 spec
- .程序集 MD5
- .程序集变量 A, 整数型
- .程序集变量 B, 整数型
- .程序集变量 C, 整数型
- .程序集变量 D, 整数型
- .子程序 MD5_初始化
- A = 1732584193
- B = 2309737967
- C = 4275878552
- D = 1985229328
- 调试输出 (A, B, C, D)
- ' MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
- ' MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
- ' MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
- .子程序 F, 整数型, , F(X,Y,Z)=(X∧Y)∨((~X)∧Z)
- .参数 X, 整数型
- .参数 Y, 整数型
- .参数 Z, 整数型
- 返回 (位或 (位与 (X, Y), 位与 (位取反 (X), Z)))
- .子程序 G, 整数型, , G(X,Y,Z)=(X∧Z)∨(Y∧(~Z))
- .参数 X, 整数型
- .参数 Y, 整数型
- .参数 Z, 整数型
- 返回 (位或 (位与 (X, Z), 位与 (Y, 位取反 (Z))))
- .子程序 H, 整数型, , H(X,Y,Z)=X⊕Y⊕Z
- .参数 X, 整数型
- .参数 Y, 整数型
- .参数 Z, 整数型
- 返回 (位异或 (位异或 (X, Y), Z))
- .子程序 I, 整数型, , I(X,Y,Z)=Y⊕(X∨( Z))
- .参数 X, 整数型
- .参数 Y, 整数型
- .参数 Z, 整数型
- 返回 (位异或 (Y, 位或 (X, 位取反 (Z))))
- .子程序 FF, , , FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)
- .参数 a, 整数型, 参考
- .参数 b, 整数型
- .参数 c, 整数型
- .参数 d, 整数型
- .参数 Mj, 整数型
- .参数 s, 整数型
- .参数 ti, 整数型
- a = b + RL (a + F (b, c, d) + Mj + ti, s)
- .子程序 GG, , , GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s)
- .参数 a, 整数型, 参考
- .参数 b, 整数型
- .参数 c, 整数型
- .参数 d, 整数型
- .参数 Mj, 整数型
- .参数 s, 整数型
- .参数 ti, 整数型
- a = b + RL (a + G (b, c, d) + Mj + ti, s)
- .子程序 HH, , , HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s)
- .参数 a, 整数型, 参考
- .参数 b, 整数型
- .参数 c, 整数型
- .参数 d, 整数型
- .参数 Mj, 整数型
- .参数 s, 整数型
- .参数 ti, 整数型
- a = b + RL (a + H (b, c, d) + Mj + ti, s)
- .子程序 II, , , II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s)
- .参数 a, 整数型, 参考
- .参数 b, 整数型
- .参数 c, 整数型
- .参数 d, 整数型
- .参数 Mj, 整数型
- .参数 s, 整数型
- .参数 ti, 整数型
- a = b + RL (a + I (b, c, d) + Mj + ti, s)
- .子程序 RL, 整数型, , x向左循环移y位
- .参数 x, 整数型
- .参数 y, 整数型
- 返回 (位或 (左移 (x, y), 右移 (x, 32 - y)))
- .子程序 PP, 整数型, , 将x高低位互换
- .参数 x, 整数型
- 返回 (位或 (位或 (位或 (左移 (x, 24), 位与 (左移 (x, 8), 16711680)), 位与 (右移 (x, 8), 65280)), 右移 (x, 24)))
- .子程序 MD5_轮运算, , , MD5核心算法,共64轮
- .参数 a, 整数型, 参考
- .参数 b, 整数型, 参考
- .参数 c, 整数型, 参考
- .参数 d, 整数型, 参考
- .参数 x, 整数型, 数组
- .局部变量 aa, 整数型
- .局部变量 bb, 整数型
- .局部变量 cc, 整数型
- .局部变量 dd, 整数型
- aa = a
- bb = b
- cc = c
- dd = d
- FF (a, b, c, d, x [1], 7, 3614090360)
- FF (d, a, b, c, x [2], 12, 3905402710)
- FF (c, d, a, b, x [3], 17, 606105819)
- FF (b, c, d, a, x [4], 22, 3250441966)
- FF (a, b, c, d, x [5], 7, 4118548399)
- FF (d, a, b, c, x [6], 12, 1200080426)
- FF (c, d, a, b, x [7], 17, 2821735955)
- FF (b, c, d, a, x [8], 22, 4249261313)
- FF (a, b, c, d, x [9], 7, 1770035416)
- FF (d, a, b, c, x [10], 12, 2336552879)
- FF (c, d, a, b, x [11], 17, 4294925233)
- FF (b, c, d, a, x [12], 22, 2304563134)
- FF (a, b, c, d, x [13], 7, 1804603682)
- FF (d, a, b, c, x [14], 12, 4254626195)
- FF (c, d, a, b, x [15], 17, 2792965006)
- FF (b, c, d, a, x [16], 22, 1236535329)
- GG (a, b, c, d, x [2], 5, 4129170786)
- GG (d, a, b, c, x [7], 9, 3225465664)
- GG (c, d, a, b, x [12], 14, 643717713)
- GG (b, c, d, a, x [1], 20, 3921069994)
- GG (a, b, c, d, x [6], 5, 3593408605)
- GG (d, a, b, c, x [11], 9, 38016083)
- GG (c, d, a, b, x [16], 14, 3634488961)
- GG (b, c, d, a, x [5], 20, 3889429448)
- GG (a, b, c, d, x [10], 5, 568446438)
- GG (d, a, b, c, x [15], 9, 3275163606)
- GG (c, d, a, b, x [4], 14, 4107603335)
- GG (b, c, d, a, x [9], 20, 1163531501)
- GG (a, b, c, d, x [14], 5, 2850285829)
- GG (d, a, b, c, x [3], 9, 4243563512)
- GG (c, d, a, b, x [8], 14, 1735328473)
- GG (b, c, d, a, x [13], 20, 2368359562)
- HH (a, b, c, d, x [6], 4, 4294588738)
- HH (d, a, b, c, x [9], 11, 2272392833)
- HH (c, d, a, b, x [12], 16, 1839030562)
- HH (b, c, d, a, x [15], 23, 4259657740)
- HH (a, b, c, d, x [2], 4, 2763975236)
- HH (d, a, b, c, x [5], 11, 1272893353)
- HH (c, d, a, b, x [8], 16, 4139469664)
- HH (b, c, d, a, x [11], 23, 3200236656)
- HH (a, b, c, d, x [14], 4, 681279174)
- HH (d, a, b, c, x [1], 11, 3936430074)
- HH (c, d, a, b, x [4], 16, 3572445317)
- HH (b, c, d, a, x [7], 23, 76029189)
- HH (a, b, c, d, x [10], 4, 3654602809)
- HH (d, a, b, c, x [13], 11, 3873151461)
- HH (c, d, a, b, x [16], 16, 530742520)
- HH (b, c, d, a, x [3], 23, 3299628645)
- II (a, b, c, d, x [1], 6, 4096336452)
- II (d, a, b, c, x [8], 10, 1126891415)
- II (c, d, a, b, x [15], 15, 2878612391)
- II (b, c, d, a, x [6], 21, 4237533241)
- II (a, b, c, d, x [13], 6, 1700485571)
- II (d, a, b, c, x [4], 10, 2399980690)
- II (c, d, a, b, x [11], 15, 4293915773)
- II (b, c, d, a, x [2], 21, 2240044497)
- II (a, b, c, d, x [9], 6, 1873313359)
- II (d, a, b, c, x [16], 10, 4264355552)
- II (c, d, a, b, x [7], 15, 2734768916)
- II (b, c, d, a, x [14], 21, 1309151649)
- II (a, b, c, d, x [5], 6, 4149444226)
- II (d, a, b, c, x [12], 10, 3174756917)
- II (c, d, a, b, x [3], 15, 718787259)
- II (b, c, d, a, x [10], 21, 3951481745)
- a = aa + a
- b = bb + b
- c = cc + c
- d = dd + d
- .子程序 MD5_计算, , 公开
- .参数 参数, 字节集
- .局部变量 len, 长整数型
- .局部变量 j, 整数型
- .局部变量 tmp, 字节集
- .局部变量 x, 整数型, , "16"
- .局部变量 k, 整数型
- .局部变量 aa, 整数型
- .局部变量 bb, 整数型
- .局部变量 cc, 整数型
- .局部变量 dd, 整数型
- .局部变量 临时, 整数型
- .局部变量 ch, 字节型
- aa = A
- bb = B
- cc = C
- dd = D
- len = 取字节集长度 (参数)
- j = len % 64
- .如果真 (j ≠ 56)
- .如果 (j < 56)
- tmp = 取空白字节集 (56 - j)
- .否则
- tmp = 取空白字节集 (64 + 56 - j)
- .如果结束
- tmp [1] = 128
- 参数 = 参数 + tmp
- .如果真结束
- tmp = 到字节集 (len)
- ch = tmp [1]
- .计次循环首 (7, j)
- tmp [1] = tmp [8 - j + 1]
- .计次循环尾 ()
- tmp [8] = ch
- 参数 = 参数 + tmp
- 临时 = 打开内存文件 ()
- 写出字节集 (临时, 参数)
- 移到文件首 (临时)
- .变量循环首 (0, len \ 64, 1, )
- .计次循环首 (16, j)
- 读入数据 (临时, ch)
- x [j] = 左移 (ch, 24)
- 读入数据 (临时, ch)
- x [j] = 位或 (x [j], 左移 (ch, 16))
- 读入数据 (临时, ch)
- x [j] = 位或 (x [j], 左移 (ch, 8))
- 读入数据 (临时, ch)
- x [j] = 位或 (x [j], ch)
- ' 读入数据 (临时, x [j])
- .计次循环尾 ()
- MD5_轮运算 (aa, bb, cc, dd, x)
- .变量循环尾 ()
- 调试输出 (取十六进制文本 (aa), 取十六进制文本 (bb), 取十六进制文本 (cc), 取十六进制文本 (dd))
- 关闭文件 (临时)
复制代码 |