找回密码
 快速注册
搜索
查看: 171|回复: 1

md5

[复制链接]

3147

主题

8381

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65357
QQ

显示全部楼层

hbghlyj 发表于 2022-2-5 08:31 |阅读模式
本帖最后由 hbghlyj 于 2022-2-6 00:21 编辑 登录的时候会发现密码闪了一下,好像变成一个很长的字符串,原来是经过md5加密了,以下是Discuz里面的md5.js
  1. var hexcase = 0;
  2. var chrsz = 8;
  3. function hex_md5(s) {
  4. return binl2hex(core_md5(str2binl(s), s.length * chrsz));
  5. }
  6. function core_md5(x, len) {
  7. x[len >> 5] |= 0x80 << ((len) % 32);
  8. x[(((len + 64) >>> 9) << 4) + 14] = len;
  9. var a = 1732584193;
  10. var b = -271733879;
  11. var c = -1732584194;
  12. var d = 271733878;
  13. for (var i = 0; i < x.length; i += 16) {
  14. var olda = a;
  15. var oldb = b;
  16. var oldc = c;
  17. var oldd = d;
  18. a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
  19. d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
  20. c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
  21. b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
  22. a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
  23. d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
  24. c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
  25. b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
  26. a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
  27. d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
  28. c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
  29. b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
  30. a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
  31. d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
  32. c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
  33. b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
  34. a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
  35. d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
  36. c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
  37. b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
  38. a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
  39. d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
  40. c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
  41. b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
  42. a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
  43. d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
  44. c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
  45. b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
  46. a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
  47. d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
  48. c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
  49. b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
  50. a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
  51. d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
  52. c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
  53. b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
  54. a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
  55. d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
  56. c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
  57. b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
  58. a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
  59. d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
  60. c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
  61. b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
  62. a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
  63. d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
  64. c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
  65. b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
  66. a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
  67. d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
  68. c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
  69. b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
  70. a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
  71. d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
  72. c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
  73. b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
  74. a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
  75. d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
  76. c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
  77. b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
  78. a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
  79. d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
  80. c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
  81. b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
  82. a = safe_add(a, olda);
  83. b = safe_add(b, oldb);
  84. c = safe_add(c, oldc);
  85. d = safe_add(d, oldd);
  86. }
  87. return Array(a, b, c, d);
  88. }
  89. function md5_cmn(q, a, b, x, s, t) {
  90. return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
  91. }
  92. function md5_ff(a, b, c, d, x, s, t) {
  93. return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
  94. }
  95. function md5_gg(a, b, c, d, x, s, t) {
  96. return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
  97. }
  98. function md5_hh(a, b, c, d, x, s, t) {
  99. return md5_cmn(b ^ c ^ d, a, b, x, s, t);
  100. }
  101. function md5_ii(a, b, c, d, x, s, t) {
  102. return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
  103. }
  104. function safe_add(x, y) {
  105. var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  106. var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  107. return (msw << 16) | (lsw & 0xFFFF);
  108. }
  109. function bit_rol(num, cnt) {
  110. return (num << cnt) | (num >>> (32 - cnt));
  111. }
  112. function str2binl(str) {
  113. var bin = Array();
  114. var mask = (1 << chrsz) - 1;
  115. for (var i = 0; i < str.length * chrsz; i += chrsz) {
  116. bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
  117. }
  118. return bin;
  119. }
  120. function binl2hex(binarray) {
  121. var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  122. var str = "";
  123. for (var i = 0; i < binarray.length * 4; i++) {
  124. str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF);
  125. }
  126. return str;
  127. }
  128. var pwmd5log = new Array();
  129. function pwmd5() {
  130. if (!$(pwmd5.arguments[0]) || $(pwmd5.arguments[0]).value == '') {
  131. return;
  132. }
  133. numargs = pwmd5.arguments.length;
  134. for (var i = 0; i < numargs; i++) {
  135. if (!pwmd5log[pwmd5.arguments[i]] || $(pwmd5.arguments[i]).value.length != 32) {
  136. pwmd5log[pwmd5.arguments[i]] = $(pwmd5.arguments[i]).value = hex_md5($(pwmd5.arguments[i]).value);
  137. }
  138. }
  139. }
复制代码
例如,空字符串
  1. hex_md5('')
复制代码
结果是d41d8cd98f00b204e9800998ecf8427e
  1. hex_md5('2022.02.05')
复制代码
结果是1161d24dcf0ccd738b7d36e7d292cc6e 关于md5碰撞
The above files were generated by exploiting two facts: the block structure of the MD5 function, and the fact that Wang and Yu's technique works for an arbitrary initialization vector. To understand what this means, it is useful to have a general idea of how the MD5 function processes its input. This is done by an iteration method known as the Merkle-Damgard method. A given input file is first padded so that its length will be a multiple of 64 bytes. It is then divided into individual 64-byte blocks M0, M1, ..., Mn-1. The MD5 hash is computed by computing a sequence of 16-byte states s0, ..., sn, according to the rule: si+1 = f(si, Mi), where f is a certain fixed (and complicated) function. Here, the initial state s0 is fixed, and is called the initialization vector. The final state sn is the computed MD5 hash.

The method of Wang and Yu makes it possible, for a given initialization vector s, to find two pairs of blocks M,M' and N,N', such that f(f(s, M), M') = f(f(s, N), N'). It is important that this works for any initialization vector s, and not just for the standard initialization vector s0.

Combining these observations, it is possible to find pairs of files of arbitrary length, which are identical except for 128 bytes somewhere in the middle of the file, and which have identical MD5 hash. Indeed, let us write the two files as sequences of 64-byte blocks:

M0, M1, ..., Mi-1, Mi, Mi+1, Mi+2, ..., Mn,

M0, M1, ..., Mi-1, Ni, Ni+1, Mi+2, ..., Mn.

The blocks at the beginning of the files, M0, ..., Mi-1, can be chosen arbitrarily. Suppose that the internal state of the MD5 hash function after processing these blocks is si. Now we can apply Wang and Yu's method to the initialization vector si, to find two pairs of blocks Mi, Mi+1 and Ni, Ni+1, such that

si+2 = f(f(si, Mi), Mi+1) = f(f(si, Ni), Ni+1).

This guarantees that the internal state si+2 after the i+2st block will be the same for the two files. Finally, the remaining blocks Mi+2, ..., Mn can again be chosen arbitrarily.

So how can we use this technique to produce a pair of programs (or postscript files) that have identical MD5 hash, yet behave in arbitrary different ways? This is simple. All we have to do is write the two programs like this:

Program 1: if (data1 == data1) then { good_program } else { evil_program }
Program 2: if (data2 == data1) then { good_program } else { evil_program }

and arrange things so that "data1" = Mi, Mi+1 and "data2" = Ni, Ni+1 in the above scheme. This can even be done in a compiled program, by first compiling it with dummy values for data1 and data2, and later replacing them with the properly computed values.

k

0

主题

1

回帖

6

积分

积分
6

显示全部楼层

k 发表于 2022-2-5 08:38
但是,禁用js后仍能登录,这是什么原理呢

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 19:49

Powered by Discuz!

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