前言

现在一些网站对 JavaScript 代码采取了一定的保护措施,比如变量名混淆、执行逻辑混淆、反调试、核心逻辑加密等,有的还对数据接口进行了加密,本次的案例为 RSA 加密。

RSA 是非对称加密,区分公钥和私钥,RSA 算法是目前理论和实际应用中最为成熟的和完善的公钥密码体制,其用来解决对称密码的密钥分发问题,还可以用来进行数字签名来保证信息的否定与抵赖,利用数字签名较容易发现攻击者对信息的非法篡改以保证信息的完整性。

声明

        本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!

Webpack

webpack 是 JavaScript 应用程序的模块打包器,可以把开发中的所有资源(图片、js文件、css文件等)都看成模块,通过 loader(加载器)和 plugins(插件)对资源进行处理,打包成符合生产环境部署的前端资源,所有的资源都是通过 JavaScript 渲染出来的,目前 Vue,React 等前端项目,基本上都是基于 webpack 进行工程化开发的。

一般通过 webpack 打包的 JavaScript 文件都为一整个自执行函数,以下为一类自执行函数,函数前面加上一元操作符,后面加上括号,一般自执行函数最后都是括号:

!function () {console.log("Yy_Rose")
}();

webpack 类型的基本结构

第一种类型:

// 模块为 Object 形式, 元素为函数对象
!function('参数'){'加载器'}({'模块'});

本文案例即为此种类型,function e( ) 函数体即为加载器,并包含 call( ) 方法:

!function(t) {// 加载器function e(s) {if (i[s])return i[s].exports;var n = i[s] = {exports: {},id: s,loaded: !1};return t[s].call(n.exports, n, n.exports, e),n.loaded = !0,n.exports}......
}({// 模块0: function(){},1: function(){},2: function(){},......56: function(){},
});

第二种类型:

// 模块以数组形式存储, 数组中的每个元素都是函数
!function('参数'){'加载器'}(['模块']);

将上述代码样例进行改写,即为第二种类型:

!function(t) {// 加载器function e(s) {......}......
}([// 模块function(){console.log('Yy_Rose')},......function(){console.log('Yy_Rose')},
]);

案例目标

网址:

aHR0cHM6Ly93d3cuZ205OS5jb20v

登录接口:

aHR0cHM6Ly9wYXNzcG9ydC5nbTk5LmNvbS9sb2dpbi9sb2dpbjM=

以上均做了脱敏处理,Base64 编码及解码方式:

import base64
# 编码
# result = base64.b64encode('待编码字符串'.encode('utf-8'))
# 解码
result = base64.b64decode('待解码字符串'.encode('utf-8'))
print(result)

常规 JavaScript 逆向思路

一般情况下,JavaScript 逆向分为三步:

  1. 寻找入口:逆向在大部分情况下就是找一些加密参数到底是怎么来的,关键逻辑可能写在某个关键的方法或者隐藏在某个关键的变量里,一个网站可能加载了很多 JavaScript 文件,如何从这么多的 JavaScript 文件的代码行中找到关键的位置,很重要;
  2. 调试分析:找到入口后,我们定位到某个参数可能是在某个方法中执行的了,那么里面的逻辑是怎么样的,调用了多少加密算法,经过了多少赋值变换,需要把整体思路整理清楚,以便于断点或反混淆工具等进行调试分析;
  3. 模拟执行:经过调试分析后,差不多弄清了逻辑,就需要对加密过程进行逻辑复现,以拿到最后我们想要的数据

接下来开始正式进行案例分析:

寻找入口

打开开发者人员工具进行抓包,随便输入一串账户名和密码,输入验证码后点击登录,会有如图所示的报错弹窗,在抓包到的 login3 链接的响应预览中能看到一样的报错信息,此处即为登录接口位置:

观察其请求头中的数据信息,为 GET 请求,在 Query String Parameters 中返回了一些 JSON 格式的响应数据,通过对比分析可知各关键参数的含义:

  • uname:明文用户名

  • password:加密密码

  • ckcode:明文验证码

  • _:当前时间戳

调试分析

寻找加密位置

根据上文所述,密码 password 经过加密,现对其逆向分析,这里直接全局搜索 password 关键字,可以看到有如下几个结果:

通过分析可知加密位置在 home.min.js 文件中,点击进入该 JS 文件,会发现被压缩了,为了便于查看点击左下角的 { } 进行格式化操作,接着 CTRL + F 局部搜索 password,会发现有 83 个结果,这么多不便于查找分析,由于 password 是 JSON 格式的数据,所以可以直接搜索 password: ,搜索结果减少到了 14 个,大大降低了查找的工作量:

打断点调试分析,password 加密后的值在该文件的第 178 行生成,该值由参数 o 传递:

进一步跟进参数 o 定义的位置,发现其在第 168 行定义:

var o = a.encode(t.password, s)

可以在第 168 行打下断点进行调试,也可以直接在控制台打印出各部分含义,如下图可知:

  • a.encode(t.password, s):输入的密码加密后的结果
  • t.password:输入的明文密码
  • s:当前时间戳

所以参数 o 即为明文密码加当前时间戳后加密的结果,接下来进一步跟进到其 encode 加密位置,鼠标整体选中 a.encode,跟进到 home.min.js?v=IKPeng:formatted:592 中,即该文件的第 592 行:

以下即为关键的加密位置:

关键加密代码分析

如上图所示,第 588、589 行能看到两个明显的加密特征:

  • JSEncrypt:JavaScript 中加密模块之一,为 RSA 加密算法提供支持
  • setPublicKey:设置公钥

所以可以推断,返回的响应参数中 password 的值经过了 RSA 加密,以下进一步加密部分进行分析:

n.prototype.encode = function(t, e) {var i = e ? e + "|" + t : t;return encodeURIComponent(this.jsencrypt.encrypt(i))}
  • t:输入的明文密码
  • e:当前的时间戳
  • i:将 e 和 t 通过 | 拼接后的结果
  • this.jsencrypt.encrypt(i):将 i 进行 RSA 加密
  • encodeURIComponent( ):对 URL 中的某个参数进行编码

模拟执行

这里通过两种方式,对加密位置模拟执行以的到加密后的 password 参数的值:

1. Node.js 引入 JSEncrypt 加密模块进行加密

// 通过 require 引入 jsencrypt 加密模块
var JSEncrypt = require('jsencrypt')function getPassword(t, e) {var jsEncrypt = new JSEncrypt();// 设置公钥jsEncrypt.setPublicKey('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDq04c6My441Gj0UFKgrqUhAUg+kQZeUeWSPlAU9fr4HBPDldAeqzx1UR92KJHuQh/zs1HOamE2dgX9z/2oXcJaqoRIA/FXysx+z2YlJkSk8XQLcQ8EBOkp//MZrixam7lCYpNOjadQBb2Ot0U/Ky+jF2p+Ie8gSZ7/u+Wnr5grywIDAQAB');var i = e ? e + "|" + t : t;return encodeURIComponent(jsEncrypt.encrypt(i));
}// 明文密码
var password = "123456";
// 当前时间戳
var timestamp = (new Date).getTime();
console.log(getPassword(password, timestamp));

2. 改写 webpack,导出方法调用

本文一开始讲述了 webpack 模块化方法的基本样式,该 JS 文件的开头能找到加载器位置:

上文中我们找到了 password 参数的加密位置,如下图所示,该加密位置在第 3 个模块中,同时从第 591 行我们可以看到,变量 r 引用了第 4 个模块中的内容:

这里直接将模块 3 和模块 4 的内容整体扣出,再将加载器 e 作为全局变量导出调用即可:

var window = global;
var navigator = {};
!function(t) {function e(s) {if (i[s])return i[s].exports;var n = i[s] = {exports: {},id: s,loaded: !1};return t[s].call(n.exports, n, n.exports, e),n.loaded = !0,n.exports}var i = {};// 导出加载器window.code = e;
}({3: function(t, e, i) {var s;s = function(t, e, s) {function n() {"undefined" != typeof r && (this.jsencrypt = new r.JSEncrypt,this.jsencrypt.setPublicKey("-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDq04c6My441Gj0UFKgrqUhAUg+kQZeUeWSPlAU9fr4HBPDldAeqzx1UR92KJHuQh/zs1HOamE2dgX9z/2oXcJaqoRIA/FXysx+z2YlJkSk8XQLcQ8EBOkp//MZrixam7lCYpNOjadQBb2Ot0U/Ky+jF2p+Ie8gSZ7/u+Wnr5grywIDAQAB-----END PUBLIC KEY-----"))}var r = i(4);n.prototype.encode = function(t, e) {var i = e ? e + "|" + t : t;return encodeURIComponent(this.jsencrypt.encrypt(i))},s.exports = n}.call(e, i, e, t),!(void 0 !== s && (t.exports = s))},4: function(t, e, i) {var s, n, r, s;s = function(t, e, i) {/*! JSEncrypt v2.3.1 | //npmcdn.com/jsencrypt@2.3.1/LICENSE.txt */!function(t, o) {r = [e],n = o,s = "function" == typeof n ? n.apply(e, r) : n,!(void 0 !== s && (i.exports = s))}(this, function(t) {function e(t, e, i) {null != t && ("number" == typeof t ? this.fromNumber(t, e, i) : null == e && "string" != typeof t ? this.fromString(t, 256) : this.fromString(t, e))}function i() {return new e(null)}function s(t, e, i, s, n, r) {for (; --r >= 0; ) {var o = e * this[t++] + i[s] + n;n = Math.floor(o / 67108864),i[s++] = 67108863 & o}return n}function n(t, e, i, s, n, r) {for (var o = 32767 & e, a = e >> 15; --r >= 0; ) {var c = 32767 & this[t], l = this[t++] >> 15, u = a * c + l * o;c = o * c + ((32767 & u) << 15) + i[s] + (1073741823 & n),n = (c >>> 30) + (u >>> 15) + a * l + (n >>> 30),i[s++] = 1073741823 & c}return n}function r(t, e, i, s, n, r) {for (var o = 16383 & e, a = e >> 14; --r >= 0; ) {var c = 16383 & this[t], l = this[t++] >> 14, u = a * c + l * o;c = o * c + ((16383 & u) << 14) + i[s] + n,n = (c >> 28) + (u >> 14) + a * l,i[s++] = 268435455 & c}return n}function o(t) {return Te.charAt(t)}function a(t, e) {var i = Ie[t.charCodeAt(e)];return null == i ? -1 : i}function c(t) {for (var e = this.t - 1; e >= 0; --e)t[e] = this[e];t.t = this.t,t.s = this.s}function l(t) {this.t = 1,this.s = 0 > t ? -1 : 0,t > 0 ? this[0] = t : -1 > t ? this[0] = t + this.DV : this.t = 0}function u(t) {var e = i();return e.fromInt(t),e}function p(t, i) {var s;if (16 == i)s = 4;else if (8 == i)s = 3;else if (256 == i)s = 8;else if (2 == i)s = 1;else if (32 == i)s = 5;else {if (4 != i)return void this.fromRadix(t, i);s = 2}this.t = 0,this.s = 0;for (var n = t.length, r = !1, o = 0; --n >= 0; ) {var c = 8 == s ? 255 & t[n] : a(t, n);0 > c ? "-" == t.charAt(n) && (r = !0) : (r = !1,0 == o ? this[this.t++] = c : o + s > this.DB ? (this[this.t - 1] |= (c & (1 << this.DB - o) - 1) << o,this[this.t++] = c >> this.DB - o) : this[this.t - 1] |= c << o,o += s,o >= this.DB && (o -= this.DB))}8 == s && 0 != (128 & t[0]) && (this.s = -1,o > 0 && (this[this.t - 1] |= (1 << this.DB - o) - 1 << o)),this.clamp(),r && e.ZERO.subTo(this, this)}function d() {for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t; )--this.t}function h(t) {if (this.s < 0)return "-" + this.negate().toString(t);var e;if (16 == t)e = 4;else if (8 == t)e = 3;else if (2 == t)e = 1;else if (32 == t)e = 5;else {if (4 != t)return this.toRadix(t);e = 2}var i, s = (1 << e) - 1, n = !1, r = "", a = this.t, c = this.DB - a * this.DB % e;if (a-- > 0)for (c < this.DB && (i = this[a] >> c) > 0 && (n = !0,r = o(i)); a >= 0; )e > c ? (i = (this[a] & (1 << c) - 1) << e - c,i |= this[--a] >> (c += this.DB - e)) : (i = this[a] >> (c -= e) & s,0 >= c && (c += this.DB,--a)),i > 0 && (n = !0),n && (r += o(i));return n ? r : "0"}function f() {var t = i();return e.ZERO.subTo(this, t),t}function g() {return this.s < 0 ? this.negate() : this}function m(t) {var e = this.s - t.s;if (0 != e)return e;var i = this.t;if (e = i - t.t,0 != e)return this.s < 0 ? -e : e;for (; --i >= 0; )if (0 != (e = this[i] - t[i]))return e;return 0}function _(t) {var e, i = 1;return 0 != (e = t >>> 16) && (t = e,i += 16),0 != (e = t >> 8) && (t = e,i += 8),0 != (e = t >> 4) && (t = e,i += 4),0 != (e = t >> 2) && (t = e,i += 2),0 != (e = t >> 1) && (t = e,i += 1),i}function b() {return this.t <= 0 ? 0 : this.DB * (this.t - 1) + _(this[this.t - 1] ^ this.s & this.DM)}function y(t, e) {var i;for (i = this.t - 1; i >= 0; --i)e[i + t] = this[i];for (i = t - 1; i >= 0; --i)e[i] = 0;e.t = this.t + t,e.s = this.s}function w(t, e) {for (var i = t; i < this.t; ++i)e[i - t] = this[i];e.t = Math.max(this.t - t, 0),e.s = this.s}function k(t, e) {var i, s = t % this.DB, n = this.DB - s, r = (1 << n) - 1, o = Math.floor(t / this.DB), a = this.s << s & this.DM;for (i = this.t - 1; i >= 0; --i)e[i + o + 1] = this[i] >> n | a,a = (this[i] & r) << s;for (i = o - 1; i >= 0; --i)e[i] = 0;e[o] = a,e.t = this.t + o + 1,e.s = this.s,e.clamp()}function x(t, e) {e.s = this.s;var i = Math.floor(t / this.DB);if (i >= this.t)return void (e.t = 0);var s = t % this.DB, n = this.DB - s, r = (1 << s) - 1;e[0] = this[i] >> s;for (var o = i + 1; o < this.t; ++o)e[o - i - 1] |= (this[o] & r) << n,e[o - i] = this[o] >> s;s > 0 && (e[this.t - i - 1] |= (this.s & r) << n),e.t = this.t - i,e.clamp()}function D(t, e) {for (var i = 0, s = 0, n = Math.min(t.t, this.t); n > i; )s += this[i] - t[i],e[i++] = s & this.DM,s >>= this.DB;if (t.t < this.t) {for (s -= t.s; i < this.t; )s += this[i],e[i++] = s & this.DM,s >>= this.DB;s += this.s} else {for (s += this.s; i < t.t; )s -= t[i],e[i++] = s & this.DM,s >>= this.DB;s -= t.s}e.s = 0 > s ? -1 : 0,-1 > s ? e[i++] = this.DV + s : s > 0 && (e[i++] = s),e.t = i,e.clamp()}function S(t, i) {var s = this.abs(), n = t.abs(), r = s.t;for (i.t = r + n.t; --r >= 0; )i[r] = 0;for (r = 0; r < n.t; ++r)i[r + s.t] = s.am(0, n[r], i, r, 0, s.t);i.s = 0,i.clamp(),this.s != t.s && e.ZERO.subTo(i, i)}function C(t) {for (var e = this.abs(), i = t.t = 2 * e.t; --i >= 0; )t[i] = 0;for (i = 0; i < e.t - 1; ++i) {var s = e.am(i, e[i], t, 2 * i, 0, 1);(t[i + e.t] += e.am(i + 1, 2 * e[i], t, 2 * i + 1, s, e.t - i - 1)) >= e.DV && (t[i + e.t] -= e.DV,t[i + e.t + 1] = 1)}t.t > 0 && (t[t.t - 1] += e.am(i, e[i], t, 2 * i, 0, 1)),t.s = 0,t.clamp()}function T(t, s, n) {var r = t.abs();if (!(r.t <= 0)) {var o = this.abs();if (o.t < r.t)return null != s && s.fromInt(0),void (null != n && this.copyTo(n));null == n && (n = i());var a = i(), c = this.s, l = t.s, u = this.DB - _(r[r.t - 1]);u > 0 ? (r.lShiftTo(u, a),o.lShiftTo(u, n)) : (r.copyTo(a),o.copyTo(n));var p = a.t, d = a[p - 1];if (0 != d) {var h = d * (1 << this.F1) + (p > 1 ? a[p - 2] >> this.F2 : 0), f = this.FV / h, g = (1 << this.F1) / h, m = 1 << this.F2, v = n.t, b = v - p, y = null == s ? i() : s;for (a.dlShiftTo(b, y),n.compareTo(y) >= 0 && (n[n.t++] = 1,n.subTo(y, n)),e.ONE.dlShiftTo(p, y),y.subTo(a, a); a.t < p; )a[a.t++] = 0;for (; --b >= 0; ) {var w = n[--v] == d ? this.DM : Math.floor(n[v] * f + (n[v - 1] + m) * g);if ((n[v] += a.am(0, w, n, b, 0, p)) < w)for (a.dlShiftTo(b, y),n.subTo(y, n); n[v] < --w; )n.subTo(y, n)}null != s && (n.drShiftTo(p, s),c != l && e.ZERO.subTo(s, s)),n.t = p,n.clamp(),u > 0 && n.rShiftTo(u, n),0 > c && e.ZERO.subTo(n, n)}}}function I(t) {var s = i();return this.abs().divRemTo(t, null, s),this.s < 0 && s.compareTo(e.ZERO) > 0 && t.subTo(s, s),s}function $(t) {this.m = t}function P(t) {return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t}function R(t) {return t}function A(t) {t.divRemTo(this.m, null, t)}function E(t, e, i) {t.multiplyTo(e, i),this.reduce(i)}function M(t, e) {t.squareTo(e),this.reduce(e)}function N() {if (this.t < 1)return 0;var t = this[0];if (0 == (1 & t))return 0;var e = 3 & t;return e = e * (2 - (15 & t) * e) & 15,e = e * (2 - (255 & t) * e) & 255,e = e * (2 - ((65535 & t) * e & 65535)) & 65535,e = e * (2 - t * e % this.DV) % this.DV,e > 0 ? this.DV - e : -e}function O(t) {this.m = t,this.mp = t.invDigit(),this.mpl = 32767 & this.mp,this.mph = this.mp >> 15,this.um = (1 << t.DB - 15) - 1,this.mt2 = 2 * t.t}function B(t) {var s = i();return t.abs().dlShiftTo(this.m.t, s),s.divRemTo(this.m, null, s),t.s < 0 && s.compareTo(e.ZERO) > 0 && this.m.subTo(s, s),s}function j(t) {var e = i();return t.copyTo(e),this.reduce(e),e}function L(t) {for (; t.t <= this.mt2; )t[t.t++] = 0;for (var e = 0; e < this.m.t; ++e) {var i = 32767 & t[e], s = i * this.mpl + ((i * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM;for (i = e + this.m.t,t[i] += this.m.am(0, s, t, e, 0, this.m.t); t[i] >= t.DV; )t[i] -= t.DV,t[++i]++}t.clamp(),t.drShiftTo(this.m.t, t),t.compareTo(this.m) >= 0 && t.subTo(this.m, t)}function F(t, e) {t.squareTo(e),this.reduce(e)}function K(t, e, i) {t.multiplyTo(e, i),this.reduce(i)}function U() {return 0 == (this.t > 0 ? 1 & this[0] : this.s)}function V(t, s) {if (t > 4294967295 || 1 > t)return e.ONE;var n = i(), r = i(), o = s.convert(this), a = _(t) - 1;for (o.copyTo(n); --a >= 0; )if (s.sqrTo(n, r),(t & 1 << a) > 0)s.mulTo(r, o, n);else {var c = n;n = r,r = c}return s.revert(n)}function z(t, e) {var i;return i = 256 > t || e.isEven() ? new $(e) : new O(e),this.exp(t, i)}function H() {var t = i();return this.copyTo(t),t}function q() {if (this.s < 0) {if (1 == this.t)return this[0] - this.DV;if (0 == this.t)return -1} else {if (1 == this.t)return this[0];if (0 == this.t)return 0}return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]}function J() {return 0 == this.t ? this.s : this[0] << 24 >> 24}function G() {return 0 == this.t ? this.s : this[0] << 16 >> 16}function Y(t) {return Math.floor(Math.LN2 * this.DB / Math.log(t))}function W() {return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1}function Z(t) {if (null == t && (t = 10),0 == this.signum() || 2 > t || t > 36)return "0";var e = this.chunkSize(t), s = Math.pow(t, e), n = u(s), r = i(), o = i(), a = "";for (this.divRemTo(n, r, o); r.signum() > 0; )a = (s + o.intValue()).toString(t).substr(1) + a,r.divRemTo(n, r, o);return o.intValue().toString(t) + a}function Q(t, i) {this.fromInt(0),null == i && (i = 10);for (var s = this.chunkSize(i), n = Math.pow(i, s), r = !1, o = 0, c = 0, l = 0; l < t.length; ++l) {var u = a(t, l);0 > u ? "-" == t.charAt(l) && 0 == this.signum() && (r = !0) : (c = i * c + u,++o >= s && (this.dMultiply(n),this.dAddOffset(c, 0),o = 0,c = 0))}o > 0 && (this.dMultiply(Math.pow(i, o)),this.dAddOffset(c, 0)),r && e.ZERO.subTo(this, this)}function X(t, i, s) {if ("number" == typeof i)if (2 > t)this.fromInt(1);elsefor (this.fromNumber(t, s),this.testBit(t - 1) || this.bitwiseTo(e.ONE.shiftLeft(t - 1), at, this),this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(i); )this.dAddOffset(2, 0),this.bitLength() > t && this.subTo(e.ONE.shiftLeft(t - 1), this);else {var n = new Array, r = 7 & t;n.length = (t >> 3) + 1,i.nextBytes(n),r > 0 ? n[0] &= (1 << r) - 1 : n[0] = 0,this.fromString(n, 256)}}function tt() {var t = this.t, e = new Array;e[0] = this.s;var i, s = this.DB - t * this.DB % 8, n = 0;if (t-- > 0)for (s < this.DB && (i = this[t] >> s) != (this.s & this.DM) >> s && (e[n++] = i | this.s << this.DB - s); t >= 0; )8 > s ? (i = (this[t] & (1 << s) - 1) << 8 - s,i |= this[--t] >> (s += this.DB - 8)) : (i = this[t] >> (s -= 8) & 255,0 >= s && (s += this.DB,--t)),0 != (128 & i) && (i |= -256),0 == n && (128 & this.s) != (128 & i) && ++n,(n > 0 || i != this.s) && (e[n++] = i);return e}function et(t) {return 0 == this.compareTo(t)}function it(t) {return this.compareTo(t) < 0 ? this : t}function st(t) {return this.compareTo(t) > 0 ? this : t}function nt(t, e, i) {var s, n, r = Math.min(t.t, this.t);for (s = 0; r > s; ++s)i[s] = e(this[s], t[s]);if (t.t < this.t) {for (n = t.s & this.DM,s = r; s < this.t; ++s)i[s] = e(this[s], n);i.t = this.t} else {for (n = this.s & this.DM,s = r; s < t.t; ++s)i[s] = e(n, t[s]);i.t = t.t}i.s = e(this.s, t.s),i.clamp()}function rt(t, e) {return t & e}function ot(t) {var e = i();return this.bitwiseTo(t, rt, e),e}function at(t, e) {return t | e}function ct(t) {var e = i();return this.bitwiseTo(t, at, e),e}function lt(t, e) {return t ^ e}function ut(t) {var e = i();return this.bitwiseTo(t, lt, e),e}function pt(t, e) {return t & ~e}function dt(t) {var e = i();return this.bitwiseTo(t, pt, e),e}function ht() {for (var t = i(), e = 0; e < this.t; ++e)t[e] = this.DM & ~this[e];return t.t = this.t,t.s = ~this.s,t}function ft(t) {var e = i();return 0 > t ? this.rShiftTo(-t, e) : this.lShiftTo(t, e),e}function gt(t) {var e = i();return 0 > t ? this.lShiftTo(-t, e) : this.rShiftTo(t, e),e}function mt(t) {if (0 == t)return -1;var e = 0;return 0 == (65535 & t) && (t >>= 16,e += 16),0 == (255 & t) && (t >>= 8,e += 8),0 == (15 & t) && (t >>= 4,e += 4),0 == (3 & t) && (t >>= 2,e += 2),0 == (1 & t) && ++e,e}function vt() {for (var t = 0; t < this.t; ++t)if (0 != this[t])return t * this.DB + mt(this[t]);return this.s < 0 ? this.t * this.DB : -1}function _t(t) {for (var e = 0; 0 != t; )t &= t - 1,++e;return e}function bt() {for (var t = 0, e = this.s & this.DM, i = 0; i < this.t; ++i)t += _t(this[i] ^ e);return t}function yt(t) {var e = Math.floor(t / this.DB);return e >= this.t ? 0 != this.s : 0 != (this[e] & 1 << t % this.DB)}function wt(t, i) {var s = e.ONE.shiftLeft(t);return this.bitwiseTo(s, i, s),s}function kt(t) {return this.changeBit(t, at)}function xt(t) {return this.changeBit(t, pt)}function Dt(t) {return this.changeBit(t, lt)}function St(t, e) {for (var i = 0, s = 0, n = Math.min(t.t, this.t); n > i; )s += this[i] + t[i],e[i++] = s & this.DM,s >>= this.DB;if (t.t < this.t) {for (s += t.s; i < this.t; )s += this[i],e[i++] = s & this.DM,s >>= this.DB;s += this.s} else {for (s += this.s; i < t.t; )s += t[i],e[i++] = s & this.DM,s >>= this.DB;s += t.s}e.s = 0 > s ? -1 : 0,s > 0 ? e[i++] = s : -1 > s && (e[i++] = this.DV + s),e.t = i,e.clamp()}function Ct(t) {var e = i();return this.addTo(t, e),e}function Tt(t) {var e = i();return this.subTo(t, e),e}function It(t) {var e = i();return this.multiplyTo(t, e),e}function $t() {var t = i();return this.squareTo(t),t}function Pt(t) {var e = i();return this.divRemTo(t, e, null),e}function Rt(t) {var e = i();return this.divRemTo(t, null, e),e}function At(t) {var e = i(), s = i();return this.divRemTo(t, e, s),new Array(e,s)}function Et(t) {this[this.t] = this.am(0, t - 1, this, 0, 0, this.t),++this.t,this.clamp()}function Mt(t, e) {if (0 != t) {for (; this.t <= e; )this[this.t++] = 0;for (this[e] += t; this[e] >= this.DV; )this[e] -= this.DV,++e >= this.t && (this[this.t++] = 0),++this[e]}}function Nt() {}function Ot(t) {return t}function Bt(t, e, i) {t.multiplyTo(e, i)}function jt(t, e) {t.squareTo(e)}function Lt(t) {return this.exp(t, new Nt)}function Ft(t, e, i) {var s = Math.min(this.t + t.t, e);for (i.s = 0,i.t = s; s > 0; )i[--s] = 0;var n;for (n = i.t - this.t; n > s; ++s)i[s + this.t] = this.am(0, t[s], i, s, 0, this.t);for (n = Math.min(t.t, e); n > s; ++s)this.am(0, t[s], i, s, 0, e - s);i.clamp()}function Kt(t, e, i) {--e;var s = i.t = this.t + t.t - e;for (i.s = 0; --s >= 0; )i[s] = 0;for (s = Math.max(e - this.t, 0); s < t.t; ++s)i[this.t + s - e] = this.am(e - s, t[s], i, 0, 0, this.t + s - e);i.clamp(),i.drShiftTo(1, i)}function Ut(t) {this.r2 = i(),this.q3 = i(),e.ONE.dlShiftTo(2 * t.t, this.r2),this.mu = this.r2.divide(t),this.m = t}function Vt(t) {if (t.s < 0 || t.t > 2 * this.m.t)return t.mod(this.m);if (t.compareTo(this.m) < 0)return t;var e = i();return t.copyTo(e),this.reduce(e),e}function zt(t) {return t}function Ht(t) {for (t.drShiftTo(this.m.t - 1, this.r2),t.t > this.m.t + 1 && (t.t = this.m.t + 1,t.clamp()),this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3),this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); t.compareTo(this.r2) < 0; )t.dAddOffset(1, this.m.t + 1);for (t.subTo(this.r2, t); t.compareTo(this.m) >= 0; )t.subTo(this.m, t)}function qt(t, e) {t.squareTo(e),this.reduce(e)}function Jt(t, e, i) {t.multiplyTo(e, i),this.reduce(i)}function Gt(t, e) {var s, n, r = t.bitLength(), o = u(1);if (0 >= r)return o;s = 18 > r ? 1 : 48 > r ? 3 : 144 > r ? 4 : 768 > r ? 5 : 6,n = 8 > r ? new $(e) : e.isEven() ? new Ut(e) : new O(e);var a = new Array, c = 3, l = s - 1, p = (1 << s) - 1;if (a[1] = n.convert(this),s > 1) {var d = i();for (n.sqrTo(a[1], d); p >= c; )a[c] = i(),n.mulTo(d, a[c - 2], a[c]),c += 2}var h, f, g = t.t - 1, m = !0, v = i();for (r = _(t[g]) - 1; g >= 0; ) {for (r >= l ? h = t[g] >> r - l & p : (h = (t[g] & (1 << r + 1) - 1) << l - r,g > 0 && (h |= t[g - 1] >> this.DB + r - l)),c = s; 0 == (1 & h); )h >>= 1,--c;if ((r -= c) < 0 && (r += this.DB,--g),m)a[h].copyTo(o),m = !1;else {for (; c > 1; )n.sqrTo(o, v),n.sqrTo(v, o),c -= 2;c > 0 ? n.sqrTo(o, v) : (f = o,o = v,v = f),n.mulTo(v, a[h], o)}for (; g >= 0 && 0 == (t[g] & 1 << r); )n.sqrTo(o, v),f = o,o = v,v = f,--r < 0 && (r = this.DB - 1,--g)}return n.revert(o)}function Yt(t) {var e = this.s < 0 ? this.negate() : this.clone(), i = t.s < 0 ? t.negate() : t.clone();if (e.compareTo(i) < 0) {var s = e;e = i,i = s}var n = e.getLowestSetBit(), r = i.getLowestSetBit();if (0 > r)return e;for (r > n && (r = n),r > 0 && (e.rShiftTo(r, e),i.rShiftTo(r, i)); e.signum() > 0; )(n = e.getLowestSetBit()) > 0 && e.rShiftTo(n, e),(n = i.getLowestSetBit()) > 0 && i.rShiftTo(n, i),e.compareTo(i) >= 0 ? (e.subTo(i, e),e.rShiftTo(1, e)) : (i.subTo(e, i),i.rShiftTo(1, i));return r > 0 && i.lShiftTo(r, i),i}function Wt(t) {if (0 >= t)return 0;var e = this.DV % t, i = this.s < 0 ? t - 1 : 0;if (this.t > 0)if (0 == e)i = this[0] % t;elsefor (var s = this.t - 1; s >= 0; --s)i = (e * i + this[s]) % t;return i}function Zt(t) {var i = t.isEven();if (this.isEven() && i || 0 == t.signum())return e.ZERO;for (var s = t.clone(), n = this.clone(), r = u(1), o = u(0), a = u(0), c = u(1); 0 != s.signum(); ) {for (; s.isEven(); )s.rShiftTo(1, s),i ? (r.isEven() && o.isEven() || (r.addTo(this, r),o.subTo(t, o)),r.rShiftTo(1, r)) : o.isEven() || o.subTo(t, o),o.rShiftTo(1, o);for (; n.isEven(); )n.rShiftTo(1, n),i ? (a.isEven() && c.isEven() || (a.addTo(this, a),c.subTo(t, c)),a.rShiftTo(1, a)) : c.isEven() || c.subTo(t, c),c.rShiftTo(1, c);s.compareTo(n) >= 0 ? (s.subTo(n, s),i && r.subTo(a, r),o.subTo(c, o)) : (n.subTo(s, n),i && a.subTo(r, a),c.subTo(o, c))}return 0 != n.compareTo(e.ONE) ? e.ZERO : c.compareTo(t) >= 0 ? c.subtract(t) : c.signum() < 0 ? (c.addTo(t, c),c.signum() < 0 ? c.add(t) : c) : c}function Qt(t) {var e, i = this.abs();if (1 == i.t && i[0] <= $e[$e.length - 1]) {for (e = 0; e < $e.length; ++e)if (i[0] == $e[e])return !0;return !1}if (i.isEven())return !1;for (e = 1; e < $e.length; ) {for (var s = $e[e], n = e + 1; n < $e.length && Pe > s; )s *= $e[n++];for (s = i.modInt(s); n > e; )if (s % $e[e++] == 0)return !1}return i.millerRabin(t)}function Xt(t) {var s = this.subtract(e.ONE), n = s.getLowestSetBit();if (0 >= n)return !1;var r = s.shiftRight(n);t = t + 1 >> 1,t > $e.length && (t = $e.length);for (var o = i(), a = 0; t > a; ++a) {o.fromInt($e[Math.floor(Math.random() * $e.length)]);var c = o.modPow(r, this);if (0 != c.compareTo(e.ONE) && 0 != c.compareTo(s)) {for (var l = 1; l++ < n && 0 != c.compareTo(s); )if (c = c.modPowInt(2, this),0 == c.compareTo(e.ONE))return !1;if (0 != c.compareTo(s))return !1}}return !0}function te() {this.i = 0,this.j = 0,this.S = new Array}function ee(t) {var e, i, s;for (e = 0; 256 > e; ++e)this.S[e] = e;for (i = 0,e = 0; 256 > e; ++e)i = i + this.S[e] + t[e % t.length] & 255,s = this.S[e],this.S[e] = this.S[i],this.S[i] = s;this.i = 0,this.j = 0}function ie() {var t;return this.i = this.i + 1 & 255,this.j = this.j + this.S[this.i] & 255,t = this.S[this.i],this.S[this.i] = this.S[this.j],this.S[this.j] = t,this.S[t + this.S[this.i] & 255]}function se() {return new te}function ne() {if (null == Re) {for (Re = se(); Me > Ee; ) {var t = Math.floor(65536 * Math.random());Ae[Ee++] = 255 & t}for (Re.init(Ae),Ee = 0; Ee < Ae.length; ++Ee)Ae[Ee] = 0;Ee = 0}return Re.next()}function re(t) {var e;for (e = 0; e < t.length; ++e)t[e] = ne()}function oe() {}function ae(t, i) {return new e(t,i)}function ce(t, i) {if (i < t.length + 11)return console.error("Message too long for RSA"),null;for (var s = new Array, n = t.length - 1; n >= 0 && i > 0; ) {var r = t.charCodeAt(n--);128 > r ? s[--i] = r : r > 127 && 2048 > r ? (s[--i] = 63 & r | 128,s[--i] = r >> 6 | 192) : (s[--i] = 63 & r | 128,s[--i] = r >> 6 & 63 | 128,s[--i] = r >> 12 | 224)}s[--i] = 0;for (var o = new oe, a = new Array; i > 2; ) {for (a[0] = 0; 0 == a[0]; )o.nextBytes(a);s[--i] = a[0]}return s[--i] = 2,s[--i] = 0,new e(s)}function le() {this.n = null,this.e = 0,this.d = null,this.p = null,this.q = null,this.dmp1 = null,this.dmq1 = null,this.coeff = null}function ue(t, e) {null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = ae(t, 16),this.e = parseInt(e, 16)) : console.error("Invalid RSA public key")}function pe(t) {return t.modPowInt(this.e, this.n)}function de(t) {var e = ce(t, this.n.bitLength() + 7 >> 3);if (null == e)return null;var i = this.doPublic(e);if (null == i)return null;var s = i.toString(16);return 0 == (1 & s.length) ? s : "0" + s}function he(t, e) {for (var i = t.toByteArray(), s = 0; s < i.length && 0 == i[s]; )++s;if (i.length - s != e - 1 || 2 != i[s])return null;for (++s; 0 != i[s]; )if (++s >= i.length)return null;for (var n = ""; ++s < i.length; ) {var r = 255 & i[s];128 > r ? n += String.fromCharCode(r) : r > 191 && 224 > r ? (n += String.fromCharCode((31 & r) << 6 | 63 & i[s + 1]),++s) : (n += String.fromCharCode((15 & r) << 12 | (63 & i[s + 1]) << 6 | 63 & i[s + 2]),s += 2)}return n}function fe(t, e, i) {null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = ae(t, 16),this.e = parseInt(e, 16),this.d = ae(i, 16)) : console.error("Invalid RSA private key")}function ge(t, e, i, s, n, r, o, a) {null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = ae(t, 16),this.e = parseInt(e, 16),this.d = ae(i, 16),this.p = ae(s, 16),this.q = ae(n, 16),this.dmp1 = ae(r, 16),this.dmq1 = ae(o, 16),this.coeff = ae(a, 16)) : console.error("Invalid RSA private key")}function me(t, i) {var s = new oe, n = t >> 1;this.e = parseInt(i, 16);for (var r = new e(i,16); ; ) {for (; this.p = new e(t - n,1,s),0 != this.p.subtract(e.ONE).gcd(r).compareTo(e.ONE) || !this.p.isProbablePrime(10); );for (; this.q = new e(n,1,s),0 != this.q.subtract(e.ONE).gcd(r).compareTo(e.ONE) || !this.q.isProbablePrime(10); );if (this.p.compareTo(this.q) <= 0) {var o = this.p;this.p = this.q,this.q = o}var a = this.p.subtract(e.ONE), c = this.q.subtract(e.ONE), l = a.multiply(c);if (0 == l.gcd(r).compareTo(e.ONE)) {this.n = this.p.multiply(this.q),this.d = r.modInverse(l),this.dmp1 = this.d.mod(a),this.dmq1 = this.d.mod(c),this.coeff = this.q.modInverse(this.p);break}}}function ve(t) {if (null == this.p || null == this.q)return t.modPow(this.d, this.n);for (var e = t.mod(this.p).modPow(this.dmp1, this.p), i = t.mod(this.q).modPow(this.dmq1, this.q); e.compareTo(i) < 0; )e = e.add(this.p);return e.subtract(i).multiply(this.coeff).mod(this.p).multiply(this.q).add(i)}function _e(t) {var e = ae(t, 16), i = this.doPrivate(e);return null == i ? null : he(i, this.n.bitLength() + 7 >> 3)}function be(t) {var e, i, s = "";for (e = 0; e + 3 <= t.length; e += 3)i = parseInt(t.substring(e, e + 3), 16),s += je.charAt(i >> 6) + je.charAt(63 & i);for (e + 1 == t.length ? (i = parseInt(t.substring(e, e + 1), 16),s += je.charAt(i << 2)) : e + 2 == t.length && (i = parseInt(t.substring(e, e + 2), 16),s += je.charAt(i >> 2) + je.charAt((3 & i) << 4)); (3 & s.length) > 0; )s += Le;return s}function ye(t) {var e, i, s = "", n = 0;for (e = 0; e < t.length && t.charAt(e) != Le; ++e)v = je.indexOf(t.charAt(e)),v < 0 || (0 == n ? (s += o(v >> 2),i = 3 & v,n = 1) : 1 == n ? (s += o(i << 2 | v >> 4),i = 15 & v,n = 2) : 2 == n ? (s += o(i),s += o(v >> 2),i = 3 & v,n = 3) : (s += o(i << 2 | v >> 4),s += o(15 & v),n = 0));return 1 == n && (s += o(i << 2)),s}var we, ke = 0xdeadbeefcafe, xe = 15715070 == (16777215 & ke);xe && "Microsoft Internet Explorer" == navigator.appName ? (e.prototype.am = n,we = 30) : xe && "Netscape" != navigator.appName ? (e.prototype.am = s,we = 26) : (e.prototype.am = r,we = 28),e.prototype.DB = we,e.prototype.DM = (1 << we) - 1,e.prototype.DV = 1 << we;var De = 52;e.prototype.FV = Math.pow(2, De),e.prototype.F1 = De - we,e.prototype.F2 = 2 * we - De;var Se, Ce, Te = "0123456789abcdefghijklmnopqrstuvwxyz", Ie = new Array;for (Se = "0".charCodeAt(0),Ce = 0; 9 >= Ce; ++Ce)Ie[Se++] = Ce;for (Se = "a".charCodeAt(0),Ce = 10; 36 > Ce; ++Ce)Ie[Se++] = Ce;for (Se = "A".charCodeAt(0),Ce = 10; 36 > Ce; ++Ce)Ie[Se++] = Ce;$.prototype.convert = P,$.prototype.revert = R,$.prototype.reduce = A,$.prototype.mulTo = E,$.prototype.sqrTo = M,O.prototype.convert = B,O.prototype.revert = j,O.prototype.reduce = L,O.prototype.mulTo = K,O.prototype.sqrTo = F,e.prototype.copyTo = c,e.prototype.fromInt = l,e.prototype.fromString = p,e.prototype.clamp = d,e.prototype.dlShiftTo = y,e.prototype.drShiftTo = w,e.prototype.lShiftTo = k,e.prototype.rShiftTo = x,e.prototype.subTo = D,e.prototype.multiplyTo = S,e.prototype.squareTo = C,e.prototype.divRemTo = T,e.prototype.invDigit = N,e.prototype.isEven = U,e.prototype.exp = V,e.prototype.toString = h,e.prototype.negate = f,e.prototype.abs = g,e.prototype.compareTo = m,e.prototype.bitLength = b,e.prototype.mod = I,e.prototype.modPowInt = z,e.ZERO = u(0),e.ONE = u(1),Nt.prototype.convert = Ot,Nt.prototype.revert = Ot,Nt.prototype.mulTo = Bt,Nt.prototype.sqrTo = jt,Ut.prototype.convert = Vt,Ut.prototype.revert = zt,Ut.prototype.reduce = Ht,Ut.prototype.mulTo = Jt,Ut.prototype.sqrTo = qt;var $e = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997], Pe = (1 << 26) / $e[$e.length - 1];e.prototype.chunkSize = Y,e.prototype.toRadix = Z,e.prototype.fromRadix = Q,e.prototype.fromNumber = X,e.prototype.bitwiseTo = nt,e.prototype.changeBit = wt,e.prototype.addTo = St,e.prototype.dMultiply = Et,e.prototype.dAddOffset = Mt,e.prototype.multiplyLowerTo = Ft,e.prototype.multiplyUpperTo = Kt,e.prototype.modInt = Wt,e.prototype.millerRabin = Xt,e.prototype.clone = H,e.prototype.intValue = q,e.prototype.byteValue = J,e.prototype.shortValue = G,e.prototype.signum = W,e.prototype.toByteArray = tt,e.prototype.equals = et,e.prototype.min = it,e.prototype.max = st,e.prototype.and = ot,e.prototype.or = ct,e.prototype.xor = ut,e.prototype.andNot = dt,e.prototype.not = ht,e.prototype.shiftLeft = ft,e.prototype.shiftRight = gt,e.prototype.getLowestSetBit = vt,e.prototype.bitCount = bt,e.prototype.testBit = yt,e.prototype.setBit = kt,e.prototype.clearBit = xt,e.prototype.flipBit = Dt,e.prototype.add = Ct,e.prototype.subtract = Tt,e.prototype.multiply = It,e.prototype.divide = Pt,e.prototype.remainder = Rt,e.prototype.divideAndRemainder = At,e.prototype.modPow = Gt,e.prototype.modInverse = Zt,e.prototype.pow = Lt,e.prototype.gcd = Yt,e.prototype.isProbablePrime = Qt,e.prototype.square = $t,te.prototype.init = ee,te.prototype.next = ie;var Re, Ae, Ee, Me = 256;if (null == Ae) {Ae = new Array,Ee = 0;var Ne;if (window.crypto && window.crypto.getRandomValues) {var Oe = new Uint32Array(256);for (window.crypto.getRandomValues(Oe),Ne = 0; Ne < Oe.length; ++Ne)Ae[Ee++] = 255 & Oe[Ne]}var Be = function(t) {if (this.count = this.count || 0,this.count >= 256 || Ee >= Me)return void (window.removeEventListener ? window.removeEventListener("mousemove", Be, !1) : window.detachEvent && window.detachEvent("onmousemove", Be));try {var e = t.x + t.y;Ae[Ee++] = 255 & e,this.count += 1} catch (t) {}};window.addEventListener ? window.addEventListener("mousemove", Be, !1) : window.attachEvent && window.attachEvent("onmousemove", Be)}oe.prototype.nextBytes = re,le.prototype.doPublic = pe,le.prototype.setPublic = ue,le.prototype.encrypt = de,le.prototype.doPrivate = ve,le.prototype.setPrivate = fe,le.prototype.setPrivateEx = ge,le.prototype.generate = me,le.prototype.decrypt = _e,function() {var t = function(t, s, n) {var r = new oe, o = t >> 1;this.e = parseInt(s, 16);var a = new e(s,16), c = this, l = function() {var s = function() {if (c.p.compareTo(c.q) <= 0) {var t = c.p;c.p = c.q,c.q = t}var i = c.p.subtract(e.ONE), s = c.q.subtract(e.ONE), r = i.multiply(s);0 == r.gcd(a).compareTo(e.ONE) ? (c.n = c.p.multiply(c.q),c.d = a.modInverse(r),c.dmp1 = c.d.mod(i),c.dmq1 = c.d.mod(s),c.coeff = c.q.modInverse(c.p),setTimeout(function() {n()}, 0)) : setTimeout(l, 0)}, u = function() {c.q = i(),c.q.fromNumberAsync(o, 1, r, function() {c.q.subtract(e.ONE).gcda(a, function(t) {0 == t.compareTo(e.ONE) && c.q.isProbablePrime(10) ? setTimeout(s, 0) : setTimeout(u, 0)})})}, p = function() {c.p = i(),c.p.fromNumberAsync(t - o, 1, r, function() {c.p.subtract(e.ONE).gcda(a, function(t) {0 == t.compareTo(e.ONE) && c.p.isProbablePrime(10) ? setTimeout(u, 0) : setTimeout(p, 0)})})};setTimeout(p, 0)};setTimeout(l, 0)};le.prototype.generateAsync = t;var s = function(t, e) {var i = this.s < 0 ? this.negate() : this.clone(), s = t.s < 0 ? t.negate() : t.clone();if (i.compareTo(s) < 0) {var n = i;i = s,s = n}var r = i.getLowestSetBit(), o = s.getLowestSetBit();if (0 > o)return void e(i);o > r && (o = r),o > 0 && (i.rShiftTo(o, i),s.rShiftTo(o, s));var a = function() {(r = i.getLowestSetBit()) > 0 && i.rShiftTo(r, i),(r = s.getLowestSetBit()) > 0 && s.rShiftTo(r, s),i.compareTo(s) >= 0 ? (i.subTo(s, i),i.rShiftTo(1, i)) : (s.subTo(i, s),s.rShiftTo(1, s)),i.signum() > 0 ? setTimeout(a, 0) : (o > 0 && s.lShiftTo(o, s),setTimeout(function() {e(s)}, 0))};setTimeout(a, 10)};e.prototype.gcda = s;var n = function(t, i, s, n) {if ("number" == typeof i)if (2 > t)this.fromInt(1);else {this.fromNumber(t, s),this.testBit(t - 1) || this.bitwiseTo(e.ONE.shiftLeft(t - 1), at, this),this.isEven() && this.dAddOffset(1, 0);var r = this, o = function() {r.dAddOffset(2, 0),r.bitLength() > t && r.subTo(e.ONE.shiftLeft(t - 1), r),r.isProbablePrime(i) ? setTimeout(function() {n()}, 0) : setTimeout(o, 0)};setTimeout(o, 0)}else {var a = new Array, c = 7 & t;a.length = (t >> 3) + 1,i.nextBytes(a),c > 0 ? a[0] &= (1 << c) - 1 : a[0] = 0,this.fromString(a, 256)}};e.prototype.fromNumberAsync = n}();var je = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", Le = "=", Fe = Fe || {};Fe.env = Fe.env || {};var Ke = Fe, Ue = Object.prototype, Ve = "[object Function]", ze = ["toString", "valueOf"];Fe.env.parseUA = function(t) {var e, i = function(t) {var e = 0;return parseFloat(t.replace(/\./g, function() {return 1 == e++ ? "" : "."}))}, s = navigator, n = {ie: 0,opera: 0,gecko: 0,webkit: 0,chrome: 0,mobile: null,air: 0,ipad: 0,iphone: 0,ipod: 0,ios: null,android: 0,webos: 0,caja: s && s.cajaVersion,secure: !1,os: null}, r = t || navigator && navigator.userAgent, o = window && window.location, a = o && o.href;return n.secure = a && 0 === a.toLowerCase().indexOf("https"),r && (/windows|win32/i.test(r) ? n.os = "windows" : /macintosh/i.test(r) ? n.os = "macintosh" : /rhino/i.test(r) && (n.os = "rhino"),/KHTML/.test(r) && (n.webkit = 1),e = r.match(/AppleWebKit\/([^\s]*)/),e && e[1] && (n.webkit = i(e[1]),/ Mobile\//.test(r) ? (n.mobile = "Apple",e = r.match(/OS ([^\s]*)/),e && e[1] && (e = i(e[1].replace("_", "."))),n.ios = e,n.ipad = n.ipod = n.iphone = 0,e = r.match(/iPad|iPod|iPhone/),e && e[0] && (n[e[0].toLowerCase()] = n.ios)) : (e = r.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/),e && (n.mobile = e[0]),/webOS/.test(r) && (n.mobile = "WebOS",e = r.match(/webOS\/([^\s]*);/),e && e[1] && (n.webos = i(e[1]))),/ Android/.test(r) && (n.mobile = "Android",e = r.match(/Android ([^\s]*);/),e && e[1] && (n.android = i(e[1])))),e = r.match(/Chrome\/([^\s]*)/),e && e[1] ? n.chrome = i(e[1]) : (e = r.match(/AdobeAIR\/([^\s]*)/),e && (n.air = e[0]))),n.webkit || (e = r.match(/Opera[\s\/]([^\s]*)/),e && e[1] ? (n.opera = i(e[1]),e = r.match(/Version\/([^\s]*)/),e && e[1] && (n.opera = i(e[1])),e = r.match(/Opera Mini[^;]*/),e && (n.mobile = e[0])) : (e = r.match(/MSIE\s([^;]*)/),e && e[1] ? n.ie = i(e[1]) : (e = r.match(/Gecko\/([^\s]*)/),e && (n.gecko = 1,e = r.match(/rv:([^\s\)]*)/),e && e[1] && (n.gecko = i(e[1]))))))),n},Fe.env.ua = Fe.env.parseUA(),Fe.isFunction = function(t) {return "function" == typeof t || Ue.toString.apply(t) === Ve},Fe._IEEnumFix = Fe.env.ua.ie ? function(t, e) {var i, s, n;for (i = 0; i < ze.length; i += 1)s = ze[i],n = e[s],Ke.isFunction(n) && n != Ue[s] && (t[s] = n)}: function() {},Fe.extend = function(t, e, i) {if (!e || !t)throw new Error("extend failed, please check that all dependencies are included.");var s, n = function() {};if (n.prototype = e.prototype,t.prototype = new n,t.prototype.constructor = t,t.superclass = e.prototype,e.prototype.constructor == Ue.constructor && (e.prototype.constructor = e),i) {for (s in i)Ke.hasOwnProperty(i, s) && (t.prototype[s] = i[s]);Ke._IEEnumFix(t.prototype, i)}},/*** @fileOverview* @name asn1-1.0.js* @author Kenji Urushima kenji.urushima@gmail.com* @version 1.0.2 (2013-May-30)* @since 2.1* @license <a href="//kjur.github.io/jsrsasign/license/">MIT License</a>*/"undefined" != typeof KJUR && KJUR || (KJUR = {}),"undefined" != typeof KJUR.asn1 && KJUR.asn1 || (KJUR.asn1 = {}),KJUR.asn1.ASN1Util = new function() {this.integerToByteHex = function(t) {var e = t.toString(16);return e.length % 2 == 1 && (e = "0" + e),e},this.bigIntToMinTwosComplementsHex = function(t) {var i = t.toString(16);if ("-" != i.substr(0, 1))i.length % 2 == 1 ? i = "0" + i : i.match(/^[0-7]/) || (i = "00" + i);else {var s = i.substr(1), n = s.length;n % 2 == 1 ? n += 1 : i.match(/^[0-7]/) || (n += 2);for (var r = "", o = 0; n > o; o++)r += "f";var a = new e(r,16), c = a.xor(t).add(e.ONE);i = c.toString(16).replace(/^-/, "")}return i},this.getPEMStringFromHex = function(t, e) {var i = CryptoJS.enc.Hex.parse(t), s = CryptoJS.enc.Base64.stringify(i), n = s.replace(/(.{64})/g, "$1\r\n");return n = n.replace(/\r\n$/, ""),"-----BEGIN " + e + "-----\r\n" + n + "\r\n-----END " + e + "-----\r\n"}},KJUR.asn1.ASN1Object = function() {var t = "";this.getLengthHexFromValue = function() {if ("undefined" == typeof this.hV || null == this.hV)throw "this.hV is null or undefined.";if (this.hV.length % 2 == 1)throw "value hex must be even length: n=" + t.length + ",v=" + this.hV;var e = this.hV.length / 2, i = e.toString(16);if (i.length % 2 == 1 && (i = "0" + i),128 > e)return i;var s = i.length / 2;if (s > 15)throw "ASN.1 length too long to represent by 8x: n = " + e.toString(16);var n = 128 + s;return n.toString(16) + i},this.getEncodedHex = function() {return (null == this.hTLV || this.isModified) && (this.hV = this.getFreshValueHex(),this.hL = this.getLengthHexFromValue(),this.hTLV = this.hT + this.hL + this.hV,this.isModified = !1),this.hTLV},this.getValueHex = function() {return this.getEncodedHex(),this.hV},this.getFreshValueHex = function() {return ""}},KJUR.asn1.DERAbstractString = function(t) {KJUR.asn1.DERAbstractString.superclass.constructor.call(this),this.getString = function() {return this.s},this.setString = function(t) {this.hTLV = null,this.isModified = !0,this.s = t,this.hV = stohex(this.s)},this.setStringHex = function(t) {this.hTLV = null,this.isModified = !0,this.s = null,this.hV = t},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.str ? this.setString(t.str) : "undefined" != typeof t.hex && this.setStringHex(t.hex))},Fe.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object),KJUR.asn1.DERAbstractTime = function(t) {KJUR.asn1.DERAbstractTime.superclass.constructor.call(this),this.localDateToUTC = function(t) {utc = t.getTime() + 6e4 * t.getTimezoneOffset();var e = new Date(utc);return e},this.formatDate = function(t, e) {var i = this.zeroPadding, s = this.localDateToUTC(t), n = String(s.getFullYear());"utc" == e && (n = n.substr(2, 2));var r = i(String(s.getMonth() + 1), 2), o = i(String(s.getDate()), 2), a = i(String(s.getHours()), 2), c = i(String(s.getMinutes()), 2), l = i(String(s.getSeconds()), 2);return n + r + o + a + c + l + "Z"},this.zeroPadding = function(t, e) {return t.length >= e ? t : new Array(e - t.length + 1).join("0") + t},this.getString = function() {return this.s},this.setString = function(t) {this.hTLV = null,this.isModified = !0,this.s = t,this.hV = stohex(this.s)},this.setByDateValue = function(t, e, i, s, n, r) {var o = new Date(Date.UTC(t, e - 1, i, s, n, r, 0));this.setByDate(o)},this.getFreshValueHex = function() {return this.hV}},Fe.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object),KJUR.asn1.DERAbstractStructured = function(t) {KJUR.asn1.DERAbstractString.superclass.constructor.call(this),this.setByASN1ObjectArray = function(t) {this.hTLV = null,this.isModified = !0,this.asn1Array = t},this.appendASN1Object = function(t) {this.hTLV = null,this.isModified = !0,this.asn1Array.push(t)},this.asn1Array = new Array,"undefined" != typeof t && "undefined" != typeof t.array && (this.asn1Array = t.array)},Fe.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object),KJUR.asn1.DERBoolean = function() {KJUR.asn1.DERBoolean.superclass.constructor.call(this),this.hT = "01",this.hTLV = "0101ff"},Fe.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object),KJUR.asn1.DERInteger = function(t) {KJUR.asn1.DERInteger.superclass.constructor.call(this),this.hT = "02",this.setByBigInteger = function(t) {this.hTLV = null,this.isModified = !0,this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger = function(t) {var i = new e(String(t),10);this.setByBigInteger(i)},this.setValueHex = function(t) {this.hV = t},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.bigint ? this.setByBigInteger(t.bigint) : "undefined" != typeof t.int ? this.setByInteger(t.int) : "undefined" != typeof t.hex && this.setValueHex(t.hex))},Fe.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object),KJUR.asn1.DERBitString = function(t) {KJUR.asn1.DERBitString.superclass.constructor.call(this),this.hT = "03",this.setHexValueIncludingUnusedBits = function(t) {this.hTLV = null,this.isModified = !0,this.hV = t},this.setUnusedBitsAndHexValue = function(t, e) {if (0 > t || t > 7)throw "unused bits shall be from 0 to 7: u = " + t;var i = "0" + t;this.hTLV = null,this.isModified = !0,this.hV = i + e},this.setByBinaryString = function(t) {t = t.replace(/0+$/, "");var e = 8 - t.length % 8;8 == e && (e = 0);for (var i = 0; e >= i; i++)t += "0";for (var s = "", i = 0; i < t.length - 1; i += 8) {var n = t.substr(i, 8), r = parseInt(n, 2).toString(16);1 == r.length && (r = "0" + r),s += r}this.hTLV = null,this.isModified = !0,this.hV = "0" + e + s},this.setByBooleanArray = function(t) {for (var e = "", i = 0; i < t.length; i++)e += 1 == t[i] ? "1" : "0";this.setByBinaryString(e)},this.newFalseArray = function(t) {for (var e = new Array(t), i = 0; t > i; i++)e[i] = !1;return e},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.hex ? this.setHexValueIncludingUnusedBits(t.hex) : "undefined" != typeof t.bin ? this.setByBinaryString(t.bin) : "undefined" != typeof t.array && this.setByBooleanArray(t.array))},Fe.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object),KJUR.asn1.DEROctetString = function(t) {KJUR.asn1.DEROctetString.superclass.constructor.call(this, t),this.hT = "04"},Fe.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString),KJUR.asn1.DERNull = function() {KJUR.asn1.DERNull.superclass.constructor.call(this),this.hT = "05",this.hTLV = "0500"},Fe.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object),KJUR.asn1.DERObjectIdentifier = function(t) {var i = function(t) {var e = t.toString(16);return 1 == e.length && (e = "0" + e),e}, s = function(t) {var s = "", n = new e(t,10), r = n.toString(2), o = 7 - r.length % 7;7 == o && (o = 0);for (var a = "", c = 0; o > c; c++)a += "0";r = a + r;for (var c = 0; c < r.length - 1; c += 7) {var l = r.substr(c, 7);c != r.length - 7 && (l = "1" + l),s += i(parseInt(l, 2))}return s};KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this),this.hT = "06",this.setValueHex = function(t) {this.hTLV = null,this.isModified = !0,this.s = null,this.hV = t},this.setValueOidString = function(t) {if (!t.match(/^[0-9.]+$/))throw "malformed oid string: " + t;var e = "", n = t.split("."), r = 40 * parseInt(n[0]) + parseInt(n[1]);e += i(r),n.splice(0, 2);for (var o = 0; o < n.length; o++)e += s(n[o]);this.hTLV = null,this.isModified = !0,this.s = null,this.hV = e},this.setValueName = function(t) {if ("undefined" == typeof KJUR.asn1.x509.OID.name2oidList[t])throw "DERObjectIdentifier oidName undefined: " + t;var e = KJUR.asn1.x509.OID.name2oidList[t];this.setValueOidString(e)},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.oid ? this.setValueOidString(t.oid) : "undefined" != typeof t.hex ? this.setValueHex(t.hex) : "undefined" != typeof t.name && this.setValueName(t.name))},Fe.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object),KJUR.asn1.DERUTF8String = function(t) {KJUR.asn1.DERUTF8String.superclass.constructor.call(this, t),this.hT = "0c"},Fe.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString),KJUR.asn1.DERNumericString = function(t) {KJUR.asn1.DERNumericString.superclass.constructor.call(this, t),this.hT = "12"},Fe.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString),KJUR.asn1.DERPrintableString = function(t) {KJUR.asn1.DERPrintableString.superclass.constructor.call(this, t),this.hT = "13"},Fe.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString),KJUR.asn1.DERTeletexString = function(t) {KJUR.asn1.DERTeletexString.superclass.constructor.call(this, t),this.hT = "14"},Fe.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString),KJUR.asn1.DERIA5String = function(t) {KJUR.asn1.DERIA5String.superclass.constructor.call(this, t),this.hT = "16"},Fe.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString),KJUR.asn1.DERUTCTime = function(t) {KJUR.asn1.DERUTCTime.superclass.constructor.call(this, t),this.hT = "17",this.setByDate = function(t) {this.hTLV = null,this.isModified = !0,this.date = t,this.s = this.formatDate(this.date, "utc"),this.hV = stohex(this.s)},"undefined" != typeof t && ("undefined" != typeof t.str ? this.setString(t.str) : "undefined" != typeof t.hex ? this.setStringHex(t.hex) : "undefined" != typeof t.date && this.setByDate(t.date))},Fe.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime),KJUR.asn1.DERGeneralizedTime = function(t) {KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, t),this.hT = "18",this.setByDate = function(t) {this.hTLV = null,this.isModified = !0,this.date = t,this.s = this.formatDate(this.date, "gen"),this.hV = stohex(this.s)},"undefined" != typeof t && ("undefined" != typeof t.str ? this.setString(t.str) : "undefined" != typeof t.hex ? this.setStringHex(t.hex) : "undefined" != typeof t.date && this.setByDate(t.date))},Fe.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime),KJUR.asn1.DERSequence = function(t) {KJUR.asn1.DERSequence.superclass.constructor.call(this, t),this.hT = "30",this.getFreshValueHex = function() {for (var t = "", e = 0; e < this.asn1Array.length; e++) {var i = this.asn1Array[e];t += i.getEncodedHex()}return this.hV = t,this.hV}},Fe.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured),KJUR.asn1.DERSet = function(t) {KJUR.asn1.DERSet.superclass.constructor.call(this, t),this.hT = "31",this.getFreshValueHex = function() {for (var t = new Array, e = 0; e < this.asn1Array.length; e++) {var i = this.asn1Array[e];t.push(i.getEncodedHex())}return t.sort(),this.hV = t.join(""),this.hV}},Fe.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured),KJUR.asn1.DERTaggedObject = function(t) {KJUR.asn1.DERTaggedObject.superclass.constructor.call(this),this.hT = "a0",this.hV = "",this.isExplicit = !0,this.asn1Object = null,this.setASN1Object = function(t, e, i) {this.hT = e,this.isExplicit = t,this.asn1Object = i,this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(),this.hTLV = null,this.isModified = !0) : (this.hV = null,this.hTLV = i.getEncodedHex(),this.hTLV = this.hTLV.replace(/^../, e),this.isModified = !1)},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.tag && (this.hT = t.tag),"undefined" != typeof t.explicit && (this.isExplicit = t.explicit),"undefined" != typeof t.obj && (this.asn1Object = t.obj,this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)))},Fe.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object),function(t) {"use strict";var e, i = {};i.decode = function(i) {var s;if (e === t) {var n = "0123456789ABCDEF", r = " \f\n\r     \u2028\u2029";for (e = [],s = 0; 16 > s; ++s)e[n.charAt(s)] = s;for (n = n.toLowerCase(),s = 10; 16 > s; ++s)e[n.charAt(s)] = s;for (s = 0; s < r.length; ++s)e[r.charAt(s)] = -1}var o = [], a = 0, c = 0;for (s = 0; s < i.length; ++s) {var l = i.charAt(s);if ("=" == l)break;if (l = e[l],-1 != l) {if (l === t)throw "Illegal character at offset " + s;a |= l,++c >= 2 ? (o[o.length] = a,a = 0,c = 0) : a <<= 4}}if (c)throw "Hex encoding incomplete: 4 bits missing";return o},window.Hex = i}(),function(t) {"use strict";var e, i = {};i.decode = function(i) {var s;if (e === t) {var n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", r = "= \f\n\r    \u2028\u2029";for (e = [],s = 0; 64 > s; ++s)e[n.charAt(s)] = s;for (s = 0; s < r.length; ++s)e[r.charAt(s)] = -1}var o = [], a = 0, c = 0;for (s = 0; s < i.length; ++s) {var l = i.charAt(s);if ("=" == l)break;if (l = e[l],-1 != l) {if (l === t)throw "Illegal character at offset " + s;a |= l,++c >= 4 ? (o[o.length] = a >> 16,o[o.length] = a >> 8 & 255,o[o.length] = 255 & a,a = 0,c = 0) : a <<= 6}}switch (c) {case 1:throw "Base64 encoding incomplete: at least 2 bits missing";case 2:o[o.length] = a >> 10;break;case 3:o[o.length] = a >> 16,o[o.length] = a >> 8 & 255}return o},i.re = /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,i.unarmor = function(t) {var e = i.re.exec(t);if (e)if (e[1])t = e[1];else {if (!e[2])throw "RegExp out of sync";t = e[2]}return i.decode(t)},window.Base64 = i}(),function(t) {"use strict";function e(t, i) {t instanceof e ? (this.enc = t.enc,this.pos = t.pos) : (this.enc = t,this.pos = i)}function i(t, e, i, s, n) {this.stream = t,this.header = e,this.length = i,this.tag = s,this.sub = n}var s = 100, n = "…", r = {tag: function(t, e) {var i = document.createElement(t);return i.className = e,i},text: function(t) {return document.createTextNode(t)}};e.prototype.get = function(e) {if (e === t && (e = this.pos++),e >= this.enc.length)throw "Requesting byte offset " + e + " on a stream of length " + this.enc.length;return this.enc[e]},e.prototype.hexDigits = "0123456789ABCDEF",e.prototype.hexByte = function(t) {return this.hexDigits.charAt(t >> 4 & 15) + this.hexDigits.charAt(15 & t)},e.prototype.hexDump = function(t, e, i) {for (var s = "", n = t; e > n; ++n)if (s += this.hexByte(this.get(n)),i !== !0)switch (15 & n) {case 7:s += "  ";break;case 15:s += "\n";break;default:s += " "}return s},e.prototype.parseStringISO = function(t, e) {for (var i = "", s = t; e > s; ++s)i += String.fromCharCode(this.get(s));return i},e.prototype.parseStringUTF = function(t, e) {for (var i = "", s = t; e > s; ) {var n = this.get(s++);i += 128 > n ? String.fromCharCode(n) : n > 191 && 224 > n ? String.fromCharCode((31 & n) << 6 | 63 & this.get(s++)) : String.fromCharCode((15 & n) << 12 | (63 & this.get(s++)) << 6 | 63 & this.get(s++))}return i},e.prototype.parseStringBMP = function(t, e) {for (var i = "", s = t; e > s; s += 2) {var n = this.get(s), r = this.get(s + 1);i += String.fromCharCode((n << 8) + r)}return i},e.prototype.reTime = /^((?:1[89]|2\d)?\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/,e.prototype.parseTime = function(t, e) {var i = this.parseStringISO(t, e), s = this.reTime.exec(i);return s ? (i = s[1] + "-" + s[2] + "-" + s[3] + " " + s[4],s[5] && (i += ":" + s[5],s[6] && (i += ":" + s[6],s[7] && (i += "." + s[7]))),s[8] && (i += " UTC","Z" != s[8] && (i += s[8],s[9] && (i += ":" + s[9]))),i) : "Unrecognized time: " + i},e.prototype.parseInteger = function(t, e) {var i = e - t;if (i > 4) {i <<= 3;var s = this.get(t);if (0 === s)i -= 8;elsefor (; 128 > s; )s <<= 1,--i;return "(" + i + " bit)"}for (var n = 0, r = t; e > r; ++r)n = n << 8 | this.get(r);return n},e.prototype.parseBitString = function(t, e) {var i = this.get(t), s = (e - t - 1 << 3) - i, n = "(" + s + " bit)";if (20 >= s) {var r = i;n += " ";for (var o = e - 1; o > t; --o) {for (var a = this.get(o), c = r; 8 > c; ++c)n += a >> c & 1 ? "1" : "0";r = 0}}return n},e.prototype.parseOctetString = function(t, e) {var i = e - t, r = "(" + i + " byte) ";i > s && (e = t + s);for (var o = t; e > o; ++o)r += this.hexByte(this.get(o));return i > s && (r += n),r},e.prototype.parseOID = function(t, e) {for (var i = "", s = 0, n = 0, r = t; e > r; ++r) {var o = this.get(r);if (s = s << 7 | 127 & o,n += 7,!(128 & o)) {if ("" === i) {var a = 80 > s ? 40 > s ? 0 : 1 : 2;i = a + "." + (s - 40 * a)} elsei += "." + (n >= 31 ? "bigint" : s);s = n = 0}}return i},i.prototype.typeName = function() {if (this.tag === t)return "unknown";var e = this.tag >> 6, i = (this.tag >> 5 & 1,31 & this.tag);switch (e) {case 0:switch (i) {case 0:return "EOC";case 1:return "BOOLEAN";case 2:return "INTEGER";case 3:return "BIT_STRING";case 4:return "OCTET_STRING";case 5:return "NULL";case 6:return "OBJECT_IDENTIFIER";case 7:return "ObjectDescriptor";case 8:return "EXTERNAL";case 9:return "REAL";case 10:return "ENUMERATED";case 11:return "EMBEDDED_PDV";case 12:return "UTF8String";case 16:return "SEQUENCE";case 17:return "SET";case 18:return "NumericString";case 19:return "PrintableString";case 20:return "TeletexString";case 21:return "VideotexString";case 22:return "IA5String";case 23:return "UTCTime";case 24:return "GeneralizedTime";case 25:return "GraphicString";case 26:return "VisibleString";case 27:return "GeneralString";case 28:return "UniversalString";case 30:return "BMPString";default:return "Universal_" + i.toString(16)}case 1:return "Application_" + i.toString(16);case 2:return "[" + i + "]";case 3:return "Private_" + i.toString(16)}},i.prototype.reSeemsASCII = /^[ -~]+$/,i.prototype.content = function() {if (this.tag === t)return null;var e = this.tag >> 6, i = 31 & this.tag, r = this.posContent(), o = Math.abs(this.length);if (0 !== e) {if (null !== this.sub)return "(" + this.sub.length + " elem)";var a = this.stream.parseStringISO(r, r + Math.min(o, s));return this.reSeemsASCII.test(a) ? a.substring(0, 2 * s) + (a.length > 2 * s ? n : "") : this.stream.parseOctetString(r, r + o)}switch (i) {case 1:return 0 === this.stream.get(r) ? "false" : "true";case 2:return this.stream.parseInteger(r, r + o);case 3:return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(r, r + o);case 4:return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(r, r + o);case 6:return this.stream.parseOID(r, r + o);case 16:case 17:return "(" + this.sub.length + " elem)";case 12:return this.stream.parseStringUTF(r, r + o);case 18:case 19:case 20:case 21:case 22:case 26:return this.stream.parseStringISO(r, r + o);case 30:return this.stream.parseStringBMP(r, r + o);case 23:case 24:return this.stream.parseTime(r, r + o)}return null},i.prototype.toString = function() {return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + (null === this.sub ? "null" : this.sub.length) + "]"},i.prototype.print = function(e) {if (e === t && (e = ""),document.writeln(e + this),null !== this.sub) {e += "  ";for (var i = 0, s = this.sub.length; s > i; ++i)this.sub[i].print(e)}},i.prototype.toPrettyString = function(e) {e === t && (e = "");var i = e + this.typeName() + " @" + this.stream.pos;if (this.length >= 0 && (i += "+"),i += this.length,32 & this.tag ? i += " (constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (i += " (encapsulates)"),i += "\n",null !== this.sub) {e += "  ";for (var s = 0, n = this.sub.length; n > s; ++s)i += this.sub[s].toPrettyString(e)}return i},i.prototype.toDOM = function() {var t = r.tag("div", "node");t.asn1 = this;var e = r.tag("div", "head"), i = this.typeName().replace(/_/g, " ");e.innerHTML = i;var s = this.content();if (null !== s) {s = String(s).replace(/</g, "&lt;");var n = r.tag("span", "preview");n.appendChild(r.text(s)),e.appendChild(n)}t.appendChild(e),this.node = t,this.head = e;var o = r.tag("div", "value");if (i = "Offset: " + this.stream.pos + "<br/>",i += "Length: " + this.header + "+",i += this.length >= 0 ? this.length : -this.length + " (undefined)",32 & this.tag ? i += "<br/>(constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (i += "<br/>(encapsulates)"),null !== s && (i += "<br/>Value:<br/><b>" + s + "</b>","object" == typeof oids && 6 == this.tag)) {var a = oids[s];a && (a.d && (i += "<br/>" + a.d),a.c && (i += "<br/>" + a.c),a.w && (i += "<br/>(warning!)"))}o.innerHTML = i,t.appendChild(o);var c = r.tag("div", "sub");if (null !== this.sub)for (var l = 0, u = this.sub.length; u > l; ++l)c.appendChild(this.sub[l].toDOM());return t.appendChild(c),e.onclick = function() {t.className = "node collapsed" == t.className ? "node" : "node collapsed"},t},i.prototype.posStart = function() {return this.stream.pos},i.prototype.posContent = function() {return this.stream.pos + this.header},i.prototype.posEnd = function() {return this.stream.pos + this.header + Math.abs(this.length)},i.prototype.fakeHover = function(t) {this.node.className += " hover",t && (this.head.className += " hover")},i.prototype.fakeOut = function(t) {var e = / ?hover/;this.node.className = this.node.className.replace(e, ""),t && (this.head.className = this.head.className.replace(e, ""))},i.prototype.toHexDOM_sub = function(t, e, i, s, n) {if (!(s >= n)) {var o = r.tag("span", e);o.appendChild(r.text(i.hexDump(s, n))),t.appendChild(o)}},i.prototype.toHexDOM = function(e) {var i = r.tag("span", "hex");if (e === t && (e = i),this.head.hexNode = i,this.head.onmouseover = function() {this.hexNode.className = "hexCurrent"},this.head.onmouseout = function() {this.hexNode.className = "hex"},i.asn1 = this,i.onmouseover = function() {var t = !e.selected;t && (e.selected = this.asn1,this.className = "hexCurrent"),this.asn1.fakeHover(t)},i.onmouseout = function() {var t = e.selected == this.asn1;this.asn1.fakeOut(t),t && (e.selected = null,this.className = "hex")},this.toHexDOM_sub(i, "tag", this.stream, this.posStart(), this.posStart() + 1),this.toHexDOM_sub(i, this.length >= 0 ? "dlen" : "ulen", this.stream, this.posStart() + 1, this.posContent()),null === this.sub)i.appendChild(r.text(this.stream.hexDump(this.posContent(), this.posEnd())));else if (this.sub.length > 0) {var s = this.sub[0], n = this.sub[this.sub.length - 1];this.toHexDOM_sub(i, "intro", this.stream, this.posContent(), s.posStart());for (var o = 0, a = this.sub.length; a > o; ++o)i.appendChild(this.sub[o].toHexDOM(e));this.toHexDOM_sub(i, "outro", this.stream, n.posEnd(), this.posEnd())}return i},i.prototype.toHexString = function(t) {return this.stream.hexDump(this.posStart(), this.posEnd(), !0)},i.decodeLength = function(t) {var e = t.get(), i = 127 & e;if (i == e)return i;if (i > 3)throw "Length over 24 bits not supported at position " + (t.pos - 1);if (0 === i)return -1;e = 0;for (var s = 0; i > s; ++s)e = e << 8 | t.get();return e},i.hasContent = function(t, s, n) {if (32 & t)return !0;if (3 > t || t > 4)return !1;var r = new e(n);3 == t && r.get();var o = r.get();if (o >> 6 & 1)return !1;try {var a = i.decodeLength(r);return r.pos - n.pos + a == s} catch (t) {return !1}},i.decode = function(t) {t instanceof e || (t = new e(t,0));var s = new e(t), n = t.get(), r = i.decodeLength(t), o = t.pos - s.pos, a = null;if (i.hasContent(n, r, t)) {var c = t.pos;if (3 == n && t.get(),a = [],r >= 0) {for (var l = c + r; t.pos < l; )a[a.length] = i.decode(t);if (t.pos != l)throw "Content size is not correct for container starting at offset " + c} elsetry {for (; ; ) {var u = i.decode(t);if (0 === u.tag)break;a[a.length] = u}r = c - t.pos} catch (t) {throw "Exception while decoding undefined length content: " + t}} elset.pos += r;return new i(s,o,r,n,a)},i.test = function() {for (var t = [{value: [39],expected: 39}, {value: [129, 201],expected: 201}, {value: [131, 254, 220, 186],expected: 16702650}], s = 0, n = t.length; n > s; ++s) {var r = new e(t[s].value,0), o = i.decodeLength(r);o != t[s].expected && document.write("In test[" + s + "] expected " + t[s].expected + " got " + o + "\n")}},window.ASN1 = i}(),ASN1.prototype.getHexStringValue = function() {var t = this.toHexString(), e = 2 * this.header, i = 2 * this.length;return t.substr(e, i)},le.prototype.parseKey = function(t) {try {var e = 0, i = 0, s = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/, n = s.test(t) ? Hex.decode(t) : Base64.unarmor(t), r = ASN1.decode(n);if (3 === r.sub.length && (r = r.sub[2].sub[0]),9 === r.sub.length) {e = r.sub[1].getHexStringValue(),this.n = ae(e, 16),i = r.sub[2].getHexStringValue(),this.e = parseInt(i, 16);var o = r.sub[3].getHexStringValue();this.d = ae(o, 16);var a = r.sub[4].getHexStringValue();this.p = ae(a, 16);var c = r.sub[5].getHexStringValue();this.q = ae(c, 16);var l = r.sub[6].getHexStringValue();this.dmp1 = ae(l, 16);var u = r.sub[7].getHexStringValue();this.dmq1 = ae(u, 16);var p = r.sub[8].getHexStringValue();this.coeff = ae(p, 16)} else {if (2 !== r.sub.length)return !1;var d = r.sub[1], h = d.sub[0];e = h.sub[0].getHexStringValue(),this.n = ae(e, 16),i = h.sub[1].getHexStringValue(),this.e = parseInt(i, 16)}return !0} catch (t) {return !1}},le.prototype.getPrivateBaseKey = function() {var t = {array: [new KJUR.asn1.DERInteger({int: 0}), new KJUR.asn1.DERInteger({bigint: this.n}), new KJUR.asn1.DERInteger({int: this.e}), new KJUR.asn1.DERInteger({bigint: this.d}), new KJUR.asn1.DERInteger({bigint: this.p}), new KJUR.asn1.DERInteger({bigint: this.q}), new KJUR.asn1.DERInteger({bigint: this.dmp1}), new KJUR.asn1.DERInteger({bigint: this.dmq1}), new KJUR.asn1.DERInteger({bigint: this.coeff})]}, e = new KJUR.asn1.DERSequence(t);return e.getEncodedHex()},le.prototype.getPrivateBaseKeyB64 = function() {return be(this.getPrivateBaseKey())},le.prototype.getPublicBaseKey = function() {var t = {array: [new KJUR.asn1.DERObjectIdentifier({oid: "1.2.840.113549.1.1.1"}), new KJUR.asn1.DERNull]}, e = new KJUR.asn1.DERSequence(t);t = {array: [new KJUR.asn1.DERInteger({bigint: this.n}), new KJUR.asn1.DERInteger({int: this.e})]};var i = new KJUR.asn1.DERSequence(t);t = {hex: "00" + i.getEncodedHex()};var s = new KJUR.asn1.DERBitString(t);t = {array: [e, s]};var n = new KJUR.asn1.DERSequence(t);return n.getEncodedHex()},le.prototype.getPublicBaseKeyB64 = function() {return be(this.getPublicBaseKey())},le.prototype.wordwrap = function(t, e) {if (e = e || 64,!t)return t;var i = "(.{1," + e + "})( +|$\n?)|(.{1," + e + "})";return t.match(RegExp(i, "g")).join("\n")},le.prototype.getPrivateKey = function() {var t = "-----BEGIN RSA PRIVATE KEY-----\n";return t += this.wordwrap(this.getPrivateBaseKeyB64()) + "\n",t += "-----END RSA PRIVATE KEY-----"},le.prototype.getPublicKey = function() {var t = "-----BEGIN PUBLIC KEY-----\n";return t += this.wordwrap(this.getPublicBaseKeyB64()) + "\n",t += "-----END PUBLIC KEY-----"},le.prototype.hasPublicKeyProperty = function(t) {return t = t || {},t.hasOwnProperty("n") && t.hasOwnProperty("e")},le.prototype.hasPrivateKeyProperty = function(t) {return t = t || {},t.hasOwnProperty("n") && t.hasOwnProperty("e") && t.hasOwnProperty("d") && t.hasOwnProperty("p") && t.hasOwnProperty("q") && t.hasOwnProperty("dmp1") && t.hasOwnProperty("dmq1") && t.hasOwnProperty("coeff")},le.prototype.parsePropertiesFrom = function(t) {this.n = t.n,this.e = t.e,t.hasOwnProperty("d") && (this.d = t.d,this.p = t.p,this.q = t.q,this.dmp1 = t.dmp1,this.dmq1 = t.dmq1,this.coeff = t.coeff)};var He = function(t) {le.call(this),t && ("string" == typeof t ? this.parseKey(t) : (this.hasPrivateKeyProperty(t) || this.hasPublicKeyProperty(t)) && this.parsePropertiesFrom(t))};He.prototype = new le,He.prototype.constructor = He;var qe = function(t) {t = t || {},this.default_key_size = parseInt(t.default_key_size) || 1024,this.default_public_exponent = t.default_public_exponent || "010001",this.log = t.log || !1,this.key = null};qe.prototype.setKey = function(t) {this.log && this.key && console.warn("A key was already set, overriding existing."),this.key = new He(t)},qe.prototype.setPrivateKey = function(t) {this.setKey(t)},qe.prototype.setPublicKey = function(t) {this.setKey(t)},qe.prototype.decrypt = function(t) {try {return this.getKey().decrypt(ye(t))} catch (t) {return !1}},qe.prototype.encrypt = function(t) {try {return be(this.getKey().encrypt(t))} catch (t) {return !1}},qe.prototype.getKey = function(t) {if (!this.key) {if (this.key = new He,t && "[object Function]" === {}.toString.call(t))return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, t);this.key.generate(this.default_key_size, this.default_public_exponent)}return this.key},qe.prototype.getPrivateKey = function() {return this.getKey().getPrivateKey()},qe.prototype.getPrivateKeyB64 = function() {return this.getKey().getPrivateBaseKeyB64()},qe.prototype.getPublicKey = function() {return this.getKey().getPublicKey()},qe.prototype.getPublicKeyB64 = function() {return this.getKey().getPublicBaseKeyB64()},qe.version = "2.3.1",t.JSEncrypt = qe})}.call(e, i, e, t),!(void 0 !== s && (t.exports = s))},
});// 测试样例
function getPwd(){var pwd = '123456',s = (new Date).getTime(),code_func_3 = code('3');encrypt = new code_func_3return encrypt.encode(pwd, s)
}console.log(getPwd())// python 调用
// function getPwd(password){
//     var pwd = password,
//         s = (new Date).getTime(),
//         code_func_3 = code('3');
//     encrypt = new code_func_3
//     return encrypt.encode(pwd, s)
// }//console.log(getPwd())

password 参数的逆向分析到此为止,python 模拟登录部分代码在此就不予提供了,关于该网站登录中验证码的处理提供三种方式:

  • 该网站验证码混淆不严重可以直接通过 OpenCV 库进行识别
  • 通过验证码图片的接口 verify_image 将验证码保存到本地,然后通过 Image 库打开本地图片并通过 show() 方法展示出来,最后 input 手动输入即可
  • 打码平台

总结

以上是对某妹游戏网登录的逆向分析,以及对 webpack 的改写调用,如有任何见解欢迎评论区或私信指正交流~

【JavaScript 逆向】webpack 之某妹游戏登录逆向相关推荐

  1. 【JS 逆向百例】DOM 事件断点调试,某商盟登录逆向

    文章目录 声明 逆向目标 DOM 简介 逆向过程 完整代码 JavaScript 加密关键代码架构 Python 登录关键代码 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱 ...

  2. 【JS 逆向百例】DOM事件断点调试,某商盟登录逆向

    文章目录 声明 逆向目标 DOM 简介 逆向过程 完整代码 JavaScript 加密关键代码架构 Python 登录关键代码 关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进 ...

  3. PHP游戏扫码登录器源码 支持一百多种热门游戏登录

    介绍: PHP游戏扫码登录器源码 支持一百多种热门游戏登录 里面支持一百多种热门游戏登录,比如王者荣耀,英雄联盟手游,手游CF等等! ! ! 不管是用来运营吸引人气还是后续广告都是不错的程序,另外该源 ...

  4. FPS游戏UE4逆向视频教程

    FPS游戏UE4逆向视频教程 课程成品演示-课程前言 寻找Count(吃鸡模拟器) 寻找世界数组地址里的坐标(吃鸡模拟器) 寻找矩阵(吃鸡模拟器) 易语言编写代码-实现绘制框-(吃鸡模拟器) 易语言编 ...

  5. 2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态头像

    2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程--使用theos tweak 注入hook修改游戏执行代码上传动态头像 开篇 需求&最终效果 环境要求与即将使用的 ...

  6. javascript做游戏_我用JavaScript构建了一个角色扮演游戏。 你也可以 这是如何做。...

    javascript做游戏 by Robert Skalko 罗伯特·斯科尔科(Robert Skalko) 我用JavaScript构建了一个角色扮演游戏. 你也可以 这是如何做. (I built ...

  7. html5+canvas+javascript开发打灰机小游戏

    今天不出太阳,整个人都有点颓废.为了我的大前端计划,不得已找点代码练练手. 打灰机是很早就流行的手机游戏,那时候智能手机还很贵,我还是学生一枚.现在出来工作了,发现别人写的打灰机游戏,然后游戏逻辑很差 ...

  8. 【android逆向笔记】(一)简单登录逆向

    简单的登录逆向 因为是简单的学习过程,所以这里直接进行逆向,就不进行android代码的演示了.apk是直接借用了被人写好的app来进行学习的. ###(1)使用APK改之理对apk进行编译. ### ...

  9. JavaScript队列结构——击鼓传花游戏

    JavaScript队列结构--击鼓传花游戏 //队列类 function Queue(){this.items = []//将元素添加到队列中Queue.prototype.enqueue = fu ...

  10. 枪火游侠显示无法连接服务器,枪火游侠游戏登录不了怎么解决 枪火游侠为什么进不去游戏...

    导 读 枪火游侠为什么进不去游戏,很多玩家都反应登录不了游戏,这是怎么回事呢?是安装问题还是其他问题呢?为此九游小编为大家带来枪火游侠游戏登录问题解决方法,一起来看看吧! 1.下载问题 通常来说如果遇 ...

最新文章

  1. EasyPR--开发详解(8)文字定位
  2. imageView的contentMode
  3. 【NLP】10000亿参数!英伟达用3072块A100训出史上最大最贵GPT!
  4. [李景山php]每天TP5-20170111|thinkphp5-Model.php-4
  5. MYSQL数据库时间字段INT,TIMESTAMP,DATETIME性能效率比较
  6. 网络多人游戏架构与编程 电子书_Java互联网架构-高性能网络编程必备技能IO与NIO阻塞分析...
  7. 软件工程概论---典型用户和用户场景描述
  8. angular 模块构建_如何通过11个简单的步骤从头开始构建Angular 8应用
  9. IOS UI Automation 学习之常用类,方法和模拟手势
  10. 4x root 红米_好激动,红米NOTE4X开发版成功获得完全ROOT教程,非假ROOT!!
  11. 原子性、有序性和可见性解释
  12. 漫画:唐玄奘教你横扫 AVL 树面试题无敌手!
  13. 手工增加widcomm对蓝牙USB dongle的识别
  14. 微信JS SDK网页接口
  15. centos7zabbix-agen安装
  16. 集成Ueditor秀米
  17. 视频教程-Linux基础入门视频课程-Linux
  18. filezilla提示 local: unable to open
  19. 用python画画简单代码_Python3使用PyQt5制作简单的画板/手写板实例
  20. maven设置阿里仓库

热门文章

  1. 【第1128期】从北京回来的年轻人,该告诉你点什么?
  2. 纯CSS3实现360度旋转特效
  3. 华东理工大学计算机考研资料汇总
  4. beta 值和 M 值: 衡量样本甲基化水平的金标准
  5. diy高性能存储服务器,存储服务器 diy
  6. 【最优化导论】一维搜索方法
  7. 压力测试~一套完整的压力测试项目文档
  8. c 语言条件运算符,C 语言条件运算符详细讲解
  9. 一图秒懂!“天使投资、VC、PE、A轮、B轮、C轮融资”的关系
  10. 干货分享:手游运营活动如何提升收入