设为首页收藏本站帮助中心
查看: 10015|回复: 20
收起左侧

易语言MD5计算模块纯算法源码 - 绝不调用任何DLL的API与其他支持库实现MD5计算功能

[复制链接]
发表于 2018-2-21 08:54:33 | 显示全部楼层 |阅读模式
算法纯核心库实现,与 取数据摘要() 计算出的结果不一致就会暂停,算法移植到了易语言,新人可拿去研究。

  1. .版本 2
  2. .支持库 dp1

  3. .程序集 MD5计算模块
  4. .程序集变量 AA, 整数型
  5. .程序集变量 BB, 整数型
  6. .程序集变量 CC, 整数型
  7. .程序集变量 DD, 整数型

  8. .子程序 _启动子程序, 整数型


  9. _临时子程序 ()
  10. 返回 (0)

  11. .子程序 _临时子程序
  12. .局部变量 字节集, 字节集
  13. .局部变量 系统计算的MD5, 文本型
  14. .局部变量 本程序计算的MD5, 文本型

  15. ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
  16. 置随机数种子 ()
  17. .计次循环首 (100, )
  18.     字节集 = 随机字节集 ()
  19.     系统计算的MD5 = 取数据摘要 (字节集)
  20.     本程序计算的MD5 = MD5 (字节集)
  21.     .如果真 (系统计算的MD5 ≠ 本程序计算的MD5)
  22.         暂停 ()
  23.     .如果真结束
  24.     输出调试文本 (本程序计算的MD5)
  25. .计次循环尾 ()



  26. .子程序 随机字节集, 字节集
  27. .局部变量 长度, 整数型
  28. .局部变量 返回值, 字节集
  29. .局部变量 计数, 整数型

  30. 长度 = 取随机数 (1, 32767)
  31. 返回值 = 取空白字节集 (长度)
  32. .计次循环首 (长度, 计数)
  33.     返回值 [计数] = 取随机数 (0, 255)
  34. .计次循环尾 ()
  35. 返回 (返回值)


  36. .子程序 初始化

  37. AA = 1732584193
  38. BB = -271733879
  39. CC = -1732584194
  40. DD = 271733878


  41. .子程序 循环左移, 整数型
  42. .参数 欲移动的整数, 整数型
  43. .参数 欲移动的位数, 整数型
  44. .局部变量 字节集, 字节集
  45. .局部变量 进位输入, 逻辑型
  46. .局部变量 进位输出, 逻辑型
  47. .局部变量 计数, 整数型
  48. .局部变量 移出的位, 逻辑型

  49. 字节集 = 到字节集 (欲移动的整数)
  50. .计次循环首 (欲移动的位数 % 32, )
  51.     进位输入 = 假
  52.     移出的位 = 字节集 [4] ≥ 128
  53.     .计次循环首 (4, 计数)
  54.         进位输出 = 字节集 [计数] ≥ 128
  55.         字节集 [计数] = 左移 (字节集 [计数], 1) + 到字节 (进位输入)
  56.         进位输入 = 进位输出
  57.     .计次循环尾 ()
  58.     字节集 [1] = 字节集 [1] + 到字节 (移出的位)
  59. .计次循环尾 ()
  60. 返回 (字节集到整数 (字节集))

  61. .子程序 F, 整数型
  62. .参数 X, 整数型
  63. .参数 Y, 整数型
  64. .参数 Z, 整数型

  65. 返回 (位或 (位与 (X, Y), 位与 (位取反 (X), Z)))


  66. .子程序 G, 整数型
  67. .参数 X, 整数型
  68. .参数 Y, 整数型
  69. .参数 Z, 整数型

  70. 返回 (位或 (位与 (X, Z), 位与 (Y, 位取反 (Z))))


  71. .子程序 H, 整数型
  72. .参数 X, 整数型
  73. .参数 Y, 整数型
  74. .参数 Z, 整数型

  75. 返回 (位异或 (X, Y, Z))


  76. .子程序 I, 整数型
  77. .参数 X, 整数型
  78. .参数 Y, 整数型
  79. .参数 Z, 整数型

  80. 返回 (位异或 (Y, 位或 (X, 位取反 (Z))))


  81. .子程序 FF
  82. .参数 a, 整数型, 参考
  83. .参数 b, 整数型
  84. .参数 c, 整数型
  85. .参数 d, 整数型
  86. .参数 Mj, 整数型
  87. .参数 s, 整数型
  88. .参数 ti, 整数型

  89. a = b + 循环左移 (a + F (b, c, d) + Mj + ti, s)

  90. .子程序 GG
  91. .参数 a, 整数型, 参考
  92. .参数 b, 整数型
  93. .参数 c, 整数型
  94. .参数 d, 整数型
  95. .参数 Mj, 整数型
  96. .参数 s, 整数型
  97. .参数 ti, 整数型

  98. a = b + 循环左移 (a + G (b, c, d) + Mj + ti, s)

  99. .子程序 HH
  100. .参数 a, 整数型, 参考
  101. .参数 b, 整数型
  102. .参数 c, 整数型
  103. .参数 d, 整数型
  104. .参数 Mj, 整数型
  105. .参数 s, 整数型
  106. .参数 ti, 整数型

  107. a = b + 循环左移 (a + H (b, c, d) + Mj + ti, s)

  108. .子程序 II
  109. .参数 a, 整数型, 参考
  110. .参数 b, 整数型
  111. .参数 c, 整数型
  112. .参数 d, 整数型
  113. .参数 Mj, 整数型
  114. .参数 s, 整数型
  115. .参数 ti, 整数型

  116. a = b + 循环左移 (a + I (b, c, d) + Mj + ti, s)

  117. .子程序 主要循环
  118. .参数 x, 整数型, 数组
  119. .局部变量 A, 整数型
  120. .局部变量 B, 整数型
  121. .局部变量 C, 整数型
  122. .局部变量 D, 整数型

  123. A = AA
  124. B = BB
  125. C = CC
  126. D = DD

  127. FF (A, B, C, D, x [1], 7, -680876936)
  128. FF (D, A, B, C, x [2], 12, -389564586)
  129. FF (C, D, A, B, x [3], 17, 606105819)
  130. FF (B, C, D, A, x [4], 22, -1044525330)
  131. FF (A, B, C, D, x [5], 7, -176418897)
  132. FF (D, A, B, C, x [6], 12, 1200080426)
  133. FF (C, D, A, B, x [7], 17, -1473231341)
  134. FF (B, C, D, A, x [8], 22, -45705983)
  135. FF (A, B, C, D, x [9], 7, 1770035416)
  136. FF (D, A, B, C, x [10], 12, -1958414417)
  137. FF (C, D, A, B, x [11], 17, -42063)
  138. FF (B, C, D, A, x [12], 22, -1990404162)
  139. FF (A, B, C, D, x [13], 7, 1804603682)
  140. FF (D, A, B, C, x [14], 12, -40341101)
  141. FF (C, D, A, B, x [15], 17, -1502002290)
  142. FF (B, C, D, A, x [16], 22, 1236535329)
  143. GG (A, B, C, D, x [2], 5, -165796510)
  144. GG (D, A, B, C, x [7], 9, -1069501632)
  145. GG (C, D, A, B, x [12], 14, 643717713)
  146. GG (B, C, D, A, x [1], 20, -373897302)
  147. GG (A, B, C, D, x [6], 5, -701558691)
  148. GG (D, A, B, C, x [11], 9, 38016083)
  149. GG (C, D, A, B, x [16], 14, -660478335)
  150. GG (B, C, D, A, x [5], 20, -405537848)
  151. GG (A, B, C, D, x [10], 5, 568446438)
  152. GG (D, A, B, C, x [15], 9, -1019803690)
  153. GG (C, D, A, B, x [4], 14, -187363961)
  154. GG (B, C, D, A, x [9], 20, 1163531501)
  155. GG (A, B, C, D, x [14], 5, -1444681467)
  156. GG (D, A, B, C, x [3], 9, -51403784)
  157. GG (C, D, A, B, x [8], 14, 1735328473)
  158. GG (B, C, D, A, x [13], 20, -1926607734)
  159. HH (A, B, C, D, x [6], 4, -378558)
  160. HH (D, A, B, C, x [9], 11, -2022574463)
  161. HH (C, D, A, B, x [12], 16, 1839030562)
  162. HH (B, C, D, A, x [15], 23, -35309556)
  163. HH (A, B, C, D, x [2], 4, -1530992060)
  164. HH (D, A, B, C, x [5], 11, 1272893353)
  165. HH (C, D, A, B, x [8], 16, -155497632)
  166. HH (B, C, D, A, x [11], 23, -1094730640)
  167. HH (A, B, C, D, x [14], 4, 681279174)
  168. HH (D, A, B, C, x [1], 11, -358537222)
  169. HH (C, D, A, B, x [4], 16, -722521979)
  170. HH (B, C, D, A, x [7], 23, 76029189)
  171. HH (A, B, C, D, x [10], 4, -640364487)
  172. HH (D, A, B, C, x [13], 11, -421815835)
  173. HH (C, D, A, B, x [16], 16, 530742520)
  174. HH (B, C, D, A, x [3], 23, -995338651)
  175. II (A, B, C, D, x [1], 6, -198630844)
  176. II (D, A, B, C, x [8], 10, 1126891415)
  177. II (C, D, A, B, x [15], 15, -1416354905)
  178. II (B, C, D, A, x [6], 21, -57434055)
  179. II (A, B, C, D, x [13], 6, 1700485571)
  180. II (D, A, B, C, x [4], 10, -1894986606)
  181. II (C, D, A, B, x [11], 15, -1051523)
  182. II (B, C, D, A, x [2], 21, -2054922799)
  183. II (A, B, C, D, x [9], 6, 1873313359)
  184. II (D, A, B, C, x [16], 10, -30611744)
  185. II (C, D, A, B, x [7], 15, -1560198380)
  186. II (B, C, D, A, x [14], 21, 1309151649)
  187. II (A, B, C, D, x [5], 6, -145523070)
  188. II (D, A, B, C, x [12], 10, -1120210379)
  189. II (C, D, A, B, x [3], 15, 718787259)
  190. II (B, C, D, A, x [10], 21, -343485551)
  191. AA = AA + A
  192. BB = BB + B
  193. CC = CC + C
  194. DD = DD + D


  195. .子程序 级联, 文本型
  196. .参数 值1, 整数型
  197. .参数 值2, 整数型
  198. .参数 值3, 整数型
  199. .参数 值4, 整数型
  200. .局部变量 数据, 字节集
  201. .局部变量 计数, 整数型
  202. .局部变量 十六进制文本, 文本型
  203. .局部变量 返回值, 文本型

  204. 数据 = 到字节集 (值1) + 到字节集 (值2) + 到字节集 (值3) + 到字节集 (值4)
  205. 十六进制文本 = “0123456789abcdef”
  206. 返回值 = “”
  207. .计次循环首 (16, 计数)
  208.     返回值 = 返回值 + 取文本中间 (十六进制文本, 右移 (数据 [计数], 4) + 1, 1) + 取文本中间 (十六进制文本, 位与 (数据 [计数], 15) + 1, 1)
  209. .计次循环尾 ()
  210. 返回 (返回值)

  211. .子程序 字节集到整数, 整数型
  212. .参数 字节集, 字节集

  213. 返回 (合并整数 (合并短整数 (到字节 (字节集 [1]), 到字节 (字节集 [2])), 合并短整数 (到字节 (字节集 [3]), 到字节 (字节集 [4]))))

  214. .子程序 字节集到整数数组
  215. .参数 数据, 字节集
  216. .参数 整数, 整数型, 参考 数组
  217. .局部变量 长度, 整数型
  218. .局部变量 计数, 整数型

  219. 长度 = 取字节集长度 (数据)
  220. 重定义数组 (整数, 假, 0)
  221. .变量循环首 (0, 长度 - 1, 4, 计数)
  222.     加入成员 (整数, 字节集到整数 (取字节集中间 (数据, 计数 + 1, 4)))
  223. .变量循环尾 ()

  224. .子程序 填充, 字节集
  225. .参数 填充的数据, 字节集
  226. .局部变量 位长, 长整数型

  227. 位长 = 取字节集长度 (填充的数据) × 8
  228. 填充的数据 = 填充的数据 + { 128 }
  229. .判断循环首 (取字节集长度 (填充的数据) % 64 ≠ 56)
  230.     填充的数据 = 填充的数据 + { 0 }
  231. .判断循环尾 ()
  232. 填充的数据 = 填充的数据 + 到字节集 (位长)
  233. 返回 (填充的数据)

  234. .子程序 MD5, 文本型, 公开
  235. .参数 字节集数据, 字节集
  236. .局部变量 字节集, 字节集
  237. .局部变量 整数分组数组, 整数型, , "0"
  238. .局部变量 计数, 整数型

  239. 初始化 ()
  240. 字节集 = 字节集数据
  241. 字节集 = 填充 (字节集)
  242. .变量循环首 (1, 取字节集长度 (字节集), 64, 计数)
  243.     字节集到整数数组 (取字节集中间 (字节集, 计数, 64), 整数分组数组)
  244.     主要循环 (整数分组数组)
  245. .变量循环尾 ()
  246. 返回 (级联 (AA, BB, CC, DD))


复制代码

评分

1

查看全部评分

回复

使用道具 举报

发表于 2018-2-21 22:02:39 | 显示全部楼层
小萌 发表于 2018-2-21 11:15
貌似计算几百MB以上的数据可能会出错。

这个内存可能不够吧还是别的原因。
回复 支持 反对

使用道具 举报

发表于 2018-2-22 09:05:55 | 显示全部楼层
HNY 发表于 2018-2-21 22:05
测试了1mb的数据,比系统带的慢了N倍,没出现错误。

应该是循环左移的问题。
回复 支持 反对

使用道具 举报

发表于 2021-12-11 20:42:05 | 显示全部楼层
demon 发表于 2018-2-23 11:43
...这变量名,这子程序...

好像没什么问题的吧
回复 支持 反对

使用道具 举报

发表于 2018-2-21 09:12:35 | 显示全部楼层
5a5x那边计算这的都是借助js或vbs什么实现的,简直就是糊弄鬼了。
回复 支持 反对

使用道具 举报

发表于 2018-2-21 11:15:12 | 显示全部楼层
本帖最后由 小萌 于 2018-2-21 11:18 编辑

貌似计算几百MB以上的数据可能会出错。
回复 支持 反对

使用道具 举报

发表于 2018-2-21 13:05:35 | 显示全部楼层
看看咋实现的
回复 支持 反对

使用道具 举报

发表于 2018-2-21 14:32:12 | 显示全部楼层
看来这玩意真能口算
回复 支持 反对

使用道具 举报

发表于 2018-2-21 16:27:00 | 显示全部楼层
不错,正好需要
回复 支持 反对

使用道具 举报

发表于 2018-2-21 19:10:31 | 显示全部楼层
没想到如此简单
回复 支持 反对

使用道具 举报

发表于 2018-2-21 22:05:07 | 显示全部楼层
测试了1mb的数据,比系统带的慢了N倍,没出现错误。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则