设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 3925|回复: 2
收起左侧

大文件MD5计算模块算法源码 最大2GB 稳定不出错 算法核心库实现

[复制链接]
发表于 2018-9-29 16:57:02 | 显示全部楼层 |阅读模式
本帖最后由 QAQ 于 2018-9-29 16:57 编辑

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

  3. .程序集 文件MD5计算
  4. .程序集变量 AA, 整数型
  5. .程序集变量 BB, 整数型
  6. .程序集变量 CC, 整数型
  7. .程序集变量 DD, 整数型
  8. .程序集变量 百分比, 双精度小数型
  9. .程序集变量 旧百分比, 双精度小数型
  10. .程序集变量 百分比时间, 双精度小数型
  11. .程序集变量 旧百分比时间, 双精度小数型
  12. .程序集变量 百分比显示, 逻辑型

  13. .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码


  14. _临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
  15. 返回 (0)  ' 可以根据您的需要返回任意数值

  16. .子程序 _临时子程序
  17. .局部变量 长度, 整数型
  18. .局部变量 字节集, 字节集

  19. ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
  20. 百分比显示 = 假

  21. .计次循环首 (1000, 长度)
  22.     字节集 = 随机字节集 (长度)
  23.     .如果真 (MD5_字节集 (字节集) ≠ 取数据摘要 (字节集))
  24.         暂停 ()

  25.     .如果真结束

  26. .计次循环尾 ()

  27. 输出调试文本 (“完成”)
  28. 百分比显示 = 真
  29. 输出调试文本 (MD5_文件 (“D:\file.bin”))

  30. .子程序 MD5_文件, 文本型, 公开, 计算一个文件的MD5
  31. .参数 文件名, 文本型, , 提供文件名以及路径,最大2147483647字节
  32. .局部变量 文件号, 整数型
  33. .局部变量 长度, 整数型
  34. .局部变量 块数, 整数型
  35. .局部变量 计数, 整数型
  36. .局部变量 MD5块, 字节集
  37. .局部变量 MD5整数块, 整数型, , "16"
  38. .局部变量 块计数, 整数型
  39. .局部变量 索引位置, 整数型
  40. .局部变量 时间, 整数型

  41. 长度 = 取文件尺寸 (文件名)
  42. .如果真 (长度 < 0)
  43.     输出调试文本 (“获取文件尺寸失败”)
  44.     返回 (“”)
  45. .如果真结束

  46. 文件号 = 打开文件 (文件名, 1, 3)
  47. .如果真 (文件号 = 0)
  48.     输出调试文本 (“打开文件失败”)
  49.     返回 (“”)
  50. .如果真结束
  51. .如果真 (百分比显示)
  52.     百分比 = 0
  53.     旧百分比 = 0
  54.     百分比时间 = 0
  55.     旧百分比时间 = 取启动时间 ()

  56. .如果真结束

  57. 块数 = 计算块数 (长度)

  58. MD5初始化 ()
  59. .计次循环首 (块数, 计数)
  60.     MD5块 = MD5_读文件块 (文件号, 计数, 块数, 长度)
  61.     索引位置 = 1
  62.     .计次循环首 (16, 块计数)
  63.         MD5整数块 [块计数] = 取字节集数据 (MD5块, 3, 索引位置)
  64.     .计次循环尾 ()
  65.     主要循环 (MD5整数块)
  66. .计次循环尾 ()
  67. 返回 (级联 (AA, BB, CC, DD))



  68. .子程序 MD5_字节集, 文本型
  69. .参数 字节集, 字节集
  70. .局部变量 文件名, 文本型
  71. .局部变量 返回值, 文本型

  72. 文件名 = 取临时文件名 ()
  73. 写到文件 (文件名, 字节集)
  74. 返回值 = MD5_文件 (文件名)
  75. 删除文件 (文件名)
  76. 返回 (返回值)

  77. .子程序 MD5初始化

  78. AA = 1732584193
  79. BB = -271733879
  80. CC = -1732584194
  81. DD = 271733878

  82. .子程序 MD5_读文件块, 字节集, , 自带填充 返回固定64字节
  83. .参数 文件号, 整数型
  84. .参数 块, 整数型
  85. .参数 块数, 整数型
  86. .参数 长度, 整数型
  87. .局部变量 字节集, 字节集
  88. .局部变量 位长, 长整数型
  89. .局部变量 读到的长度, 整数型
  90. .局部变量 百分比耗时, 整数型
  91. .局部变量 剩余时间, 整数型

  92. 位长 = 长度 × 8
  93. .如果真 (百分比显示)

  94.     百分比 = 块 ÷ 块数 × 100
  95.     .如果真 (取整 (百分比) ≠ 取整 (旧百分比))
  96.         百分比时间 = 取启动时间 ()
  97.         百分比耗时 = 百分比时间 - 旧百分比时间
  98.         剩余时间 = 100 × 百分比耗时 - 百分比 × 百分比耗时
  99.         输出调试文本 (“已完成 ” + 到文本 (百分比) + “% 大约剩余 ” + 到文本 (剩余时间 ÷ 1000) + “ 秒完成。”)
  100.         旧百分比时间 = 百分比时间
  101.     .如果真结束
  102.     旧百分比 = 百分比

  103. .如果真结束

  104. 字节集 = 读入字节集 (文件号, 64)
  105. 读到的长度 = 取字节集长度 (字节集)
  106. .判断开始 (读到的长度 < 64 且 块数 ≠ 块)
  107.     字节集 = 字节集 + 取空白 (64 - 读到的长度, 真)
  108. .判断 (块数 = 块 且 读到的长度 = 0)
  109.     字节集 = 字节集 + 取空白 (56 - 读到的长度, 右移 (位与 (长度, 63), 3) ≠ 7) + 到字节集 (位长)
  110. .判断 (块数 = 块)
  111.     字节集 = 字节集 + 取空白 (56 - 读到的长度, 真) + 到字节集 (位长)
  112. .默认

  113. .判断结束
  114. 返回 (字节集)


  115. .子程序 计算填充长度, 整数型
  116. .参数 填充前长度, 整数型

  117. 返回 (右移 (填充前长度 + 8, 6) × 64 + 64)


  118. .子程序 计算块数, 整数型
  119. .参数 填充前长度, 整数型

  120. 返回 ((填充前长度 + 8) \ 64 + 1)


  121. .子程序 循环左移, 整数型
  122. .参数 欲移动的整数, 整数型
  123. .参数 欲移动的位数, 字节型

  124. 置入代码 ({ 139, 69, 8, 138, 77, 12, 211, 192, 201, 195 })
  125. ' mov eax,[ebp+8]
  126. ' mov cl,[ebp+12]
  127. ' rol eax,cl
  128. ' leave
  129. ' ret
  130. 返回 (0)

  131. .子程序 F, 整数型
  132. .参数 X, 整数型
  133. .参数 Y, 整数型
  134. .参数 Z, 整数型

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

  136. .子程序 G, 整数型
  137. .参数 X, 整数型
  138. .参数 Y, 整数型
  139. .参数 Z, 整数型

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

  141. .子程序 H, 整数型
  142. .参数 X, 整数型
  143. .参数 Y, 整数型
  144. .参数 Z, 整数型

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

  146. .子程序 I, 整数型
  147. .参数 X, 整数型
  148. .参数 Y, 整数型
  149. .参数 Z, 整数型

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

  151. .子程序 FF
  152. .参数 a, 整数型, 参考
  153. .参数 b, 整数型
  154. .参数 c, 整数型
  155. .参数 d, 整数型
  156. .参数 Mj, 整数型
  157. .参数 s, 整数型
  158. .参数 ti, 整数型


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


  160. .子程序 GG
  161. .参数 a, 整数型, 参考
  162. .参数 b, 整数型
  163. .参数 c, 整数型
  164. .参数 d, 整数型
  165. .参数 Mj, 整数型
  166. .参数 s, 整数型
  167. .参数 ti, 整数型

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

  169. .子程序 HH
  170. .参数 a, 整数型, 参考
  171. .参数 b, 整数型
  172. .参数 c, 整数型
  173. .参数 d, 整数型
  174. .参数 Mj, 整数型
  175. .参数 s, 整数型
  176. .参数 ti, 整数型

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

  178. .子程序 II
  179. .参数 a, 整数型, 参考
  180. .参数 b, 整数型
  181. .参数 c, 整数型
  182. .参数 d, 整数型
  183. .参数 Mj, 整数型
  184. .参数 s, 整数型
  185. .参数 ti, 整数型

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

  187. .子程序 主要循环
  188. .参数 x, 整数型, 参考 数组
  189. .局部变量 A, 整数型
  190. .局部变量 B, 整数型
  191. .局部变量 C, 整数型
  192. .局部变量 D, 整数型

  193. A = AA
  194. B = BB
  195. C = CC
  196. D = DD

  197. FF (A, B, C, D, x [1], 7, -680876936)
  198. FF (D, A, B, C, x [2], 12, -389564586)
  199. FF (C, D, A, B, x [3], 17, 606105819)
  200. FF (B, C, D, A, x [4], 22, -1044525330)
  201. FF (A, B, C, D, x [5], 7, -176418897)
  202. FF (D, A, B, C, x [6], 12, 1200080426)
  203. FF (C, D, A, B, x [7], 17, -1473231341)
  204. FF (B, C, D, A, x [8], 22, -45705983)
  205. FF (A, B, C, D, x [9], 7, 1770035416)
  206. FF (D, A, B, C, x [10], 12, -1958414417)
  207. FF (C, D, A, B, x [11], 17, -42063)
  208. FF (B, C, D, A, x [12], 22, -1990404162)
  209. FF (A, B, C, D, x [13], 7, 1804603682)
  210. FF (D, A, B, C, x [14], 12, -40341101)
  211. FF (C, D, A, B, x [15], 17, -1502002290)
  212. FF (B, C, D, A, x [16], 22, 1236535329)
  213. GG (A, B, C, D, x [2], 5, -165796510)
  214. GG (D, A, B, C, x [7], 9, -1069501632)
  215. GG (C, D, A, B, x [12], 14, 643717713)
  216. GG (B, C, D, A, x [1], 20, -373897302)
  217. GG (A, B, C, D, x [6], 5, -701558691)
  218. GG (D, A, B, C, x [11], 9, 38016083)
  219. GG (C, D, A, B, x [16], 14, -660478335)
  220. GG (B, C, D, A, x [5], 20, -405537848)
  221. GG (A, B, C, D, x [10], 5, 568446438)
  222. GG (D, A, B, C, x [15], 9, -1019803690)
  223. GG (C, D, A, B, x [4], 14, -187363961)
  224. GG (B, C, D, A, x [9], 20, 1163531501)
  225. GG (A, B, C, D, x [14], 5, -1444681467)
  226. GG (D, A, B, C, x [3], 9, -51403784)
  227. GG (C, D, A, B, x [8], 14, 1735328473)
  228. GG (B, C, D, A, x [13], 20, -1926607734)
  229. HH (A, B, C, D, x [6], 4, -378558)
  230. HH (D, A, B, C, x [9], 11, -2022574463)
  231. HH (C, D, A, B, x [12], 16, 1839030562)
  232. HH (B, C, D, A, x [15], 23, -35309556)
  233. HH (A, B, C, D, x [2], 4, -1530992060)
  234. HH (D, A, B, C, x [5], 11, 1272893353)
  235. HH (C, D, A, B, x [8], 16, -155497632)
  236. HH (B, C, D, A, x [11], 23, -1094730640)
  237. HH (A, B, C, D, x [14], 4, 681279174)
  238. HH (D, A, B, C, x [1], 11, -358537222)
  239. HH (C, D, A, B, x [4], 16, -722521979)
  240. HH (B, C, D, A, x [7], 23, 76029189)
  241. HH (A, B, C, D, x [10], 4, -640364487)
  242. HH (D, A, B, C, x [13], 11, -421815835)
  243. HH (C, D, A, B, x [16], 16, 530742520)
  244. HH (B, C, D, A, x [3], 23, -995338651)
  245. II (A, B, C, D, x [1], 6, -198630844)
  246. II (D, A, B, C, x [8], 10, 1126891415)
  247. II (C, D, A, B, x [15], 15, -1416354905)
  248. II (B, C, D, A, x [6], 21, -57434055)
  249. II (A, B, C, D, x [13], 6, 1700485571)
  250. II (D, A, B, C, x [4], 10, -1894986606)
  251. II (C, D, A, B, x [11], 15, -1051523)
  252. II (B, C, D, A, x [2], 21, -2054922799)
  253. II (A, B, C, D, x [9], 6, 1873313359)
  254. II (D, A, B, C, x [16], 10, -30611744)
  255. II (C, D, A, B, x [7], 15, -1560198380)
  256. II (B, C, D, A, x [14], 21, 1309151649)
  257. II (A, B, C, D, x [5], 6, -145523070)
  258. II (D, A, B, C, x [12], 10, -1120210379)
  259. II (C, D, A, B, x [3], 15, 718787259)
  260. II (B, C, D, A, x [10], 21, -343485551)
  261. AA = AA + A
  262. BB = BB + B
  263. CC = CC + C
  264. DD = DD + D

  265. .子程序 级联, 文本型
  266. .参数 值1, 整数型
  267. .参数 值2, 整数型
  268. .参数 值3, 整数型
  269. .参数 值4, 整数型
  270. .局部变量 数据, 字节集
  271. .局部变量 计数, 整数型
  272. .局部变量 十六进制文本, 文本型
  273. .局部变量 返回值, 文本型

  274. 数据 = 到字节集 (值1) + 到字节集 (值2) + 到字节集 (值3) + 到字节集 (值4)
  275. 十六进制文本 = “0123456789abcdef”
  276. 返回值 = “”
  277. .计次循环首 (16, 计数)
  278.     返回值 = 返回值 + 取文本中间 (十六进制文本, 右移 (数据 [计数], 4) + 1, 1) + 取文本中间 (十六进制文本, 位与 (数据 [计数], 15) + 1, 1)
  279. .计次循环尾 ()
  280. 返回 (返回值)

  281. .子程序 随机字节集, 字节集
  282. .参数 长度, 整数型
  283. .局部变量 返回值, 字节集
  284. .局部变量 计数, 整数型

  285. 返回值 = 取空白字节集 (长度)
  286. .计次循环首 (长度, 计数)
  287.     返回值 [计数] = 取随机数 (, )
  288. .计次循环尾 ()
  289. 返回 (返回值)

  290. .子程序 取空白, 字节集
  291. .参数 长度, 整数型
  292. .参数 置128, 逻辑型, 可空
  293. .局部变量 返回值, 字节集

  294. 返回值 = 取空白字节集 (长度)
  295. .如果真 (置128)
  296.     返回值 [1] = 128
  297. .如果真结束
  298. 返回 (返回值)

复制代码

评分

1

查看全部评分

相关帖子

发表于 2018-10-7 20:27:41 | 显示全部楼层

来的早的话你也可以有
您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-27 12:46 , Processed in 0.782045 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表