js 逆向破解
阿新 • • 發佈:2020-12-10
寫在前面:由於業務需要,需要破解某網站登入使用者名稱、密碼加密,於是我便花了一上午時間研究該網站請求,加密,玩了一把逆向破解,以下是詳細說明:
申明
本部落格內容只為記錄破解過程,不作為商業使用,若有人使用該部落格內容進行惡意破解,後果自負
內容
某業務網站,在輸入登入使用者名稱、密碼後,會對其進行加密,於是我便跟蹤其請求路徑,對其請求進行了一次抓包,發現輸入使用者名稱密碼提交後,
使用者名稱加密為:kC2iKCQDiNk%3D 密碼加密為:srai6AlYKd3pcMSqkBGb5efl1x1yVJ%2BhSk%2BwxrS%2FYW%2BQLaIoJAOI2Q%3D%3D,於是跟蹤其路徑,進入斷點一步一步除錯,
最終找到其核心加密檔案
md5.js
var hexcase = 0, b64pad = "", chrsz = 8; function hex_md5(d) { return binl2hex(core_md5(str2binl(d), d.length * chrsz)) } function b64_md5(d) { return binl2b64(core_md5(str2binl(d), d.length * chrsz)) } function hex_hmac_md5(d, _) { return binl2hex(core_hmac_md5(d, _)) }function b64_hmac_md5(d, _) { return binl2b64(core_hmac_md5(d, _)) } function calcMD5(d) { return binl2hex(core_md5(str2binl(d), d.length * chrsz)) } function md5_vm_test() { return "900150983cd24fb0d6963f7d28e17f72" == hex_md5("abc") } function core_md5(d, _) { d[_ >> 5] |= 128 << _ % 32, d[14 + (_ + 64 >>> 9 << 4)] = _; for (var m = 1732584193, r = -271733879, n = -1732584194, h = 271733878, f = 0; f < d.length; f += 16) { var i = m, c = r, e = n, t = h, m = md5_ff(m, r, n, h, d[f + 0], 7, -680876936), h = md5_ff(h, m, r, n, d[f + 1], 12, -389564586), n = md5_ff(n, h, m, r, d[f + 2], 17, 606105819), r = md5_ff(r, n, h, m, d[f + 3], 22, -1044525330); m = md5_ff(m, r, n, h, d[f + 4], 7, -176418897), h = md5_ff(h, m, r, n, d[f + 5], 12, 1200080426), n = md5_ff(n, h, m, r, d[f + 6], 17, -1473231341), r = md5_ff(r, n, h, m, d[f + 7], 22, -45705983), m = md5_ff(m, r, n, h, d[f + 8], 7, 1770035416), h = md5_ff(h, m, r, n, d[f + 9], 12, -1958414417), n = md5_ff(n, h, m, r, d[f + 10], 17, -42063), r = md5_ff(r, n, h, m, d[f + 11], 22, -1990404162), m = md5_ff(m, r, n, h, d[f + 12], 7, 1804603682), h = md5_ff(h, m, r, n, d[f + 13], 12, -40341101), n = md5_ff(n, h, m, r, d[f + 14], 17, -1502002290), m = md5_gg(m, r = md5_ff(r, n, h, m, d[f + 15], 22, 1236535329), n, h, d[f + 1], 5, -165796510), h = md5_gg(h, m, r, n, d[f + 6], 9, -1069501632), n = md5_gg(n, h, m, r, d[f + 11], 14, 643717713), r = md5_gg(r, n, h, m, d[f + 0], 20, -373897302), m = md5_gg(m, r, n, h, d[f + 5], 5, -701558691), h = md5_gg(h, m, r, n, d[f + 10], 9, 38016083), n = md5_gg(n, h, m, r, d[f + 15], 14, -660478335), r = md5_gg(r, n, h, m, d[f + 4], 20, -405537848), m = md5_gg(m, r, n, h, d[f + 9], 5, 568446438), h = md5_gg(h, m, r, n, d[f + 14], 9, -1019803690), n = md5_gg(n, h, m, r, d[f + 3], 14, -187363961), r = md5_gg(r, n, h, m, d[f + 8], 20, 1163531501), m = md5_gg(m, r, n, h, d[f + 13], 5, -1444681467), h = md5_gg(h, m, r, n, d[f + 2], 9, -51403784), n = md5_gg(n, h, m, r, d[f + 7], 14, 1735328473), m = md5_hh(m, r = md5_gg(r, n, h, m, d[f + 12], 20, -1926607734), n, h, d[f + 5], 4, -378558), h = md5_hh(h, m, r, n, d[f + 8], 11, -2022574463), n = md5_hh(n, h, m, r, d[f + 11], 16, 1839030562), r = md5_hh(r, n, h, m, d[f + 14], 23, -35309556), m = md5_hh(m, r, n, h, d[f + 1], 4, -1530992060), h = md5_hh(h, m, r, n, d[f + 4], 11, 1272893353), n = md5_hh(n, h, m, r, d[f + 7], 16, -155497632), r = md5_hh(r, n, h, m, d[f + 10], 23, -1094730640), m = md5_hh(m, r, n, h, d[f + 13], 4, 681279174), h = md5_hh(h, m, r, n, d[f + 0], 11, -358537222), n = md5_hh(n, h, m, r, d[f + 3], 16, -722521979), r = md5_hh(r, n, h, m, d[f + 6], 23, 76029189), m = md5_hh(m, r, n, h, d[f + 9], 4, -640364487), h = md5_hh(h, m, r, n, d[f + 12], 11, -421815835), n = md5_hh(n, h, m, r, d[f + 15], 16, 530742520), m = md5_ii(m, r = md5_hh(r, n, h, m, d[f + 2], 23, -995338651), n, h, d[f + 0], 6, -198630844), h = md5_ii(h, m, r, n, d[f + 7], 10, 1126891415), n = md5_ii(n, h, m, r, d[f + 14], 15, -1416354905), r = md5_ii(r, n, h, m, d[f + 5], 21, -57434055), m = md5_ii(m, r, n, h, d[f + 12], 6, 1700485571), h = md5_ii(h, m, r, n, d[f + 3], 10, -1894986606), n = md5_ii(n, h, m, r, d[f + 10], 15, -1051523), r = md5_ii(r, n, h, m, d[f + 1], 21, -2054922799), m = md5_ii(m, r, n, h, d[f + 8], 6, 1873313359), h = md5_ii(h, m, r, n, d[f + 15], 10, -30611744), n = md5_ii(n, h, m, r, d[f + 6], 15, -1560198380), r = md5_ii(r, n, h, m, d[f + 13], 21, 1309151649), m = md5_ii(m, r, n, h, d[f + 4], 6, -145523070), h = md5_ii(h, m, r, n, d[f + 11], 10, -1120210379), n = md5_ii(n, h, m, r, d[f + 2], 15, 718787259), r = md5_ii(r, n, h, m, d[f + 9], 21, -343485551), m = safe_add(m, i), r = safe_add(r, c), n = safe_add(n, e), h = safe_add(h, t) } return Array(m, r, n, h) } function md5_cmn(d, _, m, r, n, h) { return safe_add(bit_rol(safe_add(safe_add(_, d), safe_add(r, h)), n), m) } function md5_ff(d, _, m, r, n, h, f) { return md5_cmn(_ & m | ~_ & r, d, _, n, h, f) } function md5_gg(d, _, m, r, n, h, f) { return md5_cmn(_ & r | m & ~r, d, _, n, h, f) } function md5_hh(d, _, m, r, n, h, f) { return md5_cmn(_ ^ m ^ r, d, _, n, h, f) } function md5_ii(d, _, m, r, n, h, f) { return md5_cmn(m ^ (_ | ~r), d, _, n, h, f) } function core_hmac_md5(d, _) { var m = str2binl(d); 16 < m.length && (m = core_md5(m, d.length * chrsz)); for (var r = Array(16), n = Array(16), h = 0; h < 16; h++) r[h] = 909522486 ^ m[h], n[h] = 1549556828 ^ m[h]; var f = core_md5(r.concat(str2binl(_)), 512 + _.length * chrsz); return core_md5(n.concat(f), 640) } function safe_add(d, _) { var m = (65535 & d) + (65535 & _); return (d >> 16) + (_ >> 16) + (m >> 16) << 16 | 65535 & m } function bit_rol(d, _) { return d << _ | d >>> 32 - _ } function str2binl(d) { for (var _ = Array(), m = (1 << chrsz) - 1, r = 0; r < d.length * chrsz; r += chrsz) _[r >> 5] |= (d.charCodeAt(r / chrsz) & m) << r % 32; return _ } function binl2hex(d) { for (var _ = hexcase ? "0123456789ABCDEF" : "0123456789abcdef", m = "", r = 0; r < 4 * d.length; r++) m += _.charAt(d[r >> 2] >> r % 4 * 8 + 4 & 15) + _.charAt(d[r >> 2] >> r % 4 * 8 & 15); return m } function binl2b64(d) { for (var _ = "", m = 0; m < 4 * d.length; m += 3) for (var r = (d[m >> 2] >> m % 4 * 8 & 255) << 16 | (d[m + 1 >> 2] >> (m + 1) % 4 * 8 & 255) << 8 | d[m + 2 >> 2] >> (m + 2) % 4 * 8 & 255, n = 0; n < 4; n++) 8 * m + 6 * n > 32 * d.length ? _ += b64pad : _ += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(r >> 6 * (3 - n) & 63); return _ }
des.js
define("components-path/loading/template", [], function() { return '<div id="loadingBox" class="cm-loading"></div>' }), define("components-path/modal/main", ["jquery", "blockUI"], function(p) { var f = 0; function m(t, e) { return void 0 === t ? e : t } return { showModalByFragment: function(t, e, n, o) { var r = t ? t instanceof p ? t : p("#" + t) : p(window) , i = t ? r : p("body") , a = o || {} , s = "__template_wrap_modal_" + f++ , c = "<div style='display: none' id='" + s + "'>" + e + "</div>"; i.append(c); var l = p("#" + s) , u = l.outerWidth() , h = l.outerHeight(); l.remove(); var d = { cursor: "normal", border: 0, "background-color": "transparent", "z-index": 50001, "text-align": "left", width: u, height: h, left: (r.outerWidth() - u) / 2 + "px", top: (r.outerHeight() - h) / 2 + "px" }; return r.block({ message: e, fadeIn: m(a.fadeIn, 200), timeout: m(a.timeout, 0), centerX: !1, centerY: !1, showOverlay: m(a.showOverlay, !0), overlayCSS: p.extend({ cursor: "normal", "z-index": 5e4 }, a.overlayCSS), css: p.extend(d, a.css), onBlock: function() { n && n() } }), r }, showModalById: function(t, e, n, o) { var r = t ? t instanceof p ? t : p("#" + t) : p(window) , i = e instanceof p ? e : p("#" + e) , a = o || {} , s = i.outerWidth() , c = i.outerHeight() , l = { cursor: "normal", border: 0, "background-color": "transparent", "text-align": "left", "z-index": 50001, width: s, height: c, left: (r.outerWidth() - s) / 2 + "px", top: parseInt(r.outerHeight()) - 49 > parseInt(c) ? (r.outerHeight() - 49 - c) / 2 + "px" : "35px" }; return r.block({ message: i, fadeIn: m(a.fadeIn, 200), timeout: m(a.timeout, 0), centerX: !0, centerY: !0, showOverlay: m(a.showOverlay, !0), overlayCSS: p.extend({ cursor: "normal", "z-index": 5e4 }, a.overlayCSS), css: p.extend(l, a.css), onBlock: function() { n && n() }, onUnblock: function() { a.unblockFn && a.unblockFn() } }), r }, hideModal: function(t, e, n) { var o = n || {}; (t ? t instanceof p ? t : p("#" + t) : p(window)).unblock({ fadeOut: m(o.fadeOut, 200), onUnblock: function() { e && e() } }) } } }), define("components-path/loading/main", ["ko", "components-path/loading/template", "components-path/modal/main"], function(t, n, o) { return { showLoading: function(t, e) { return o.showModalByFragment(t, n, e) }, hideLoading: function(t, e) { o.hideModal(t, e) } } }), define("modules-common-path/ajax.util", ["jquery"], function(a) { return { get: function(t, e, n, o, r) { for (i in e) e[i] = encodeURIComponent(e[i]); a.ajax({ type: "GET", contentType: "application/json; charset=utf-8", url: t + "?r=" + Math.random(), data: e, dataType: r || "json", success: function(t) { null != n && n(t) }, error: function(t, e) { o(e, t) }, complete: function(t, e) { if (401 == t.status || 302 == t.status) return window.location.href = t.getResponseHeader("Location"), !1 }, timeout: 12e4 }) }, post: function(t, e, n, o, r) { for (i in e) e[i] = encodeURIComponent(e[i]); a.ajax({ type: "POST", url: t + "?r=" + Math.random(), data: e, dataType: r || "json", success: function(t) { null != n && n(t) }, error: function(t, e, n) { o(e, t) }, complete: function(t, e) { if (401 == t.status || 302 == t.status) return window.location.href = t.getResponseHeader("Location"), !1 }, timeout: 12e4 }) }, postquerypay: function(t, e, n, o, r) { for (i in e) e[i] = encodeURIComponent(e[i]); a.ajax({ type: "POST", url: t + "?r=" + Math.random(), data: e, dataType: r || "json", success: function(t) { null != n && n(t) }, error: function(t, e, n) { o(e, t) }, complete: function(t, e) { if (401 == t.status || 302 == t.status) return window.location.href = t.getResponseHeader("Location"), !1 }, timeout: 66e4 }) }, getquerypay: function(t, e, n, o, r) { for (i in e) e[i] = encodeURIComponent(e[i]); a.ajax({ type: "GET", contentType: "application/json; charset=utf-8", url: t + "?r=" + Math.random(), data: e, dataType: r || "json", success: function(t) { null != n && n(t) }, error: function(t, e) { o(e, t) }, complete: function(t, e) { if (401 == t.status || 302 == t.status) return window.location.href = t.getResponseHeader("Location"), !1 }, timeout: 66e4 }) } } }), define("modules-common-path/url.util", [], function() { function d() { this.protocol = null, this.slashes = null, this.host = null, this.port = null, this.hostname = null, this.hash = null, this.search = null, this.query = null, this.pathname = null, this.path = null, this.href = null } var p = /^([a-z0-9.+-]+:)/i , n = /:[0-9]*$/ , f = { http: !0, "http:": !0, https: !0, "https:": !0, ftp: !0, "ftp:": !0, gopher: !0, "gopher:": !0, file: !0, "file:": !0 }; function s(t) { return "string" == typeof t ? t : "number" == typeof t && isFinite(t) ? "" + t : "boolean" == typeof t ? t ? "true" : "false" : "" } return d.prototype.parseHost = function() { var t = this.host , e = n.exec(t); e && (":" !== (e = e[0]) && (this.port = e.slice(1)), t = t.slice(0, t.length - e.length)), t && (this.hostname = t) } , d.prototype.parse = function(t, e) { if ("string" != typeof t) throw new TypeError('Parameter "url" must be a string, not ' + typeof t); t = t.replace(/\\\\/g, "/"); var n, o = p.exec(t); o && (n = (o = o[0]).toLowerCase(), this.protocol = n, t = t.slice(o.length)), 2 <= t.length && 47 === t.charCodeAt(0) && 47 === t.charCodeAt(1) && (t = t.slice(2), this.slashes = !0); var r = -1; for (i = 0; i < t.length; ++i) { if (35 === t.charCodeAt(i) || 47 === t.charCodeAt(i) || 63 === t.charCodeAt(i)) { r = i; break } if (i === t.length - 1) { r = i + 1; break } } -1 !== r && (this.host = t.slice(0, r), t = t.slice(r)), this.parseHost(), "string" != typeof this.hostname && (this.hostname = ""); var a = -1 , s = -1; for (i = 0; i < t.length; ++i) { var c = t.charCodeAt(i); if (35 === c) { this.hash = t.slice(i), s = i; break } 63 === c && -1 === a && (a = i) } -1 !== a ? (-1 === s ? (this.search = t.slice(a), this.query = t.slice(a + 1)) : (this.search = t.slice(a, s), this.query = t.slice(a + 1, s)), e && (this.query = d.queryParse(this.query))) : e && (this.search = "", this.query = {}); var l, u, h = -1 !== a && (-1 === s || a < s) ? a : s; return -1 === h ? 0 < t.length && (this.pathname = t) : 0 < h && (this.pathname = t.slice(0, h)), f[n] && this.hostname && !this.pathname && (this.pathname = "/"), (this.pathname || this.search) && (l = this.pathname || "", u = this.search || "", this.path = l + u), this.href = this.format(), this } , d.queryParse = function(t, e, n) { e = e || "&", n = n || "="; var o = {}; if ("string" != typeof t || 0 === t.length) return o; var r = t.indexOf("#"); 0 <= r && (t = t.slice(0, r)); var i, a, s, c, l = t.split(e); for (i in l) { l[i] && (s = a = "", (c = l[i].indexOf(n)) < 0 ? (a = l[i], s = "") : 0 !== c && (a = l[i].slice(0, c), s = l[i].slice(c + n.length), o[decodeURIComponent(a)] = decodeURIComponent(s))) } return o } , d.prototype.format = function() { var t = this.protocol || "" , e = this.pathname || "" , n = this.hash || "" , o = "" , r = ""; this.host ? o = this.host : this.hostname && (o = this.hostname + (this.port ? ":" + this.port : "")), null !== this.query && "object" == typeof this.query && (r = d.queryStringify(this.query)); var i = (i = this.search || r && "?" + r || "").replace(/#/g, "%23"); return t && 58 !== t.charCodeAt(t.length - 1) && (t += ":"), e = e.replace(/#/g, "%23").replace(/\?/g, "%3F"), (this.slashes || f[t]) && (this.slashes || o ? (e && 47 !== e.charCodeAt(0) && (e = "/" + e), o = "//" + o) : 4 <= t.length && 102 === t.charCodeAt(0) && 105 === t.charCodeAt(1) && 108 === t.charCodeAt(2) && 101 === t.charCodeAt(3) && (o = "//")), n && 35 !== n.charCodeAt(0) && (n = "#" + n), i && 63 !== i.charCodeAt(0) && (i = "?" + i), t + o + e + i + n } , d.queryStringify = function(t, e, n) { e = e || "&", n = n || "="; var o, r, i = ""; for (o in t) if (r = t[o], (Array.isArray || function(t) { return "[object Array]" === Object.prototype.toString.call(t) } )(r)) for (var a in t[o]) i += encodeURIComponent(o) + n + encodeURIComponent(s(a)) + e; else i += encodeURIComponent(o) + n + encodeURIComponent(s(t[o])) + e; return i ? i.substr(0, i.length - e.length) : "" } , d }), define("modules-common-path/action.util", ["modules-common-path/url.util"], function(i) { function o(t, e, n) { if ("undefined" == typeof globalConfig) throw "globalConfig is not defined, please init globalConfig"; if (!globalConfig.dynamicDomain) throw "globalConfig.dynamicDomain is not defined, please init globalConfig.dynamicDomain"; var o = globalConfig.dynamicDomain , o = "/" !== globalConfig.dynamicDomain.charAt(globalConfig.dynamicDomain.length - 1) ? globalConfig.dynamicDomain + "/" : globalConfig.dynamicDomain , r = ""; return n && (r = (r = "object" == typeof n ? i.queryStringify(n) : "" + n) ? "?" + r : ""), o + e + "/" + t + r } return { path: o, redirect: function(t, e, n) { window.location.href = o(t, e, n) } } }), define("modules-services-path/agent.service", ["underscore", "modules-common-path/ajax.util", "modules-common-path/action.util"], function(r, i, a) { var s = "agent"; return { agentLogin: function(t, e, n) { var o = r.extend({ account: "", password: "", code: "" }, t); i.post(a.path("login", s), o, e, n) }, agentLogout: function(t, e) { i.post(a.path("logout", s), {}, t, e) }, applyForPartner: function(t, e, n) { var o = r.extend({ companyName: "", comContactName: "", comContactPhone: "", comEmail: "", partnerProvince: "" }, t); i.post(a.path("applyForPartner", s), o, e, n) }, getVrspLink: function(t, e, n) { var o = r.extend({}, t); i.post(a.path("getVrspLink", s), o, e, n) } } }), define("modules-common-path/check.util", [], function() { return { isNumber: function(t) { return /[0-9]+/.test("" + t) } } }), define("modules-common-path/regexp.util", [], function() { var o = ""; return { phoneRegexp: function(t) { o = !!t.match(/^(0)(([0-9]{10})|([0-9]{11}))$/); var e = !!t.match(/^(1)([0-9]{10})$/); return o = o || e }, phoneRegexpYidong: function(t) { return o = !!t.match(/^(0|86|17951)?(13[456789]|15[012789]|17[28]|18[23478]|14[7])[0-9]{8}$/) }, phoneRegexpUnicom: function(t) { return o = !!t.match(/^(0|86|17951)?(13[012]|15[56]|17[156]|18[56]|14[5])[0-9]{8}$/) }, phoneRegexpTelecom: function(t) { return o = !!t.match(/^(0|86|17951)?(13[3]|15[3]|17[037]|18[019])[0-9]{8}$/) }, weiXinRegexp: function(t) { return o = !!t.match(/^[a-zA-Z\d_]{5,}$/) }, qQRegexp: function(t) { return o = !!t.match(/^\d{5,10}$/) }, emailRegexp: function(t) { return o = !!t.match(/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/) }, encodeCharacters: function(t) { var e = t.toString().toLowerCase(); -1 != e.indexOf("script>") && (t = e.replace("script", "")); var n = encodeURIComponent(t); return o = escape(n) }, guhuaPhoneRegexp: function(t) { return o = !!t.match(/^0[0-9]{3,4}[0-9]{7,8}$/) }, checkAccountName: function(t) { return /^\w+$/.test(t) } } }), define("modules-common-path/modal.util", ["components-path/modal/main"], function(i) { return { showTipModalById: function(t, e, n, o, r) { return r ? i.showModalById(t, e, n, { unblockFn: o }) : i.showModalById(t, e, n, { timeout: 5e3, unblockFn: o }) }, leftWordTip: '<span style="color: #F9F9F9;background-color: #ff8f35;font-weight: bold;padding: 10px 20px;border-radius: 5px;font-size: 16px;float: none;display: inline;height: auto;line-height: normal;">您輸入的字數已超過限制</span>', clipboardTip: '<span style="color: #F9F9F9;background-color: #ff8f35;font-weight: bold;padding: 10px 20px;border-radius: 5px;font-size: 16px;float: none;display: inline;height: auto;line-height: normal;">連結已複製到剪貼簿,您可以貼上進行分享</span>' } }); var CryptoJS = CryptoJS || function(s) { function n() {} var t = {} , e = t.lib = {} , o = e.Base = { extend: function(t) { n.prototype = this; var e = new n; return t && e.mixIn(t), e.hasOwnProperty("init") || (e.init = function() { e.$super.init.apply(this, arguments) } ), (e.init.prototype = e).$super = this, e }, create: function() { var t = this.extend(); return t.init.apply(t, arguments), t }, init: function() {}, mixIn: function(t) { for (var e in t) t.hasOwnProperty(e) && (this[e] = t[e]); t.hasOwnProperty("toString") && (this.toString = t.toString) }, clone: function() { return this.init.prototype.extend(this) } } , c = e.WordArray = o.extend({ init: function(t, e) { t = this.words = t || [], this.sigBytes = null != e ? e : 4 * t.length }, toString: function(t) { return (t || i).stringify(this) }, concat: function(t) { var e = this.words , n = t.words , o = this.sigBytes; if (t = t.sigBytes, this.clamp(), o % 4) for (var r = 0; r < t; r++) e[o + r >>> 2] |= (n[r >>> 2] >>> 24 - r % 4 * 8 & 255) << 24 - (o + r) % 4 * 8; else if (65535 < n.length) for (r = 0; r < t; r += 4) e[o + r >>> 2] = n[r >>> 2]; else e.push.apply(e, n); return this.sigBytes += t, this }, clamp: function() { var t = this.words , e = this.sigBytes; t[e >>> 2] &= 4294967295 << 32 - e % 4 * 8, t.length = s.ceil(e / 4) }, clone: function() { var t = o.clone.call(this); return t.words = this.words.slice(0), t }, random: function(t) { for (var e = [], n = 0; n < t; n += 4) e.push(4294967296 * s.random() | 0); return new c.init(e,t) } }) , r = t.enc = {} , i = r.Hex = { stringify: function(t) { var e = t.words; t = t.sigBytes; for (var n = [], o = 0; o < t; o++) { var r = e[o >>> 2] >>> 24 - o % 4 * 8 & 255; n.push((r >>> 4).toString(16)), n.push((15 & r).toString(16)) } return n.join("") }, parse: function(t) { for (var e = t.length, n = [], o = 0; o < e; o += 2) n[o >>> 3] |= parseInt(t.substr(o, 2), 16) << 24 - o % 8 * 4; return new c.init(n,e / 2) } } , a = r.Latin1 = { stringify: function(t) { var e = t.words; t = t.sigBytes; for (var n = [], o = 0; o < t; o++) n.push(String.fromCharCode(e[o >>> 2] >>> 24 - o % 4 * 8 & 255)); return n.join("") }, parse: function(t) { for (var e = t.length, n = [], o = 0; o < e; o++) n[o >>> 2] |= (255 & t.charCodeAt(o)) << 24 - o % 4 * 8; return new c.init(n,e) } } , l = r.Utf8 = { stringify: function(t) { try { return decodeURIComponent(escape(a.stringify(t))) } catch (t) { throw Error("Malformed UTF-8 data") } }, parse: function(t) { return a.parse(unescape(encodeURIComponent(t))) } } , u = e.BufferedBlockAlgorithm = o.extend({ reset: function() { this._data = new c.init, this._nDataBytes = 0 }, _append: function(t) { "string" == typeof t && (t = l.parse(t)), this._data.concat(t), this._nDataBytes += t.sigBytes }, _process: function(t) { var e = this._data , n = e.words , o = e.sigBytes , r = this.blockSize , i = o / (4 * r); if (t = (i = t ? s.ceil(i) : s.max((0 | i) - this._minBufferSize, 0)) * r, o = s.min(4 * t, o), t) { for (var a = 0; a < t; a += r) this._doProcessBlock(n, a); a = n.splice(0, t), e.sigBytes -= o } return new c.init(a,o) }, clone: function() { var t = o.clone.call(this); return t._data = this._data.clone(), t }, _minBufferSize: 0 }); e.Hasher = u.extend({ cfg: o.extend(), init: function(t) { this.cfg = this.cfg.extend(t), this.reset() }, reset: function() { u.reset.call(this), this._doReset() }, update: function(t) { return this._append(t), this._process(), this }, finalize: function(t) { return t && this._append(t), this._doFinalize() }, blockSize: 16, _createHelper: function(n) { return function(t, e) { return new n.init(e).finalize(t) } }, _createHmacHelper: function(n) { return function(t, e) { return new h.HMAC.init(n,e).finalize(t) } } }); var h = t.algo = {}; return t }(Math); !function() { var c = CryptoJS.lib.WordArray; CryptoJS.enc.Base64 = { stringify: function(t) { var e = t.words , n = t.sigBytes , o = this._map; t.clamp(), t = []; for (var r = 0; r < n; r += 3) for (var i = (e[r >>> 2] >>> 24 - r % 4 * 8 & 255) << 16 | (e[r + 1 >>> 2] >>> 24 - (r + 1) % 4 * 8 & 255) << 8 | e[r + 2 >>> 2] >>> 24 - (r + 2) % 4 * 8 & 255, a = 0; a < 4 && r + .75 * a < n; a++) t.push(o.charAt(i >>> 6 * (3 - a) & 63)); if (e = o.charAt(64)) for (; t.length % 4; ) t.push(e); return t.join("") }, parse: function(t) { var e = t.length , n = this._map; !(i = n.charAt(64)) || -1 != (i = t.indexOf(i)) && (e = i); for (var o, r, i = [], a = 0, s = 0; s < e; s++) { s % 4 && (o = n.indexOf(t.charAt(s - 1)) << s % 4 * 2, r = n.indexOf(t.charAt(s)) >>> 6 - s % 4 * 2, i[a >>> 2] |= (o | r) << 24 - a % 4 * 8, a++) } return c.create(i, a) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } }(), function(i) { function x(t, e, n, o, r, i, a) { return ((t = t + (e & n | ~e & o) + r + a) << i | t >>> 32 - i) + e } function w(t, e, n, o, r, i, a) { return ((t = t + (e & o | n & ~o) + r + a) << i | t >>> 32 - i) + e } function b(t, e, n, o, r, i, a) { return ((t = t + (e ^ n ^ o) + r + a) << i | t >>> 32 - i) + e } function S(t, e, n, o, r, i, a) { return ((t = t + (n ^ (e | ~o)) + r + a) << i | t >>> 32 - i) + e } for (var t = CryptoJS, e = (o = t.lib).WordArray, n = o.Hasher, o = t.algo, M = [], r = 0; r < 64; r++) M[r] = 4294967296 * i.abs(i.sin(r + 1)) | 0; o = o.MD5 = n.extend({ _doReset: function() { this._hash = new e.init([1732584193, 4023233417, 2562383102, 271733878]) }, _doProcessBlock: function(t, e) { for (var n = 0; n < 16; n++) { var o = t[r = e + n]; t[r] = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8) } var n = this._hash.words , r = t[e + 0] , o = t[e + 1] , i = t[e + 2] , a = t[e + 3] , s = t[e + 4] , c = t[e + 5] , l = t[e + 6] , u = t[e + 7] , h = t[e + 8] , d = t[e + 9] , p = t[e + 10] , f = t[e + 11] , m = t[e + 12] , g = t[e + 13] , y = t[e + 14] , v = t[e + 15] , _ = x(_ = n[0], B = n[1], k = n[2], C = n[3], r, 7, M[0]) , C = x(C, _, B, k, o, 12, M[1]) , k = x(k, C, _, B, i, 17, M[2]) , B = x(B, k, C, _, a, 22, M[3]) , _ = x(_, B, k, C, s, 7, M[4]) , C = x(C, _, B, k, c, 12, M[5]) , k = x(k, C, _, B, l, 17, M[6]) , B = x(B, k, C, _, u, 22, M[7]) , _ = x(_, B, k, C, h, 7, M[8]) , C = x(C, _, B, k, d, 12, M[9]) , k = x(k, C, _, B, p, 17, M[10]) , B = x(B, k, C, _, f, 22, M[11]) , _ = x(_, B, k, C, m, 7, M[12]) , C = x(C, _, B, k, g, 12, M[13]) , k = x(k, C, _, B, y, 17, M[14]) , _ = w(_, B = x(B, k, C, _, v, 22, M[15]), k, C, o, 5, M[16]) , C = w(C, _, B, k, l, 9, M[17]) , k = w(k, C, _, B, f, 14, M[18]) , B = w(B, k, C, _, r, 20, M[19]) , _ = w(_, B, k, C, c, 5, M[20]) , C = w(C, _, B, k, p, 9, M[21]) , k = w(k, C, _, B, v, 14, M[22]) , B = w(B, k, C, _, s, 20, M[23]) , _ = w(_, B, k, C, d, 5, M[24]) , C = w(C, _, B, k, y, 9, M[25]) , k = w(k, C, _, B, a, 14, M[26]) , B = w(B, k, C, _, h, 20, M[27]) , _ = w(_, B, k, C, g, 5, M[28]) , C = w(C, _, B, k, i, 9, M[29]) , k = w(k, C, _, B, u, 14, M[30]) , _ = b(_, B = w(B, k, C, _, m, 20, M[31]), k, C, c, 4, M[32]) , C = b(C, _, B, k, h, 11, M[33]) , k = b(k, C, _, B, f, 16, M[34]) , B = b(B, k, C, _, y, 23, M[35]) , _ = b(_, B, k, C, o, 4, M[36]) , C = b(C, _, B, k, s, 11, M[37]) , k = b(k, C, _, B, u, 16, M[38]) , B = b(B, k, C, _, p, 23, M[39]) , _ = b(_, B, k, C, g, 4, M[40]) , C = b(C, _, B, k, r, 11, M[41]) , k = b(k, C, _, B, a, 16, M[42]) , B = b(B, k, C, _, l, 23, M[43]) , _ = b(_, B, k, C, d, 4, M[44]) , C = b(C, _, B, k, m, 11, M[45]) , k = b(k, C, _, B, v, 16, M[46]) , _ = S(_, B = b(B, k, C, _, i, 23, M[47]), k, C, r, 6, M[48]) , C = S(C, _, B, k, u, 10, M[49]) , k = S(k, C, _, B, y, 15, M[50]) , B = S(B, k, C, _, c, 21, M[51]) , _ = S(_, B, k, C, m, 6, M[52]) , C = S(C, _, B, k, a, 10, M[53]) , k = S(k, C, _, B, p, 15, M[54]) , B = S(B, k, C, _, o, 21, M[55]) , _ = S(_, B, k, C, h, 6, M[56]) , C = S(C, _, B, k, v, 10, M[57]) , k = S(k, C, _, B, l, 15, M[58]) , B = S(B, k, C, _, g, 21, M[59]) , _ = S(_, B, k, C, s, 6, M[60]) , C = S(C, _, B, k, f, 10, M[61]) , k = S(k, C, _, B, i, 15, M[62]) , B = S(B, k, C, _, d, 21, M[63]); n[0] = n[0] + _ | 0, n[1] = n[1] + B | 0, n[2] = n[2] + k | 0, n[3] = n[3] + C | 0 }, _doFinalize: function() { var t = this._data , e = t.words , n = 8 * this._nDataBytes , o = 8 * t.sigBytes; e[o >>> 5] |= 128 << 24 - o % 32; var r = i.floor(n / 4294967296); for (e[15 + (64 + o >>> 9 << 4)] = 16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 | r >>> 8), e[14 + (64 + o >>> 9 << 4)] = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n << 24 | n >>> 8), t.sigBytes = 4 * (e.length + 1), this._process(), e = (t = this._hash).words, n = 0; n < 4; n++) o = e[n], e[n] = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8); return t }, clone: function() { var t = n.clone.call(this); return t._hash = this._hash.clone(), t } }), t.MD5 = n._createHelper(o), t.HmacMD5 = n._createHmacHelper(o) }(Math), function() { var t = CryptoJS , e = t.lib , n = e.Base , l = e.WordArray , o = (e = t.algo).EvpKDF = n.extend({ cfg: n.extend({ keySize: 4, hasher: e.MD5, iterations: 1 }), init: function(t) { this.cfg = this.cfg.extend(t) }, compute: function(t, e) { for (var n = (a = this.cfg).hasher.create(), o = l.create(), r = o.words, i = a.keySize, a = a.iterations; r.length < i; ) { s && n.update(s); var s = n.update(t).finalize(e); n.reset(); for (var c = 1; c < a; c++) s = n.finalize(s), n.reset(); o.concat(s) } return o.sigBytes = 4 * i, o } }); t.EvpKDF = function(t, e, n) { return o.create(n).compute(t, e) } }(), CryptoJS.lib.Cipher || function() { var t = (d = CryptoJS).lib , e = t.Base , a = t.WordArray , n = t.BufferedBlockAlgorithm , o = d.enc.Base64 , r = d.algo.EvpKDF , i = t.Cipher = n.extend({ cfg: e.extend(), createEncryptor: function(t, e) { return this.create(this._ENC_XFORM_MODE, t, e) }, createDecryptor: function(t, e) { return this.create(this._DEC_XFORM_MODE, t, e) }, init: function(t, e, n) { this.cfg = this.cfg.extend(n), this._xformMode = t, this._key = e, this.reset() }, reset: function() { n.reset.call(this), this._doReset() }, process: function(t) { return this._append(t), this._process() }, finalize: function(t) { return t && this._append(t), this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function(o) { return { encrypt: function(t, e, n) { return ("string" == typeof e ? p : h).encrypt(o, t, e, n) }, decrypt: function(t, e, n) { return ("string" == typeof e ? p : h).decrypt(o, t, e, n) } } } }); t.StreamCipher = i.extend({ _doFinalize: function() { return this._process(!0) }, blockSize: 1 }); function s(t, e, n) { var o = this._iv; o ? this._iv = void 0 : o = this._prevBlock; for (var r = 0; r < n; r++) t[e + r] ^= o[r] } var c = d.mode = {} , l = (t.BlockCipherMode = e.extend({ createEncryptor: function(t, e) { return this.Encryptor.create(t, e) }, createDecryptor: function(t, e) { return this.Decryptor.create(t, e) }, init: function(t, e) { this._cipher = t, this._iv = e } })).extend(); l.Encryptor = l.extend({ processBlock: function(t, e) { var n = this._cipher , o = n.blockSize; s.call(this, t, e, o), n.encryptBlock(t, e), this._prevBlock = t.slice(e, e + o) } }), l.Decryptor = l.extend({ processBlock: function(t, e) { var n = this._cipher , o = n.blockSize , r = t.slice(e, e + o); n.decryptBlock(t, e), s.call(this, t, e, o), this._prevBlock = r } }), c = c.CBC = l, l = (d.pad = {}).Pkcs7 = { pad: function(t, e) { for (var n = 4 * e, o = (n = n - t.sigBytes % n) << 24 | n << 16 | n << 8 | n, r = [], i = 0; i < n; i += 4) r.push(o); n = a.create(r, n), t.concat(n) }, unpad: function(t) { t.sigBytes -= 255 & t.words[t.sigBytes - 1 >>> 2] } }, t.BlockCipher = i.extend({ cfg: i.cfg.extend({ mode: c, padding: l }), reset: function() { i.reset.call(this); var t, e = (n = this.cfg).iv, n = n.mode; this._xformMode == this._ENC_XFORM_MODE ? t = n.createEncryptor : (t = n.createDecryptor, this._minBufferSize = 1), this._mode = t.call(n, this, e && e.words) }, _doProcessBlock: function(t, e) { this._mode.processBlock(t, e) }, _doFinalize: function() { var t, e = this.cfg.padding; return this._xformMode == this._ENC_XFORM_MODE ? (e.pad(this._data, this.blockSize), t = this._process(!0)) : (t = this._process(!0), e.unpad(t)), t }, blockSize: 4 }); var u = t.CipherParams = e.extend({ init: function(t) { this.mixIn(t) }, toString: function(t) { return (t || this.formatter).stringify(this) } }) , c = (d.format = {}).OpenSSL = { stringify: function(t) { var e = t.ciphertext; return ((t = t.salt) ? a.create([1398893684, 1701076831]).concat(t).concat(e) : e).toString(o) }, parse: function(t) { var e, n = (t = o.parse(t)).words; return 1398893684 == n[0] && 1701076831 == n[1] && (e = a.create(n.slice(2, 4)), n.splice(0, 4), t.sigBytes -= 16), u.create({ ciphertext: t, salt: e }) } } , h = t.SerializableCipher = e.extend({ cfg: e.extend({ format: c }), encrypt: function(t, e, n, o) { o = this.cfg.extend(o); var r = t.createEncryptor(n, o); return e = r.finalize(e), r = r.cfg, u.create({ ciphertext: e, key: n, iv: r.iv, algorithm: t, mode: r.mode, padding: r.padding, blockSize: t.blockSize, formatter: o.format }) }, decrypt: function(t, e, n, o) { return o = this.cfg.extend(o), e = this._parse(e, o.format), t.createDecryptor(n, o).finalize(e.ciphertext) }, _parse: function(t, e) { return "string" == typeof t ? e.parse(t, this) : t } }) , d = (d.kdf = {}).OpenSSL = { execute: function(t, e, n, o) { return o = o || a.random(8), t = r.create({ keySize: e + n }).compute(t, o), n = a.create(t.words.slice(e), 4 * n), t.sigBytes = 4 * e, u.create({ key: t, iv: n, salt: o }) } } , p = t.PasswordBasedCipher = h.extend({ cfg: h.cfg.extend({ kdf: d }), encrypt: function(t, e, n, o) { return n = (o = this.cfg.extend(o)).kdf.execute(n, t.keySize, t.ivSize), o.iv = n.iv, (t = h.encrypt.call(this, t, e, n.key, o)).mixIn(n), t }, decrypt: function(t, e, n, o) { return o = this.cfg.extend(o), e = this._parse(e, o.format), n = o.kdf.execute(n, t.keySize, t.ivSize, e.salt), o.iv = n.iv, h.decrypt.call(this, t, e, n.key, o) } }) }(), function() { function l(t, e) { var n = (this._lBlock >>> t ^ this._rBlock) & e; this._rBlock ^= n, this._lBlock ^= n << t } function u(t, e) { var n = (this._rBlock >>> t ^ this._lBlock) & e; this._lBlock ^= n, this._rBlock ^= n << t } var t = CryptoJS , e = (n = t.lib).WordArray , n = n.BlockCipher , o = t.algo , a = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4] , s = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32] , c = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28] , h = [{ 0: 8421888, 268435456: 32768, 536870912: 8421378, 805306368: 2, 1073741824: 512, 1342177280: 8421890, 1610612736: 8389122, 1879048192: 8388608, 2147483648: 514, 2415919104: 8389120, 2684354560: 33280, 2952790016: 8421376, 3221225472: 32770, 3489660928: 8388610, 3758096384: 0, 4026531840: 33282, 134217728: 0, 402653184: 8421890, 671088640: 33282, 939524096: 32768, 1207959552: 8421888, 1476395008: 512, 1744830464: 8421378, 2013265920: 2, 2281701376: 8389120, 2550136832: 33280, 2818572288: 8421376, 3087007744: 8389122, 3355443200: 8388610, 3623878656: 32770, 3892314112: 514, 4160749568: 8388608, 1: 32768, 268435457: 2, 536870913: 8421888, 805306369: 8388608, 1073741825: 8421378, 1342177281: 33280, 1610612737: 512, 1879048193: 8389122, 2147483649: 8421890, 2415919105: 8421376, 2684354561: 8388610, 2952790017: 33282, 3221225473: 514, 3489660929: 8389120, 3758096385: 32770, 4026531841: 0, 134217729: 8421890, 402653185: 8421376, 671088641: 8388608, 939524097: 512, 1207959553: 32768, 1476395009: 8388610, 1744830465: 2, 2013265921: 33282, 2281701377: 32770, 2550136833: 8389122, 2818572289: 514, 3087007745: 8421888, 3355443201: 8389120, 3623878657: 0, 3892314113: 33280, 4160749569: 8421378 }, { 0: 1074282512, 16777216: 16384, 33554432: 524288, 50331648: 1074266128, 67108864: 1073741840, 83886080: 1074282496, 100663296: 1073758208, 117440512: 16, 134217728: 540672, 150994944: 1073758224, 167772160: 1073741824, 184549376: 540688, 201326592: 524304, 218103808: 0, 234881024: 16400, 251658240: 1074266112, 8388608: 1073758208, 25165824: 540688, 41943040: 16, 58720256: 1073758224, 75497472: 1074282512, 92274688: 1073741824, 109051904: 524288, 125829120: 1074266128, 142606336: 524304, 159383552: 0, 176160768: 16384, 192937984: 1074266112, 209715200: 1073741840, 226492416: 540672, 243269632: 1074282496, 260046848: 16400, 268435456: 0, 285212672: 1074266128, 301989888: 1073758224, 318767104: 1074282496, 335544320: 1074266112, 352321536: 16, 369098752: 540688, 385875968: 16384, 402653184: 16400, 419430400: 524288, 436207616: 524304, 452984832: 1073741840, 469762048: 540672, 486539264: 1073758208, 503316480: 1073741824, 520093696: 1074282512, 276824064: 540688, 293601280: 524288, 310378496: 1074266112, 327155712: 16384, 343932928: 1073758208, 360710144: 1074282512, 377487360: 16, 394264576: 1073741824, 411041792: 1074282496, 427819008: 1073741840, 444596224: 1073758224, 461373440: 524304, 478150656: 0, 494927872: 16400, 511705088: 1074266128, 528482304: 540672 }, { 0: 260, 1048576: 0, 2097152: 67109120, 3145728: 65796, 4194304: 65540, 5242880: 67108868, 6291456: 67174660, 7340032: 67174400, 8388608: 67108864, 9437184: 67174656, 10485760: 65792, 11534336: 67174404, 12582912: 67109124, 13631488: 65536, 14680064: 4, 15728640: 256, 524288: 67174656, 1572864: 67174404, 2621440: 0, 3670016: 67109120, 4718592: 67108868, 5767168: 65536, 6815744: 65540, 7864320: 260, 8912896: 4, 9961472: 256, 11010048: 67174400, 12058624: 65796, 13107200: 65792, 14155776: 67109124, 15204352: 67174660, 16252928: 67108864, 16777216: 67174656, 17825792: 65540, 18874368: 65536, 19922944: 67109120, 20971520: 256, 22020096: 67174660, 23068672: 67108868, 24117248: 0, 25165824: 67109124, 26214400: 67108864, 27262976: 4, 28311552: 65792, 29360128: 67174400, 30408704: 260, 31457280: 65796, 32505856: 67174404, 17301504: 67108864, 18350080: 260, 19398656: 67174656, 20447232: 0, 21495808: 65540, 22544384: 67109120, 23592960: 256, 24641536: 67174404, 25690112: 65536, 26738688: 67174660, 27787264: 65796, 28835840: 67108868, 29884416: 67109124, 30932992: 67174400, 31981568: 4, 33030144: 65792 }, { 0: 2151682048, 65536: 2147487808, 131072: 4198464, 196608: 2151677952, 262144: 0, 327680: 4198400, 393216: 2147483712, 458752: 4194368, 524288: 2147483648, 589824: 4194304, 655360: 64, 720896: 2147487744, 786432: 2151678016, 851968: 4160, 917504: 4096, 983040: 2151682112, 32768: 2147487808, 98304: 64, 163840: 2151678016, 229376: 2147487744, 294912: 4198400, 360448: 2151682112, 425984: 0, 491520: 2151677952, 557056: 4096, 622592: 2151682048, 688128: 4194304, 753664: 4160, 819200: 2147483648, 884736: 4194368, 950272: 4198464, 1015808: 2147483712, 1048576: 4194368, 1114112: 4198400, 1179648: 2147483712, 1245184: 0, 1310720: 4160, 1376256: 2151678016, 1441792: 2151682048, 1507328: 2147487808, 1572864: 2151682112, 1638400: 2147483648, 1703936: 2151677952, 1769472: 4198464, 1835008: 2147487744, 1900544: 4194304, 1966080: 64, 2031616: 4096, 1081344: 2151677952, 1146880: 2151682112, 1212416: 0, 1277952: 4198400, 1343488: 4194368, 1409024: 2147483648, 1474560: 2147487808, 1540096: 64, 1605632: 2147483712, 1671168: 4096, 1736704: 2147487744, 1802240: 2151678016, 1867776: 4160, 1933312: 2151682048, 1998848: 4194304, 2064384: 4198464 }, { 0: 128, 4096: 17039360, 8192: 262144, 12288: 536870912, 16384: 537133184, 20480: 16777344, 24576: 553648256, 28672: 262272, 32768: 16777216, 36864: 537133056, 40960: 536871040, 45056: 553910400, 49152: 553910272, 53248: 0, 57344: 17039488, 61440: 553648128, 2048: 17039488, 6144: 553648256, 10240: 128, 14336: 17039360, 18432: 262144, 22528: 537133184, 26624: 553910272, 30720: 536870912, 34816: 537133056, 38912: 0, 43008: 553910400, 47104: 16777344, 51200: 536871040, 55296: 553648128, 59392: 16777216, 63488: 262272, 65536: 262144, 69632: 128, 73728: 536870912, 77824: 553648256, 81920: 16777344, 86016: 553910272, 90112: 537133184, 94208: 16777216, 98304: 553910400, 102400: 553648128, 106496: 17039360, 110592: 537133056, 114688: 262272, 118784: 536871040, 122880: 0, 126976: 17039488, 67584: 553648256, 71680: 16777216, 75776: 17039360, 79872: 537133184, 83968: 536870912, 88064: 17039488, 92160: 128, 96256: 553910272, 100352: 262272, 104448: 553910400, 108544: 0, 112640: 553648128, 116736: 16777344, 120832: 262144, 124928: 537133056, 129024: 536871040 }, { 0: 268435464, 256: 8192, 512: 270532608, 768: 270540808, 1024: 268443648, 1280: 2097152, 1536: 2097160, 1792: 268435456, 2048: 0, 2304: 268443656, 2560: 2105344, 2816: 8, 3072: 270532616, 3328: 2105352, 3584: 8200, 3840: 270540800, 128: 270532608, 384: 270540808, 640: 8, 896: 2097152, 1152: 2105352, 1408: 268435464, 1664: 268443648, 1920: 8200, 2176: 2097160, 2432: 8192, 2688: 268443656, 2944: 270532616, 3200: 0, 3456: 270540800, 3712: 2105344, 3968: 268435456, 4096: 268443648, 4352: 270532616, 4608: 270540808, 4864: 8200, 5120: 2097152, 5376: 268435456, 5632: 268435464, 5888: 2105344, 6144: 2105352, 6400: 0, 6656: 8, 6912: 270532608, 7168: 8192, 7424: 268443656, 7680: 270540800, 7936: 2097160, 4224: 8, 4480: 2105344, 4736: 2097152, 4992: 268435464, 5248: 268443648, 5504: 8200, 5760: 270540808, 6016: 270532608, 6272: 270540800, 6528: 270532616, 6784: 8192, 7040: 2105352, 7296: 2097160, 7552: 0, 7808: 268435456, 8064: 268443656 }, { 0: 1048576, 16: 33555457, 32: 1024, 48: 1049601, 64: 34604033, 80: 0, 96: 1, 112: 34603009, 128: 33555456, 144: 1048577, 160: 33554433, 176: 34604032, 192: 34603008, 208: 1025, 224: 1049600, 240: 33554432, 8: 34603009, 24: 0, 40: 33555457, 56: 34604032, 72: 1048576, 88: 33554433, 104: 33554432, 120: 1025, 136: 1049601, 152: 33555456, 168: 34603008, 184: 1048577, 200: 1024, 216: 34604033, 232: 1, 248: 1049600, 256: 33554432, 272: 1048576, 288: 33555457, 304: 34603009, 320: 1048577, 336: 33555456, 352: 34604032, 368: 1049601, 384: 1025, 400: 34604033, 416: 1049600, 432: 1, 448: 0, 464: 34603008, 480: 33554433, 496: 1024, 264: 1049600, 280: 33555457, 296: 34603009, 312: 1, 328: 33554432, 344: 1048576, 360: 1025, 376: 34604032, 392: 33554433, 408: 34603008, 424: 0, 440: 34604033, 456: 1049601, 472: 1024, 488: 33555456, 504: 1048577 }, { 0: 134219808, 1: 131072, 2: 134217728, 3: 32, 4: 131104, 5: 134350880, 6: 134350848, 7: 2048, 8: 134348800, 9: 134219776, 10: 133120, 11: 134348832, 12: 2080, 13: 0, 14: 134217760, 15: 133152, 2147483648: 2048, 2147483649: 134350880, 2147483650: 134219808, 2147483651: 134217728, 2147483652: 134348800, 2147483653: 133120, 2147483654: 133152, 2147483655: 32, 2147483656: 134217760, 2147483657: 2080, 2147483658: 131104, 2147483659: 134350848, 2147483660: 0, 2147483661: 134348832, 2147483662: 134219776, 2147483663: 131072, 16: 133152, 17: 134350848, 18: 32, 19: 2048, 20: 134219776, 21: 134217760, 22: 134348832, 23: 131072, 24: 0, 25: 131104, 26: 134348800, 27: 134219808, 28: 134350880, 29: 133120, 30: 2080, 31: 134217728, 2147483664: 131072, 2147483665: 2048, 2147483666: 134348832, 2147483667: 133152, 2147483668: 32, 2147483669: 134348800, 2147483670: 134217728, 2147483671: 134219808, 2147483672: 134350880, 2147483673: 134217760, 2147483674: 134219776, 2147483675: 0, 2147483676: 133120, 2147483677: 2080, 2147483678: 131104, 2147483679: 134350848 }] , d = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679] , r = o.DES = n.extend({ _doReset: function() { for (var t = this._key.words, e = [], n = 0; n < 56; n++) { var o = a[n] - 1; e[n] = t[o >>> 5] >>> 31 - o % 32 & 1 } for (t = this._subKeys = [], o = 0; o < 16; o++) { for (var r = t[o] = [], i = c[o], n = 0; n < 24; n++) r[n / 6 | 0] |= e[(s[n] - 1 + i) % 28] << 31 - n % 6, r[4 + (n / 6 | 0)] |= e[28 + (s[n + 24] - 1 + i) % 28] << 31 - n % 6; for (r[0] = r[0] << 1 | r[0] >>> 31, n = 1; n < 7; n++) r[n] >>>= 4 * (n - 1) + 3; r[7] = r[7] << 5 | r[7] >>> 27 } for (e = this._invSubKeys = [], n = 0; n < 16; n++) e[n] = t[15 - n] }, encryptBlock: function(t, e) { this._doCryptBlock(t, e, this._subKeys) }, decryptBlock: function(t, e) { this._doCryptBlock(t, e, this._invSubKeys) }, _doCryptBlock: function(t, e, n) { this._lBlock = t[e], this._rBlock = t[e + 1], l.call(this, 4, 252645135), l.call(this, 16, 65535), u.call(this, 2, 858993459), u.call(this, 8, 16711935), l.call(this, 1, 1431655765); for (var o = 0; o < 16; o++) { for (var r = n[o], i = this._lBlock, a = this._rBlock, s = 0, c = 0; c < 8; c++) s |= h[c][((a ^ r[c]) & d[c]) >>> 0]; this._lBlock = a, this._rBlock = i ^ s } n = this._lBlock, this._lBlock = this._rBlock, this._rBlock = n, l.call(this, 1, 1431655765), u.call(this, 8, 16711935), u.call(this, 2, 858993459), l.call(this, 16, 65535), l.call(this, 4, 252645135), t[e] = this._lBlock, t[e + 1] = this._rBlock }, keySize: 2, ivSize: 2, blockSize: 2 }); t.DES = n._createHelper(r), o = o.TripleDES = n.extend({ _doReset: function() { var t = this._key.words; this._des1 = r.createEncryptor(e.create(t.slice(0, 2))), this._des2 = r.createEncryptor(e.create(t.slice(2, 4))), this._des3 = r.createEncryptor(e.create(t.slice(4, 6))) }, encryptBlock: function(t, e) { this._des1.encryptBlock(t, e), this._des2.decryptBlock(t, e), this._des3.encryptBlock(t, e) }, decryptBlock: function(t, e) { this._des3.decryptBlock(t, e), this._des2.encryptBlock(t, e), this._des1.decryptBlock(t, e) }, keySize: 6, ivSize: 2, blockSize: 2 }), t.TripleDES = n._createHelper(o) }(), define("CryptoJS/tripledes", function() {}), CryptoJS.mode.ECB = function() { var t = CryptoJS.lib.BlockCipherMode.extend(); return t.Encryptor = t.extend({ processBlock: function(t, e) { this._cipher.encryptBlock(t, e) } }), t.Decryptor = t.extend({ processBlock: function(t, e) { this._cipher.decryptBlock(t, e) } }), t }(), define("CryptoJS/mode-ecb", ["CryptoJS/tripledes"], function() {}), define("DES", [], function() { return { desEncrypt: function(t) { var e = CryptoJS.enc.Base64.parse("fHSBuVaBsIJ0") , n = CryptoJS.DES.encrypt(t, e, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return n.toString() } } }), define("modules-platform-path/login/login.viewmodel", ["ko", "underscore.string", "components-path/loading/main", "components-path/modal/main", "modules-services-path/agent.service", "modules-common-path/action.util", "modules-common-path/check.util", "modules-common-path/regexp.util", "modules-common-path/modal.util", "md5", "CryptoJS/mode-ecb", "CryptoJS/tripledes", "DES"], function(e, c, l, a, u, h, d, p, f, t, n, o, m) { return function() { var s = this; s.accountInitText = "", s.passwordInitText = "", s.codeInitText = "", s.account = e.observable(s.accountInitText), s.password = e.observable(s.passwordInitText), s.code = e.observable(s.codeInitText), s.typepassword = e.observable(!1), s.validateCodeUrl = e.observable(h.path("validateCode", "agent", { _r: Math.random() })), s.errorMsg = e.observable(""), s.oemConfig = globalConfig.oemConfig && JSON.parse(globalConfig.oemConfig) || {}, s.changeValidateCode = function() { s.validateCodeUrl(h.path("validateCode", "agent", { _r: Math.random() })) } , s.passwordForgot = function() { a.showModalById(null, "login-modal-password_forgot") } , s.closeModal = function() { a.hideModal(null) } , s.closePasswordForgotModal = function() { s.closeModal() } , s.vcodeKeyDownDeal = function(t) { 13 === t.keyCode && s.login() } , s.login = function() { var t, e, n, o, r, i, a = $("#account").val(), a = c.trim(a); s.errorMsg(""), c.isBlank(a) || a == s.accountInitText ? s.errorMsg("賬號不能為空") : (i = $("#password").val(), i = c.trim(i), c.isBlank(i) || i == s.passwordInitText ? s.errorMsg("密碼不能為空") : (t = hex_md5(i), e = m.desEncrypt(a), n = m.desEncrypt(t + a), o = c.trim(s.code()), c.isBlank(o) || o == s.codeInitText ? s.errorMsg("驗證碼不能為空") : 4 < o.length || !d.isNumber(o) ? s.errorMsg("驗證碼格式不正確") : (r = l.showLoading("login-wrap-from"), u.agentLogin({ account: e, password: n, code: o }, function(t) { l.hideLoading(r, function() { return t && "000000" == t.retCode ? void h.redirect("index", "group") : (s.code(""), s.validateCodeUrl(h.path("validateCode", "agent", { _r: Math.random() })), t ? "110000" == t.retCode ? (s.errorMsg("您輸入的賬號不存在,請核實後再登入"), void console.log("您輸入的賬號不存在,請核實後再登入")) : "900001" == t.retCode ? void s.errorMsg("驗證碼驗證失敗") : "900002" == t.retCode ? void s.errorMsg("賬號或密碼錯誤") : "910003" == t.retCode ? void s.errorMsg("當前賬戶無登入許可權") : void s.errorMsg("登入失敗,請稍候重試") : void s.errorMsg("登入失敗,請稍候重試")) }) }, function() { l.hideLoading(r, function() { s.code(""), s.validateCodeUrl(h.path("validateCode", "agent", { _r: Math.random() })), s.errorMsg("登入失敗,請稍候重試") }) })))) } , s.joinUs = function() {} , s.companyName = e.observable(""), s.comContactName = e.observable(""), s.comContactPhone = e.observable(""), s.comEmail = e.observable(""), s.addPartnerErrorMsg = e.observable(""); var t = { ALL: { state: "0", stateDesc: "所有" }, BEIJING: { state: "1", stateDesc: "北京市" }, SHANGHAI: { state: "2", stateDesc: "上海市" }, ANHUI: { state: "3", stateDesc: "安徽省" }, ZHEJIANG: { state: "4", stateDesc: "浙江省" } }; s.provincesList = e.observableArray([t.ALL, t.BEIJING, t.SHANGHAI, t.ANHUI, t.ZHEJIANG]), s.currentProvince = e.observable(s.provincesList()[0].state), s.showPartnerModal = function() { s.companyName(""), s.comContactName(""), s.comContactPhone(""), s.comEmail(""), s.currentProvince(s.provincesList()[0].state), s.addPartnerErrorMsg(""), a.showModalById(null, "home-tip-partner") } , s.toApplyForPartner = function() { var t = s.companyName() , n = s.comContactName() , o = s.comContactPhone() , r = s.comEmail() , i = s.currentProvince(); c.isBlank(t) ? s.addPartnerErrorMsg("公司名稱不能為空") : c.isBlank(n) ? s.addPartnerErrorMsg("公司聯絡人名稱不能為空") : c.isBlank(o) ? s.addPartnerErrorMsg("聯絡電話不能為空") : p.phoneRegexp(o) ? (s.addPartnerErrorMsg(""), a.hideModal(null, function() { var e = l.showLoading(null); u.applyForPartner({ companyName: t, comContactName: n, comContactPhone: o, comEmail: r, partnerProvince: i }, function(t) { l.hideLoading(e, function() { t && "000000" == t.retCode ? f.showTipModalById(null, "apply-partner-tip-success") : f.showTipModalById(null, "cm-tip-fail") }) }, function() { f.showTipModalById(null, "cm-tip-fail") }) })) : s.addPartnerErrorMsg("手機電話格式不正確") } , s.showHelp = function() { return h.path("faq", "home") } , s.defer = function() { $.get("../homehelp/defer", function(t) { console.log(t), s.defer() }) } } }), define("modules-platform-path/caiyin_customer.viewmodel", ["ko", "jquery", "underscore.string", "components-path/loading/main", "components-path/modal/main", "modules-common-path/action.util"], function(n, t, e, o, r, i) { return function() { var t, e = this; e.oemConfig = globalConfig.oemConfig && JSON.parse(globalConfig.oemConfig) || {}, e.gotoCaiyinContact = function() { i.redirect("contact", "home") } , e.gotoCaiyinFaq = function() { i.redirect("faq", "home") } , e.gotoCaiyinMsg = function() { i.redirect("msg", "home") } , e.gotoCaiyinAdvice = function() { i.redirect("advice", "home") } , e.curCustomerMenuType = n.observable(""), e.iscurCustomerMenuSelected = function(t) { return e.curCustomerMenuType() === t } , e.getCustomerMenuUrl = function(t) { switch (t) { case "1": return i.path("msg", "home"); case "2": return i.path("advice", "home"); case "3": return i.path("contact", "home"); case "4": return i.path("faq", "home") } } , e.gotoCaiyinCustomer = function(t) { e.curCustomerMenuType(t), function(t) { switch (t) { case "1": e.gotoCaiyinMsg(); break; case "2": e.gotoCaiyinAdvice(); break; case "3": e.gotoCaiyinContact(); break; case "4": e.gotoCaiyinFaq() } }(t) } , window.customer_menu && (t = window.customer_menu.menuType, e.curCustomerMenuType(t)) } }), require(["ko", "jquery", "underscore", "modules-platform-path/login/login.viewmodel", "modules-platform-path/caiyin_customer.viewmodel"], function(t, e, n, o, r) { t.applyBindings(new o, document.getElementById("login-wrap-root")), t.applyBindings(new r, document.getElementById("customer-service-wrap-root")) }), define("modules/platform/login/login.main", function() {});
最後模擬其加密方式,便可進行登入
結尾
今天搞了一波js逆向,發現並不是很難,當然這個加密方式也比較簡單,輕輕鬆鬆就可以搞到,最後還是給自己慶祝一下,js 逆向圓滿成功,哈哈哈哈