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

从F到0 - From F to 0

 找回密码
 加入我们
搜索
查看: 9224|回复: 14
收起左侧

易语言SHA256字节集计算模块纯核心库算法源码并调用PHP比对 - 不调用DLL和其他支持库

[复制链接]
发表于 2021-1-7 20:14:09 | 显示全部楼层 |阅读模式
本帖最后由 CNWTEPRG 于 2021-1-20 10:05 编辑

1.png

  1. .版本 2

  2. .程序集 程序集1

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

  4. _临时子程序 ()
  5. 返回 (0)

  6. .子程序 _临时子程序
  7. .局部变量 字节集, 字节集
  8. .局部变量 长度, 整数型
  9. .局部变量 PHP结果, 文本型
  10. .局部变量 易结果, 文本型

  11. 置随机数种子 ()
  12. .计次循环首 (1024, 长度)
  13.     字节集 = 取随机字节集 (长度)
  14.     PHP结果 = PHP_SHA256 (字节集)
  15.     易结果 = 取数据SHA256特征码 (字节集)
  16.     .如果 (PHP结果 = 易结果)
  17.         输出调试文本 (易结果 + “ 正确” + 到文本 (长度))
  18.     .否则
  19.         输出调试文本 (“错误”)
  20.         暂停 ()
  21.     .如果结束

  22. .计次循环尾 ()

  23. .子程序 safe_add, 整数型
  24. .参数 x, 整数型
  25. .参数 y, 整数型
  26. .局部变量 lsw, 整数型
  27. .局部变量 msw, 整数型
  28. .局部变量 return, 整数型

  29. lsw = 位与 (x, 65535) + 位与 (y, 65535)
  30. msw = 右移 (x, 16) + 右移 (y, 16) + 右移 (lsw, 16)
  31. return = 位或 (左移 (msw, 16), 位与 (lsw, 65535))
  32. 返回 (return)

  33. .子程序 sha256_S, 整数型
  34. .参数 X, 整数型
  35. .参数 n, 整数型

  36. 返回 (位或 (逻辑右移 (X, n), 左移 (X, 32 - n)))

  37. .子程序 sha256_R, 整数型
  38. .参数 X, 整数型
  39. .参数 n, 整数型

  40. 返回 (逻辑右移 (X, n))

  41. .子程序 sha256_Ch, 整数型
  42. .参数 x, 整数型
  43. .参数 y, 整数型
  44. .参数 z, 整数型

  45. 返回 (位异或 (位与 (x, y), 位与 (位取反 (x), z)))

  46. .子程序 sha256_Maj, 整数型
  47. .参数 x, 整数型
  48. .参数 y, 整数型
  49. .参数 z, 整数型

  50. 返回 (位异或 (位与 (x, y), 位与 (x, z), 位与 (y, z)))

  51. .子程序 sha256_Sigma0256, 整数型
  52. .参数 x, 整数型

  53. 返回 (位异或 (sha256_S (x, 2), sha256_S (x, 13), sha256_S (x, 22)))

  54. .子程序 sha256_Sigma1256, 整数型
  55. .参数 x, 整数型

  56. 返回 (位异或 (sha256_S (x, 6), sha256_S (x, 11), sha256_S (x, 25)))

  57. .子程序 sha256_Gamma0256, 整数型
  58. .参数 x, 整数型

  59. 返回 (位异或 (sha256_S (x, 7), sha256_S (x, 18), sha256_R (x, 3)))

  60. .子程序 sha256_Gamma1256, 整数型
  61. .参数 x, 整数型

  62. 返回 (位异或 (sha256_S (x, 17), sha256_S (x, 19), sha256_R (x, 10)))

  63. .子程序 binb_sha256
  64. .参数 输入数据, 整数型, 数组
  65. .参数 位数, 整数型
  66. .参数 计算结果, 整数型, 参考 数组
  67. .局部变量 sha256_K, 整数型, , "0"
  68. .局部变量 HASH, 整数型, , "0"
  69. .局部变量 W, 整数型, , "64"
  70. .局部变量 a, 整数型
  71. .局部变量 b, 整数型
  72. .局部变量 c, 整数型
  73. .局部变量 d, 整数型
  74. .局部变量 e, 整数型
  75. .局部变量 f, 整数型
  76. .局部变量 g, 整数型
  77. .局部变量 h, 整数型
  78. .局部变量 i, 整数型
  79. .局部变量 j, 整数型
  80. .局部变量 T1, 整数型
  81. .局部变量 T2, 整数型
  82. .局部变量 tmp, 整数型
  83. .局部变量 成员数, 整数型

  84. sha256_K = { 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998 }
  85. HASH = { 1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225 }
  86. tmp = 左移 (右移 (位数 + 64, 9), 4) + 16
  87. 成员数 = 取数组成员数 (输入数据)
  88. .如果真 (成员数 < tmp)
  89.     重定义数组 (输入数据, 真, tmp)
  90. .如果真结束
  91. 输入数据 [右移 (位数, 5) + 1] = 位或 (输入数据 [右移 (位数, 5) + 1], 左移 (128, 24 - 位数 % 32))
  92. 输入数据 [tmp] = 位数
  93. 成员数 = 取数组成员数 (输入数据)
  94. .变量循环首 (0, 成员数, 16, i)
  95.     .如果真 (i ≥ 成员数)
  96.         跳出循环 ()
  97.     .如果真结束
  98.     a = HASH [1]
  99.     b = HASH [2]
  100.     c = HASH [3]
  101.     d = HASH [4]
  102.     e = HASH [5]
  103.     f = HASH [6]
  104.     g = HASH [7]
  105.     h = HASH [8]
  106.     .变量循环首 (0, 64, 1, j)
  107.         .如果真 (j ≥ 64)
  108.             跳出循环 ()
  109.         .如果真结束
  110.         .如果 (j < 16)
  111.             W [j + 1] = 输入数据 [j + i + 1]
  112.         .否则
  113.             W [j + 1] = safe_add (safe_add (safe_add (sha256_Gamma1256 (W [j - 2 + 1]), W [j - 7 + 1]), sha256_Gamma0256 (W [j - 15 + 1])), W [j - 16 + 1])
  114.         .如果结束
  115.         T1 = safe_add (safe_add (safe_add (safe_add (h, sha256_Sigma1256 (e)), sha256_Ch (e, f, g)), sha256_K [j + 1]), W [j + 1])
  116.         T2 = safe_add (sha256_Sigma0256 (a), sha256_Maj (a, b, c))
  117.         h = g
  118.         g = f
  119.         f = e
  120.         e = safe_add (d, T1)
  121.         d = c
  122.         c = b
  123.         b = a
  124.         a = safe_add (T1, T2)
  125.     .变量循环尾 ()
  126.     HASH [1] = safe_add (a, HASH [1])
  127.     HASH [2] = safe_add (b, HASH [2])
  128.     HASH [3] = safe_add (c, HASH [3])
  129.     HASH [4] = safe_add (d, HASH [4])
  130.     HASH [5] = safe_add (e, HASH [5])
  131.     HASH [6] = safe_add (f, HASH [6])
  132.     HASH [7] = safe_add (g, HASH [7])
  133.     HASH [8] = safe_add (h, HASH [8])
  134. .变量循环尾 ()
  135. 计算结果 = HASH

  136. .子程序 取数据SHA256特征码_字节集, 字节集, 公开, 此函数返回SHA256的字节集裸数据,不会转换成16进制
  137. .参数 字节集数据, 字节集, , 为命令提供所需的字节集数据。
  138. .局部变量 输入数据, 整数型, , "0"
  139. .局部变量 计算结果, 整数型, , "0", 固定32字节(8成员)

  140. 字节集到整数型数组 (字节集数据, 输入数据)
  141. binb_sha256 (输入数据, 左移 (取字节集长度 (字节集数据), 3), 计算结果)
  142. 返回 (整数型数组到字节集 (计算结果))

  143. .子程序 逻辑右移, 整数型
  144. .参数 欲移动的整数, 整数型
  145. .参数 欲被移动的位数, 字节型

  146. 置入代码 ({ 81, 139, 69, 8, 138, 77, 12, 211, 232, 89, 139, 229, 93, 194, 8, 0 })
  147. 返回 (-1)

  148. .子程序 字节集到整数型数组
  149. .参数 输入, 字节集
  150. .参数 输出, 整数型, 数组
  151. .局部变量 索引, 整数型
  152. .局部变量 成员数, 整数型

  153. 清除数组 (输出)
  154. 索引 = 1
  155. .循环判断首 ()
  156.     加入成员 (输出, 反转整数字节序 (取字节集数据 (输入, #整数型, 索引)))
  157. .循环判断尾 (索引 ≠ -1)

  158. .子程序 整数型数组到字节集, 字节集
  159. .参数 输入, 整数型, 数组
  160. .局部变量 成员数, 整数型
  161. .局部变量 计数, 整数型
  162. .局部变量 数组副本, 整数型, , "0"

  163. 成员数 = 取数组成员数 (输入)
  164. 重定义数组 (数组副本, 假, 成员数)
  165. .计次循环首 (成员数, 计数)
  166.     数组副本 [计数] = 反转整数字节序 (输入 [计数])
  167. .计次循环尾 ()
  168. 返回 (到字节集 (数组副本))

  169. .子程序 字节集到十六进制文本, 文本型
  170. .参数 input, 字节集
  171. .局部变量 hex_tab, 字节集
  172. .局部变量 output, 字节集
  173. .局部变量 length, 整数型
  174. .局部变量 i, 整数型
  175. .局部变量 x, 整数型

  176. hex_tab = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102 }
  177. length = 取字节集长度 (input)
  178. .变量循环首 (0, length, 1, i)
  179.     .如果真 (i ≥ length)
  180.         跳出循环 ()
  181.     .如果真结束
  182.     x = input [i + 1]
  183.     output = output + 到字节集 (hex_tab [位与 (逻辑右移 (x, 4), 15) + 1]) + 到字节集 (hex_tab [位与 (x, 15) + 1])
  184. .变量循环尾 ()
  185. 返回 (到文本 (output))

  186. .子程序 取数据SHA256特征码, 文本型, 公开, 返回一段字节集数据的SHA256数据摘要编码文本。不同数据的SHA256码都不一样,因此本命令可以用作保证重要数据不会被篡改。
  187. .参数 字节集数据, 字节集, , 为命令提供所需的字节集数据。

  188. 返回 (字节集到十六进制文本 (取数据SHA256特征码_字节集 (字节集数据)))

  189. .子程序 PHP_SHA256, 文本型, , 调用PHP进行SHA256计算
  190. .参数 数据, 字节集
  191. .局部变量 PHP路径, 文本型
  192. .局部变量 计算结果, 文本型

  193. PHP路径 = “D:\Server\php-7.3.1-Win32-VC15-x64\php.exe”
  194. .如果真 (文件是否存在 (“sha256.php”) = 假)
  195.     写到文件 (“sha256.php”, 到字节集 (“<?php exit(hash('sha256',hex2bin($argv[1]))); ?>”))
  196. .如果真结束
  197. .如果真 (运行控制台程序 (PHP路径 + “ sha256.php ” + 字节集到十六进制文本 (数据), 计算结果, , ) = 假)
  198.     信息框 (“运行失败: ” + PHP路径 + “ 请确定PHP是否已安装。”, 16, , )
  199.     结束 ()
  200. .如果真结束
  201. 返回 (计算结果)

  202. .子程序 取随机字节集, 字节集
  203. .参数 长度, 整数型
  204. .局部变量 返回值, 字节集
  205. .局部变量 计数, 整数型

  206. 返回值 = 取空白字节集 (长度)
  207. .计次循环首 (长度, 计数)
  208.     返回值 [计数] = 取随机数 (, )
  209. .计次循环尾 ()
  210. 返回 (返回值)
复制代码

相关帖子

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

本版积分规则

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

腾讯云安全认证

GMT+8, 2024-3-19 15:09 , Processed in 0.649038 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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