ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

VB、VBS 、ASP、VBA 的 UTF-8 MD5 实现

2020-12-22 18:31:05  阅读:231  来源: 互联网

标签:clng VB ASP UTF l2power gg const lonbits md5


还是和之前的原因一个样,一直在用的 MD5 编码,处理英文时没问题,加了中文,就跟 https://tool.oschina.net/encrypt?type=2 和 https://md5jiami.51240.com/ 的结果不一样了,想了下,应该还是 UTF-8 编码的问题,于是将原来在用的编码中和字符串转 Byte 数组函数改装了一下,就成了,转换结果一致,说明工作正确:

 
  1. '========================================================----------------------MD5 All

  2. public const bits_to_a_byte = 8

  3. public const bytes_to_a_word = 4

  4. public const bits_to_a_word = 32

  5. public m_lonbits(30)

  6. public m_l2power(30)

  7.  
  8. Public Function converttowordarray(smessage) '进行 UTF-8 改造的就是这个函数

  9. Dim lmessagelength, lnumberofwords, lwordarray(), lbyteposition, lbytecount, lwordcount

  10. dim mAllByteIn '接收数组变量在VBS不能加括号()

  11. Const modulus_bits = 512

  12. Const congruent_bits = 448

  13. '---------翻译为 UTF-8 byte 数组

  14. mAllByteIn = HexStr2ByteArr(str2UTF8(smessage))

  15. lmessagelength = UBound(mAllByteIn) + 1 ' L + 1 ' Len(smessage)

  16. lnumberofwords = (((lmessagelength + 8) \ 64) + 1) * 16

  17. ReDim lwordarray(lnumberofwords - 1)

  18. lbyteposition = 0

  19. lbytecount = 0

  20. Do Until lbytecount >= lmessagelength

  21. lwordcount = lbytecount \ bytes_to_a_word

  22. lbyteposition = (lbytecount Mod bytes_to_a_word) * bits_to_a_byte

  23. ' Asc(Mid(smessage, lbytecount + 1, 1)) =mAllByteIn(lbytecount)

  24. lwordarray(lwordcount) = lwordarray(lwordcount) Or lshift(mAllByteIn(lbytecount), lbyteposition)

  25. lbytecount = lbytecount + 1

  26. Loop

  27. lwordcount = lbytecount \ bytes_to_a_word

  28. lbyteposition = (lbytecount Mod bytes_to_a_word) * bits_to_a_byte

  29. lwordarray(lwordcount) = lwordarray(lwordcount) Or lshift(&H80, lbyteposition)

  30. lwordarray(lnumberofwords - 2) = lshift(lmessagelength, 3)

  31. lwordarray(lnumberofwords - 1) = rshift(lmessagelength, 29)

  32. converttowordarray = lwordarray

  33. End Function

  34.  
  35. public function lshift(lvalue, ishiftbits)

  36. if ishiftbits = 0 then

  37. lshift = lvalue

  38. exit function

  39. elseif ishiftbits = 31 then

  40. if lvalue and 1 then

  41. lshift = &h80000000

  42. else

  43. lshift = 0

  44. end if

  45. exit function

  46. elseif ishiftbits < 0 or ishiftbits > 31 then

  47. err.raise 6

  48. end if

  49.  
  50. if (lvalue and m_l2power(31 - ishiftbits)) then

  51. lshift = ((lvalue and m_lonbits(31 - (ishiftbits + 1))) * m_l2power(ishiftbits)) or &h80000000

  52. else

  53. lshift = ((lvalue and m_lonbits(31 - ishiftbits)) * m_l2power(ishiftbits))

  54. end if

  55. end function

  56.  
  57. public function rshift(lvalue, ishiftbits)

  58. if ishiftbits = 0 then

  59. rshift = lvalue

  60. exit function

  61. elseif ishiftbits = 31 then

  62. if lvalue and &h80000000 then

  63. rshift = 1

  64. else

  65. rshift = 0

  66. end if

  67. exit function

  68. elseif ishiftbits < 0 or ishiftbits > 31 then

  69. err.raise 6

  70. end if

  71.  
  72. rshift = (lvalue and &h7ffffffe) \ m_l2power(ishiftbits)

  73.  
  74. if (lvalue and &h80000000) then

  75. rshift = (rshift or (&h40000000 \ m_l2power(ishiftbits - 1)))

  76. end if

  77. end function

  78.  
  79. public function rotateleft(lvalue, ishiftbits)

  80. rotateleft = lshift(lvalue, ishiftbits) or rshift(lvalue, (32 - ishiftbits))

  81. end function

  82.  
  83. public function addunsigned(lx, ly)

  84. dim lx4

  85. dim ly4

  86. dim lx8

  87. dim ly8

  88. dim lresult

  89.  
  90. lx8 = lx and &h80000000

  91. ly8 = ly and &h80000000

  92. lx4 = lx and &h40000000

  93. ly4 = ly and &h40000000

  94.  
  95. lresult = (lx and &h3fffffff) + (ly and &h3fffffff)

  96.  
  97. if lx4 and ly4 then

  98. lresult = lresult xor &h80000000 xor lx8 xor ly8

  99. elseif lx4 or ly4 then

  100. if lresult and &h40000000 then

  101. lresult = lresult xor &hc0000000 xor lx8 xor ly8

  102. else

  103. lresult = lresult xor &h40000000 xor lx8 xor ly8

  104. end if

  105. else

  106. lresult = lresult xor lx8 xor ly8

  107. end if

  108.  
  109. addunsigned = lresult

  110. end function

  111.  
  112. public function md5_f(x, y, z)

  113. md5_f = (x and y) or ((not x) and z)

  114. end function

  115.  
  116. public function md5_g(x, y, z)

  117. md5_g = (x and z) or (y and (not z))

  118. end function

  119.  
  120. public function md5_h(x, y, z)

  121. md5_h = (x xor y xor z)

  122. end function

  123.  
  124. public function md5_i(x, y, z)

  125. md5_i = (y xor (x or (not z)))

  126. end function

  127.  
  128. public sub md5_ff(a, b, c, d, x, s, ac)

  129. a = addunsigned(a, addunsigned(addunsigned(md5_f(b, c, d), x), ac))

  130. a = rotateleft(a, s)

  131. a = addunsigned(a, b)

  132. end sub

  133.  
  134. public sub md5_gg(a, b, c, d, x, s, ac)

  135. a = addunsigned(a, addunsigned(addunsigned(md5_g(b, c, d), x), ac))

  136. a = rotateleft(a, s)

  137. a = addunsigned(a, b)

  138. end sub

  139.  
  140. public sub md5_hh(a, b, c, d, x, s, ac)

  141. a = addunsigned(a, addunsigned(addunsigned(md5_h(b, c, d), x), ac))

  142. a = rotateleft(a, s)

  143. a = addunsigned(a, b)

  144. end sub

  145.  
  146. public sub md5_ii(a, b, c, d, x, s, ac)

  147. a = addunsigned(a, addunsigned(addunsigned(md5_i(b, c, d), x), ac))

  148. a = rotateleft(a, s)

  149. a = addunsigned(a, b)

  150. end sub

  151.  
  152. public function wordtohex(lvalue)

  153. dim lbyte

  154. dim lcount

  155.  
  156. for lcount = 0 to 3

  157. lbyte = rshift(lvalue, lcount * bits_to_a_byte) and m_lonbits(bits_to_a_byte - 1)

  158. wordtohex = wordtohex & right("0" & hex(lbyte), 2)

  159. next

  160. end function

  161.  
  162. public function md5(smessage)

  163. m_lonbits(0) = clng(1)

  164. m_lonbits(1) = clng(3)

  165. m_lonbits(2) = clng(7)

  166. m_lonbits(3) = clng(15)

  167. m_lonbits(4) = clng(31)

  168. m_lonbits(5) = clng(63)

  169. m_lonbits(6) = clng(127)

  170. m_lonbits(7) = clng(255)

  171. m_lonbits(8) = clng(511)

  172. m_lonbits(9) = clng(1023)

  173. m_lonbits(10) = clng(2047)

  174. m_lonbits(11) = clng(4095)

  175. m_lonbits(12) = clng(8191)

  176. m_lonbits(13) = clng(16383)

  177. m_lonbits(14) = clng(32767)

  178. m_lonbits(15) = clng(65535)

  179. m_lonbits(16) = clng(131071)

  180. m_lonbits(17) = clng(262143)

  181. m_lonbits(18) = clng(524287)

  182. m_lonbits(19) = clng(1048575)

  183. m_lonbits(20) = clng(2097151)

  184. m_lonbits(21) = clng(4194303)

  185. m_lonbits(22) = clng(8388607)

  186. m_lonbits(23) = clng(16777215)

  187. m_lonbits(24) = clng(33554431)

  188. m_lonbits(25) = clng(67108863)

  189. m_lonbits(26) = clng(134217727)

  190. m_lonbits(27) = clng(268435455)

  191. m_lonbits(28) = clng(536870911)

  192. m_lonbits(29) = clng(1073741823)

  193. m_lonbits(30) = clng(2147483647)

  194.  
  195. m_l2power(0) = clng(1)

  196. m_l2power(1) = clng(2)

  197. m_l2power(2) = clng(4)

  198. m_l2power(3) = clng(8)

  199. m_l2power(4) = clng(16)

  200. m_l2power(5) = clng(32)

  201. m_l2power(6) = clng(64)

  202. m_l2power(7) = clng(128)

  203. m_l2power(8) = clng(256)

  204. m_l2power(9) = clng(512)

  205. m_l2power(10) = clng(1024)

  206. m_l2power(11) = clng(2048)

  207. m_l2power(12) = clng(4096)

  208. m_l2power(13) = clng(8192)

  209. m_l2power(14) = clng(16384)

  210. m_l2power(15) = clng(32768)

  211. m_l2power(16) = clng(65536)

  212. m_l2power(17) = clng(131072)

  213. m_l2power(18) = clng(262144)

  214. m_l2power(19) = clng(524288)

  215. m_l2power(20) = clng(1048576)

  216. m_l2power(21) = clng(2097152)

  217. m_l2power(22) = clng(4194304)

  218. m_l2power(23) = clng(8388608)

  219. m_l2power(24) = clng(16777216)

  220. m_l2power(25) = clng(33554432)

  221. m_l2power(26) = clng(67108864)

  222. m_l2power(27) = clng(134217728)

  223. m_l2power(28) = clng(268435456)

  224. m_l2power(29) = clng(536870912)

  225. m_l2power(30) = clng(1073741824)

  226.  
  227. dim x

  228. dim k

  229. dim aa

  230. dim bb

  231. dim cc

  232. dim dd

  233. dim a

  234. dim b

  235. dim c

  236. dim d , e

  237.  
  238. const s11 = 7

  239. const s12 = 12

  240. const s13 = 17

  241. const s14 = 22

  242. const s21 = 5

  243. const s22 = 9

  244. const s23 = 14

  245. const s24 = 20

  246. const s31 = 4

  247. const s32 = 11

  248. const s33 = 16

  249. const s34 = 23

  250. const s41 = 6

  251. const s42 = 10

  252. const s43 = 15

  253. const s44 = 21

  254.  
  255. x = converttowordarray(smessage)

  256.  
  257. a = &h67452301

  258. b = &hefcdab89

  259. c = &h98badcfe

  260. d = &h10325476

  261.  
  262. for k = 0 to ubound(x) step 16

  263. aa = a

  264. bb = b

  265. cc = c

  266. dd = d

  267.  
  268. md5_ff a, b, c, d, x(k + 0), s11, &hd76aa478

  269. md5_ff d, a, b, c, x(k + 1), s12, &he8c7b756

  270. md5_ff c, d, a, b, x(k + 2), s13, &h242070db

  271. md5_ff b, c, d, a, x(k + 3), s14, &hc1bdceee

  272. md5_ff a, b, c, d, x(k + 4), s11, &hf57c0faf

  273. md5_ff d, a, b, c, x(k + 5), s12, &h4787c62a

  274. md5_ff c, d, a, b, x(k + 6), s13, &ha8304613

  275. md5_ff b, c, d, a, x(k + 7), s14, &hfd469501

  276. md5_ff a, b, c, d, x(k + 8), s11, &h698098d8

  277. md5_ff d, a, b, c, x(k + 9), s12, &h8b44f7af

  278. md5_ff c, d, a, b, x(k + 10), s13, &hffff5bb1

  279. md5_ff b, c, d, a, x(k + 11), s14, &h895cd7be

  280. md5_ff a, b, c, d, x(k + 12), s11, &h6b901122

  281. md5_ff d, a, b, c, x(k + 13), s12, &hfd987193

  282. md5_ff c, d, a, b, x(k + 14), s13, &ha679438e

  283. md5_ff b, c, d, a, x(k + 15), s14, &h49b40821

  284.  
  285. md5_gg a, b, c, d, x(k + 1), s21, &hf61e2562

  286. md5_gg d, a, b, c, x(k + 6), s22, &hc040b340

  287. md5_gg c, d, a, b, x(k + 11), s23, &h265e5a51

  288. md5_gg b, c, d, a, x(k + 0), s24, &he9b6c7aa

  289. md5_gg a, b, c, d, x(k + 5), s21, &hd62f105d

  290. md5_gg d, a, b, c, x(k + 10), s22, &h2441453

  291. md5_gg c, d, a, b, x(k + 15), s23, &hd8a1e681

  292. md5_gg b, c, d, a, x(k + 4), s24, &he7d3fbc8

  293. md5_gg a, b, c, d, x(k + 9), s21, &h21e1cde6

  294. md5_gg d, a, b, c, x(k + 14), s22, &hc33707d6

  295. md5_gg c, d, a, b, x(k + 3), s23, &hf4d50d87

  296. md5_gg b, c, d, a, x(k + 8), s24, &h455a14ed

  297. md5_gg a, b, c, d, x(k + 13), s21, &ha9e3e905

  298. md5_gg d, a, b, c, x(k + 2), s22, &hfcefa3f8

  299. md5_gg c, d, a, b, x(k + 7), s23, &h676f02d9

  300. md5_gg b, c, d, a, x(k + 12), s24, &h8d2a4c8a

  301.  
  302. md5_hh a, b, c, d, x(k + 5), s31, &hfffa3942

  303. md5_hh d, a, b, c, x(k + 8), s32, &h8771f681

  304. md5_hh c, d, a, b, x(k + 11), s33, &h6d9d6122

  305. md5_hh b, c, d, a, x(k + 14), s34, &hfde5380c

  306. md5_hh a, b, c, d, x(k + 1), s31, &ha4beea44

  307. md5_hh d, a, b, c, x(k + 4), s32, &h4bdecfa9

  308. md5_hh c, d, a, b, x(k + 7), s33, &hf6bb4b60

  309. md5_hh b, c, d, a, x(k + 10), s34, &hbebfbc70

  310. md5_hh a, b, c, d, x(k + 13), s31, &h289b7ec6

  311. md5_hh d, a, b, c, x(k + 0), s32, &heaa127fa

  312. md5_hh c, d, a, b, x(k + 3), s33, &hd4ef3085

  313. md5_hh b, c, d, a, x(k + 6), s34, &h4881d05

  314. md5_hh a, b, c, d, x(k + 9), s31, &hd9d4d039

  315. md5_hh d, a, b, c, x(k + 12), s32, &he6db99e5

  316. md5_hh c, d, a, b, x(k + 15), s33, &h1fa27cf8

  317. md5_hh b, c, d, a, x(k + 2), s34, &hc4ac5665

  318.  
  319. md5_ii a, b, c, d, x(k + 0), s41, &hf4292244

  320. md5_ii d, a, b, c, x(k + 7), s42, &h432aff97

  321. md5_ii c, d, a, b, x(k + 14), s43, &hab9423a7

  322. md5_ii b, c, d, a, x(k + 5), s44, &hfc93a039

  323. md5_ii a, b, c, d, x(k + 12), s41, &h655b59c3

  324. md5_ii d, a, b, c, x(k + 3), s42, &h8f0ccc92

  325. md5_ii c, d, a, b, x(k + 10), s43, &hffeff47d

  326. md5_ii b, c, d, a, x(k + 1), s44, &h85845dd1

  327. md5_ii a, b, c, d, x(k + 8), s41, &h6fa87e4f

  328. md5_ii d, a, b, c, x(k + 15), s42, &hfe2ce6e0

  329. md5_ii c, d, a, b, x(k + 6), s43, &ha3014314

  330. md5_ii b, c, d, a, x(k + 13), s44, &h4e0811a1

  331. md5_ii a, b, c, d, x(k + 4), s41, &hf7537e82

  332. md5_ii d, a, b, c, x(k + 11), s42, &hbd3af235

  333. md5_ii c, d, a, b, x(k + 2), s43, &h2ad7d2bb

  334. md5_ii b, c, d, a, x(k + 9), s44, &heb86d391

  335.  
  336. a = addunsigned(a, aa)

  337. b = addunsigned(b, bb)

  338. c = addunsigned(c, cc)

  339. d = addunsigned(d, dd)

  340. next

  341.  
  342. md5 = lcase(wordtohex(a) & wordtohex(b) & wordtohex(c) & wordtohex(d))

  343. 'md5=lcase(wordtohex(b) & wordtohex(c)) 'i crop this to fit 16byte database password :d

  344.  
  345. md5=ucase(md5)

  346. end function

  347.  
  348.  
  349. public function md5_16(smessage)

  350. m_lonbits(0) = clng(1)

  351. m_lonbits(1) = clng(3)

  352. m_lonbits(2) = clng(7)

  353. m_lonbits(3) = clng(15)

  354. m_lonbits(4) = clng(31)

  355. m_lonbits(5) = clng(63)

  356. m_lonbits(6) = clng(127)

  357. m_lonbits(7) = clng(255)

  358. m_lonbits(8) = clng(511)

  359. m_lonbits(9) = clng(1023)

  360. m_lonbits(10) = clng(2047)

  361. m_lonbits(11) = clng(4095)

  362. m_lonbits(12) = clng(8191)

  363. m_lonbits(13) = clng(16383)

  364. m_lonbits(14) = clng(32767)

  365. m_lonbits(15) = clng(65535)

  366. m_lonbits(16) = clng(131071)

  367. m_lonbits(17) = clng(262143)

  368. m_lonbits(18) = clng(524287)

  369. m_lonbits(19) = clng(1048575)

  370. m_lonbits(20) = clng(2097151)

  371. m_lonbits(21) = clng(4194303)

  372. m_lonbits(22) = clng(8388607)

  373. m_lonbits(23) = clng(16777215)

  374. m_lonbits(24) = clng(33554431)

  375. m_lonbits(25) = clng(67108863)

  376. m_lonbits(26) = clng(134217727)

  377. m_lonbits(27) = clng(268435455)

  378. m_lonbits(28) = clng(536870911)

  379. m_lonbits(29) = clng(1073741823)

  380. m_lonbits(30) = clng(2147483647)

  381.  
  382. m_l2power(0) = clng(1)

  383. m_l2power(1) = clng(2)

  384. m_l2power(2) = clng(4)

  385. m_l2power(3) = clng(8)

  386. m_l2power(4) = clng(16)

  387. m_l2power(5) = clng(32)

  388. m_l2power(6) = clng(64)

  389. m_l2power(7) = clng(128)

  390. m_l2power(8) = clng(256)

  391. m_l2power(9) = clng(512)

  392. m_l2power(10) = clng(1024)

  393. m_l2power(11) = clng(2048)

  394. m_l2power(12) = clng(4096)

  395. m_l2power(13) = clng(8192)

  396. m_l2power(14) = clng(16384)

  397. m_l2power(15) = clng(32768)

  398. m_l2power(16) = clng(65536)

  399. m_l2power(17) = clng(131072)

  400. m_l2power(18) = clng(262144)

  401. m_l2power(19) = clng(524288)

  402. m_l2power(20) = clng(1048576)

  403. m_l2power(21) = clng(2097152)

  404. m_l2power(22) = clng(4194304)

  405. m_l2power(23) = clng(8388608)

  406. m_l2power(24) = clng(16777216)

  407. m_l2power(25) = clng(33554432)

  408. m_l2power(26) = clng(67108864)

  409. m_l2power(27) = clng(134217728)

  410. m_l2power(28) = clng(268435456)

  411. m_l2power(29) = clng(536870912)

  412. m_l2power(30) = clng(1073741824)

  413.  
  414. dim x

  415. dim k

  416. dim aa

  417. dim bb

  418. dim cc

  419. dim dd

  420. dim a

  421. dim b

  422. dim c

  423. dim d

  424.  
  425. const s11 = 7

  426. const s12 = 12

  427. const s13 = 17

  428. const s14 = 22

  429. const s21 = 5

  430. const s22 = 9

  431. const s23 = 14

  432. const s24 = 20

  433. const s31 = 4

  434. const s32 = 11

  435. const s33 = 16

  436. const s34 = 23

  437. const s41 = 6

  438. const s42 = 10

  439. const s43 = 15

  440. const s44 = 21

  441.  
  442. x = converttowordarray(smessage)

  443.  
  444. a = &h67452301

  445. b = &hefcdab89

  446. c = &h98badcfe

  447. d = &h10325476

  448.  
  449. for k = 0 to ubound(x) step 16

  450. aa = a

  451. bb = b

  452. cc = c

  453. dd = d

  454.  
  455. md5_ff a, b, c, d, x(k + 0), s11, &hd76aa478

  456. md5_ff d, a, b, c, x(k + 1), s12, &he8c7b756

  457. md5_ff c, d, a, b, x(k + 2), s13, &h242070db

  458. md5_ff b, c, d, a, x(k + 3), s14, &hc1bdceee

  459. md5_ff a, b, c, d, x(k + 4), s11, &hf57c0faf

  460. md5_ff d, a, b, c, x(k + 5), s12, &h4787c62a

  461. md5_ff c, d, a, b, x(k + 6), s13, &ha8304613

  462. md5_ff b, c, d, a, x(k + 7), s14, &hfd469501

  463. md5_ff a, b, c, d, x(k + 8), s11, &h698098d8

  464. md5_ff d, a, b, c, x(k + 9), s12, &h8b44f7af

  465. md5_ff c, d, a, b, x(k + 10), s13, &hffff5bb1

  466. md5_ff b, c, d, a, x(k + 11), s14, &h895cd7be

  467. md5_ff a, b, c, d, x(k + 12), s11, &h6b901122

  468. md5_ff d, a, b, c, x(k + 13), s12, &hfd987193

  469. md5_ff c, d, a, b, x(k + 14), s13, &ha679438e

  470. md5_ff b, c, d, a, x(k + 15), s14, &h49b40821

  471.  
  472. md5_gg a, b, c, d, x(k + 1), s21, &hf61e2562

  473. md5_gg d, a, b, c, x(k + 6), s22, &hc040b340

  474. md5_gg c, d, a, b, x(k + 11), s23, &h265e5a51

  475. md5_gg b, c, d, a, x(k + 0), s24, &he9b6c7aa

  476. md5_gg a, b, c, d, x(k + 5), s21, &hd62f105d

  477. md5_gg d, a, b, c, x(k + 10), s22, &h2441453

  478. md5_gg c, d, a, b, x(k + 15), s23, &hd8a1e681

  479. md5_gg b, c, d, a, x(k + 4), s24, &he7d3fbc8

  480. md5_gg a, b, c, d, x(k + 9), s21, &h21e1cde6

  481. md5_gg d, a, b, c, x(k + 14), s22, &hc33707d6

  482. md5_gg c, d, a, b, x(k + 3), s23, &hf4d50d87

  483. md5_gg b, c, d, a, x(k + 8), s24, &h455a14ed

  484. md5_gg a, b, c, d, x(k + 13), s21, &ha9e3e905

  485. md5_gg d, a, b, c, x(k + 2), s22, &hfcefa3f8

  486. md5_gg c, d, a, b, x(k + 7), s23, &h676f02d9

  487. md5_gg b, c, d, a, x(k + 12), s24, &h8d2a4c8a

  488.  
  489. md5_hh a, b, c, d, x(k + 5), s31, &hfffa3942

  490. md5_hh d, a, b, c, x(k + 8), s32, &h8771f681

  491. md5_hh c, d, a, b, x(k + 11), s33, &h6d9d6122

  492. md5_hh b, c, d, a, x(k + 14), s34, &hfde5380c

  493. md5_hh a, b, c, d, x(k + 1), s31, &ha4beea44

  494. md5_hh d, a, b, c, x(k + 4), s32, &h4bdecfa9

  495. md5_hh c, d, a, b, x(k + 7), s33, &hf6bb4b60

  496. md5_hh b, c, d, a, x(k + 10), s34, &hbebfbc70

  497. md5_hh a, b, c, d, x(k + 13), s31, &h289b7ec6

  498. md5_hh d, a, b, c, x(k + 0), s32, &heaa127fa

  499. md5_hh c, d, a, b, x(k + 3), s33, &hd4ef3085

  500. md5_hh b, c, d, a, x(k + 6), s34, &h4881d05

  501. md5_hh a, b, c, d, x(k + 9), s31, &hd9d4d039

  502. md5_hh d, a, b, c, x(k + 12), s32, &he6db99e5

  503. md5_hh c, d, a, b, x(k + 15), s33, &h1fa27cf8

  504. md5_hh b, c, d, a, x(k + 2), s34, &hc4ac5665

  505.  
  506. md5_ii a, b, c, d, x(k + 0), s41, &hf4292244

  507. md5_ii d, a, b, c, x(k + 7), s42, &h432aff97

  508. md5_ii c, d, a, b, x(k + 14), s43, &hab9423a7

  509. md5_ii b, c, d, a, x(k + 5), s44, &hfc93a039

  510. md5_ii a, b, c, d, x(k + 12), s41, &h655b59c3

  511. md5_ii d, a, b, c, x(k + 3), s42, &h8f0ccc92

  512. md5_ii c, d, a, b, x(k + 10), s43, &hffeff47d

  513. md5_ii b, c, d, a, x(k + 1), s44, &h85845dd1

  514. md5_ii a, b, c, d, x(k + 8), s41, &h6fa87e4f

  515. md5_ii d, a, b, c, x(k + 15), s42, &hfe2ce6e0

  516. md5_ii c, d, a, b, x(k + 6), s43, &ha3014314

  517. md5_ii b, c, d, a, x(k + 13), s44, &h4e0811a1

  518. md5_ii a, b, c, d, x(k + 4), s41, &hf7537e82

  519. md5_ii d, a, b, c, x(k + 11), s42, &hbd3af235

  520. md5_ii c, d, a, b, x(k + 2), s43, &h2ad7d2bb

  521. md5_ii b, c, d, a, x(k + 9), s44, &heb86d391

  522.  
  523. a = addunsigned(a, aa)

  524. b = addunsigned(b, bb)

  525. c = addunsigned(c, cc)

  526. d = addunsigned(d, dd)

  527. next

  528.  
  529. 'md5 = lcase(wordtohex(a) & wordtohex(b) & wordtohex(c) & wordtohex(d))

  530. md5_16=lcase(wordtohex(b) & wordtohex(c)) 'i crop this to fit 16byte database password :d

  531.  
  532. md5_16=ucase(md5_16)

  533. end function

  534. '---------------------------------Md5 Over

  535. '-----------依然需要使用昨天弄的字符串转 UTF-8 字串函数

  536. Public Function str2UTF8(szInput) '只返回十六进制文本串 -----20200524改合

  537. Dim wch, uch, szRet

  538. Dim x, i

  539. Dim nAsc, nAsc2, nAsc3, s2b()

  540. '如果输入参数为空,则退出函数

  541. If szInput = "" Then

  542. str2UTF8 = szInput

  543. Exit Function

  544. End If

  545. '开始转换

  546. For x = 1 To Len(szInput)

  547. '利用mid函数分拆GB编码文字

  548. wch = Mid(szInput, x, 1)

  549. '利用ascW函数返回每一个GB编码文字的Unicode字符代码

  550. '注:asc函数返回的是ANSI 字符代码,注意区别

  551. nAsc = AscW(wch)

  552. If nAsc < 0 Then

  553. nAsc = nAsc + 65536

  554. End If

  555.  
  556. If (nAsc And &HFF80) = 0 Then

  557. szRet = szRet & Right("00" & Hex(Asc(wch)), 2)

  558. Else

  559. If (nAsc And &HF000) = 0 Then

  560. uch = Hex(((nAsc \ 64)) Or &HC0) & Hex(nAsc And &H3F Or &H80)

  561. szRet = szRet & uch

  562. Else

  563. 'GB编码文字的Unicode字符代码在0800 - FFFF之间采用三字节模版 , 2 ^ 12=4096 , 2 ^ 6=64

  564. uch = Hex((nAsc \ 4096) Or &HE0) & _

  565. Hex((nAsc \ 64) And &H3F Or &H80) & _

  566. Hex(nAsc And &H3F Or &H80)

  567. szRet = szRet & uch

  568. End If

  569. End If

  570. Next

  571. str2UTF8 = szRet

  572. End Function

  573.  
  574. '---------------------因为这个过程好几个地方用到,因此将它单独提出来做个独立的函数

  575. Public Function HexStr2ByteArr(hexstr) ' 转换文本型十六进制串为 byte 数组,例:E4B8AD -----20200524改分

  576. Dim i, L, mAllByteIn()

  577. L = Len(hexstr) / 2 - 1

  578. ReDim mAllByteIn(L)

  579. For i = 0 To L

  580. mAllByteIn(i) = CByte("&H" & Mid(hexstr, i * 2 + 1, 2))

  581. Next

  582. HexStr2ByteArr = mAllByteIn

  583. End Function

其中改造了的函数就是 converttowordarray ,这个是将输入的字符串进行处理转换的。

使用例子如下:

msgbox md5("123中文,?αabc") '正确结果应为:2EC80A3192DB1122A1ED5884788C4027

PS:之前,想用 Adodb.Stream 进行 UTF-8 编码转换,但是最后发现 VBS 在内存变量里面的字符串,永远是 unicode 格式,所以,.ReadText 后得到的字符串其实是无效的,改天试试  .Read 。

此记!

标签:clng,VB,ASP,UTF,l2power,gg,const,lonbits,md5
来源: https://blog.csdn.net/sd19871122/article/details/111563862

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有