md5_encrypt.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // 主MD5哈希函数,接收字符串输入并返回其MD5哈希值
  2. function r(r) {
  3. // 将输入字符串转换为字节数组,并计算MD5哈希值
  4. return i(t(a(r), 8 * r.length))
  5. }
  6. // MD5核心处理函数,执行MD5算法的主要计算过程
  7. function t(r, t) {
  8. // 添加填充位(1位'1'和若干位'0')
  9. r[t >> 5] |= 128 << t % 32,
  10. // 添加原始消息长度(以位为单位)
  11. r[14 + (t + 64 >>> 9 << 4)] = t;
  12. // 初始化MD5缓冲区的四个32位字
  13. for (var n = 1732584193, a = -271733879, i = -1732584194, l = 271733878, v = 0; v < r.length; v += 16) {
  14. // 保存当前缓冲区值
  15. var d = n, h = a, s = i, A = l;
  16. // 第一轮运算(16步)
  17. n = e(n, a, i, l, r[v + 0], 7, -680876936),
  18. l = e(l, n, a, i, r[v + 1], 12, -389564586),
  19. i = e(i, l, n, a, r[v + 2], 17, 606105819),
  20. a = e(a, i, l, n, r[v + 3], 22, -1044525330),
  21. n = e(n, a, i, l, r[v + 4], 7, -176418897),
  22. l = e(l, n, a, i, r[v + 5], 12, 1200080426),
  23. i = e(i, l, n, a, r[v + 6], 17, -1473231341),
  24. a = e(a, i, l, n, r[v + 7], 22, -45705983),
  25. n = e(n, a, i, l, r[v + 8], 7, 1770035416),
  26. l = e(l, n, a, i, r[v + 9], 12, -1958414417),
  27. i = e(i, l, n, a, r[v + 10], 17, -42063),
  28. a = e(a, i, l, n, r[v + 11], 22, -1990404162),
  29. n = e(n, a, i, l, r[v + 12], 7, 1804603682),
  30. l = e(l, n, a, i, r[v + 13], 12, -40341101),
  31. i = e(i, l, n, a, r[v + 14], 17, -1502002290),
  32. n = u(n, a = e(a, i, l, n, r[v + 15], 22, 1236535329), i, l, r[v + 1], 5, -165796510),
  33. // 第二轮运算(16步)
  34. l = u(l, n, a, i, r[v + 6], 9, -1069501632),
  35. i = u(i, l, n, a, r[v + 11], 14, 643717713),
  36. a = u(a, i, l, n, r[v + 0], 20, -373897302),
  37. n = u(n, a, i, l, r[v + 5], 5, -701558691),
  38. l = u(l, n, a, i, r[v + 10], 9, 38016083),
  39. i = u(i, l, n, a, r[v + 15], 14, -660478335),
  40. a = u(a, i, l, n, r[v + 4], 20, -405537848),
  41. n = u(n, a, i, l, r[v + 9], 5, 568446438),
  42. l = u(l, n, a, i, r[v + 14], 9, -1019803690),
  43. i = u(i, l, n, a, r[v + 3], 14, -187363961),
  44. a = u(a, i, l, n, r[v + 8], 20, 1163531501),
  45. n = u(n, a, i, l, r[v + 13], 5, -1444681467),
  46. l = u(l, n, a, i, r[v + 2], 9, -51403784),
  47. i = u(i, l, n, a, r[v + 7], 14, 1735328473),
  48. n = o(n, a = u(a, i, l, n, r[v + 12], 20, -1926607734), i, l, r[v + 5], 4, -378558),
  49. // 第三轮运算(16步)
  50. l = o(l, n, a, i, r[v + 8], 11, -2022574463),
  51. i = o(i, l, n, a, r[v + 11], 16, 1839030562),
  52. a = o(a, i, l, n, r[v + 14], 23, -35309556),
  53. n = o(n, a, i, l, r[v + 1], 4, -1530992060),
  54. l = o(l, n, a, i, r[v + 4], 11, 1272893353),
  55. i = o(i, l, n, a, r[v + 7], 16, -155497632),
  56. a = o(a, i, l, n, r[v + 10], 23, -1094730640),
  57. n = o(n, a, i, l, r[v + 13], 4, 681279174),
  58. l = o(l, n, a, i, r[v + 0], 11, -358537222),
  59. i = o(i, l, n, a, r[v + 3], 16, -722521979),
  60. a = o(a, i, l, n, r[v + 6], 23, 76029189),
  61. n = o(n, a, i, l, r[v + 9], 4, -640364487),
  62. l = o(l, n, a, i, r[v + 12], 11, -421815835),
  63. i = o(i, l, n, a, r[v + 15], 16, 530742520),
  64. n = f(n, a = o(a, i, l, n, r[v + 2], 23, -995338651), i, l, r[v + 0], 6, -198630844),
  65. // 第四轮运算(16步)
  66. l = f(l, n, a, i, r[v + 7], 10, 1126891415),
  67. i = f(i, l, n, a, r[v + 14], 15, -1416354905),
  68. a = f(a, i, l, n, r[v + 5], 21, -57434055),
  69. n = f(n, a, i, l, r[v + 12], 6, 1700485571),
  70. l = f(l, n, a, i, r[v + 3], 10, -1894986606),
  71. i = f(i, l, n, a, r[v + 10], 15, -1051523),
  72. a = f(a, i, l, n, r[v + 1], 21, -2054922799),
  73. n = f(n, a, i, l, r[v + 8], 6, 1873313359),
  74. l = f(l, n, a, i, r[v + 15], 10, -30611744),
  75. i = f(i, l, n, a, r[v + 6], 15, -1560198380),
  76. a = f(a, i, l, n, r[v + 13], 21, 1309151649),
  77. n = f(n, a, i, l, r[v + 4], 6, -145523070),
  78. l = f(l, n, a, i, r[v + 11], 10, -1120210379),
  79. i = f(i, l, n, a, r[v + 2], 15, 718787259),
  80. a = f(a, i, l, n, r[v + 9], 21, -343485551),
  81. // 更新缓冲区
  82. n = c(n, d),
  83. a = c(a, h),
  84. i = c(i, s),
  85. l = c(l, A)
  86. }
  87. // 返回最终的哈希值
  88. return Array(n, a, i, l)
  89. }
  90. // 基本MD5操作函数 - 执行循环左移和加法操作
  91. function n(r, t, n, e, u, o) {
  92. // 执行循环左移和加法运算
  93. return c((f = c(c(t, r), c(e, o))) << (a = u) | f >>> 32 - a, n);
  94. var f, a
  95. }
  96. // 第一轮函数 F(b,c,d) = (b & c) | (~b & d)
  97. function e(r, t, e, u, o, f, c) {
  98. return n(t & e | ~t & u, r, t, o, f, c)
  99. }
  100. // 第二轮函数 G(b,c,d) = (b & d) | (c & ~d)
  101. function u(r, t, e, u, o, f, c) {
  102. return n(t & u | e & ~u, r, t, o, f, c)
  103. }
  104. // 第三轮函数 H(b,c,d) = b ^ c ^ d
  105. function o(r, t, e, u, o, f, c) {
  106. return n(t ^ e ^ u, r, t, o, f, c)
  107. }
  108. // 第四轮函数 I(b,c,d) = c ^ (b | ~d)
  109. function f(r, t, e, u, o, f, c) {
  110. return n(e ^ (t | ~u), r, t, o, f, c)
  111. }
  112. // 32位加法运算(模2^32)
  113. function c(r, t) {
  114. var n = (65535 & r) + (65535 & t);
  115. return (r >> 16) + (t >> 16) + (n >> 16) << 16 | 65535 & n
  116. }
  117. // 将字符串转换为32位字数组
  118. function a(r) {
  119. for (var t = Array(), n = 0; n < 8 * r.length; n += 8)
  120. t[n >> 5] |= (255 & r.charCodeAt(n / 8)) << n % 32;
  121. return t
  122. }
  123. // 将32位字数组转换为十六进制字符串
  124. function i(r) {
  125. for (var t = "0123456789abcdef", n = "", e = 0; e < 4 * r.length; e++)
  126. n += t.charAt(r[e >> 2] >> e % 4 * 8 + 4 & 15) + t.charAt(r[e >> 2] >> e % 4 * 8 & 15);
  127. return n
  128. }