当前位置: 首页 > news >正文

逆向爬虫——JavaScript混淆技术

学习目标:

  1. 了解 混淆的作用
  2. 了解 ob混淆的方式
  3. 了解 如何将代码进行混淆
  4. 熟悉 解析混淆网站的过程

一、混淆简介

1.为什么要进行混淆?


网页的逻辑通常依赖 JavaScript 实现,而 JavaScript 具有以下特点:

  • JavaScript 代码运行于客户端,必须在用户浏览器中加载并执行。

  • JavaScript 代码对用户是可见的,浏览器能够直接获取并查看正在运行的 JavaScript 源码。

2.压缩、混淆与加密技术


为增强代码安全性,常采用以下三种技术手段:

  • 代码压缩:移除 JavaScript 代码中不必要的空格、换行等内容,将源码压缩为少量行,以降低可读性,同时提升网站加载速度。

  • 代码混淆:通过变量替换、字符串阵列化、控制流平坦化、多态变异、僵尸函数、调试保护等方法,使代码难以阅读和分析,从而实现有效保护。这种方式不影响代码原有功能,是一种理想且实用的 JavaScript 保护方案。

  • 代码加密:采用更高级的手段对 JavaScript 代码进行加密,将其转换为难以阅读或解析的形式,例如 eval 加密。此外,还有更强大的加密技术,如通过 Emscripten 或 WebAssembly 将 JavaScript 核心功能用 C/C++ 实现,并编译成二进制文件,由 JavaScript 调用执行。

二、ob混淆

OB 混淆全称 Obfuscator , Obfuscator 其实就是混淆的意思,官网:https://obfuscator.io/,其作者是一位叫 Timofey Kachalov 的俄罗斯 JavaScript 开发工程师,早在2016年就发布了第一个版本。

1.ob混淆的特点

1.一般由一个大数组或者含有大数组的函数、一个自执行函数、解密函数和加密后的函数四部分组成;

2.函数名和变量名通常以 _0x 或者 0x 开头,后接 1~6 位数字或者字母组合;

3.自执行函数,进行移位操作,有明显的 push、shift关键字;

混淆之前的代码

source codefunction hi() {console.log("Hello World!");
}hi();

混淆之后的代码

var _0x3ed0 = ['1241023ikpdYM', 'Hello\x20World!', '291190xIUkft', '1251274vQVPdI', '124952hgHyOi', '1983KQSSIW', '247DipWFn', '7354VgseoG', '49680CQWPxl', '1ZTWTUo', '648lISKkF'];function _0x4ed9(_0x475ec5, _0x372034) {return _0x4ed9 = function (_0x3ed0df, _0x4ed9c4) {_0x3ed0df = _0x3ed0df - 0x96;var _0x5a22f3 = _0x3ed0[_0x3ed0df];return _0x5a22f3;}, _0x4ed9(_0x475ec5, _0x372034);
}(function (_0xa942b4, _0x57410c) {var _0x4e4980 = _0x4ed9;while (!![]) {try {var _0x1e86fa = parseInt(_0x4e4980(0x9b)) + parseInt(_0x4e4980(0x9e)) + -parseInt(_0x4e4980(0x97)) + -parseInt(_0x4e4980(0x9c)) * -parseInt(_0x4e4980(0xa0)) + -parseInt(_0x4e4980(0x98)) * parseInt(_0x4e4980(0x9d)) + -parseInt(_0x4e4980(0x96)) + parseInt(_0x4e4980(0x99)) * parseInt(_0x4e4980(0x9a));if (_0x1e86fa === _0x57410c) break; else _0xa942b4['push'](_0xa942b4['shift']());} catch (_0x178fbf) {_0xa942b4['push'](_0xa942b4['shift']());}}
})(_0x3ed0, 0xb3f61);function hi() {var _0x81b55a = _0x4ed9;console['log'](_0x81b55a(0x9f));
}hi();

2.ob混淆结构

JavaScript Obfuscator 的混淆结构通常包含以下几个关键部分,不同项目或版本可能略有差异,但整体可归纳如下:


1. 初始加密数组

混淆后的代码通常以一个或多个加密数组开头,这些数组存储了经过编码的字符串、函数名或其他关键数据。数组本身可能被进一步混淆(如拆分、嵌套或编码),使其不易被直接识别。数组的位置不一定在代码开头,也可能被隐藏在其他逻辑中。


2. 数组重组与解码逻辑

混淆器通常会通过一系列函数对初始数组进行重组或解码(例如元素顺序重排、映射变换、解密函数等)。这些函数可能是立即执行的(IIFE)或延迟执行的,且可能涉及复杂的操作(如位运算、哈希计算等)。注意: 此类代码格式化或修改可能导致内存泄漏或执行异常,建议谨慎处理。


3. 自解密机制与反调试

部分混淆代码包含自解密逻辑,可能在运行时动态解密关键函数或数据。此类机制常与反调试措施(如 debugger 语句、定时器检测、控制流陷阱)结合,干扰分析工具的动态调试。解密函数可能延迟执行或分段触发,增加分析难度。


4. 真实逻辑与控制流平坦化

核心业务逻辑通常被控制流平坦化(Control Flow Flattening)技术打散,即通过一个状态机或调度器分散原始代码的执行流程。真实代码块被拆分为多个片段,并通过开关(switch-case)或跳转表动态调度。这是混淆的核心防御层,需重点分析。


5. 垃圾代码与冗余结构

混淆代码中常注入大量无用的代码块(死代码、冗余循环、虚假条件判断等),目的是掩盖真实逻辑。此类代码通常不影响业务功能,但可能包含反调试(如无限 debugger)或环境检测(如浏览器特性检查)。删除时需谨慎,避免误删真实逻辑。


注意:
  • 上述结构不一定按固定顺序出现,例如数组定义可能被嵌入到函数内部,解密逻辑可能早于数组初始化。

  • 不同版本的 Obfuscator 或自定义配置可能导致结构差异,需具体问题具体分析。

  • 建议结合静态分析(如 AST 解析)与动态调试(浏览器 DevTools 条件断点)逐步还原代码逻辑。

三、ob混淆介绍

JavaScript 混淆是一种通过对代码进行变形和加密,使其难以被阅读与分析,从而保护知识产权和逻辑机密的技术手段。其主要混淆方式包括以下几类:


1.核心数据混淆

  1. 变量/函数名混淆
    将有意义标识符(变量、函数、常量)替换为无意义的短名称(如 _0x1a2bab),大幅降低代码可读性。

  2. 字符串加密与阵列化
    将明文字符串进行编码(Base64、Hex、MD5 等)或拆分为数组元素,使用时动态解密,防止通过字符串搜索快速定位关键逻辑。

  3. 属性名加密
    对对象属性名进行转换或哈希处理,隐藏属性访问关系,增加代码跟踪难度。


2.结构与逻辑混淆

  1. 控制流平坦化
    将原有线性或分支代码逻辑拆分为多个基本块,并通过中央调度器(如 switch-case 结构)控制执行流程,使代码执行顺序混乱无序。

  2. 僵尸代码注入
    插入无效代码、冗余逻辑或永不执行的条件分支,干扰分析人员阅读与自动化分析工具。

  3. 多态变异技术
    每次代码执行时自动重构自身(如更改变量名、调整语句顺序),实现功能不变而形态变化,避免被动态调试捕捉固定模式。


3.执行环境检测与防护

  1. 反调试机制
    检测开发者工具环境,触发 debugger 语句或异常逻辑,阻碍调试过程。可能结合定时器、控制台检查等方式增强对抗。

  2. 域名锁定
    验证当前运行域名,若非指定域名则阻止执行,防止代码被非法迁移或滥用。

  3. 反格式化对抗
    检测代码是否被格式化(如通过函数名或栈特征),触发异常执行流程(如死循环),导致浏览器假死或逻辑失效。


4.高级编码与动态保护

  1. 特殊编码转换
    将代码转换为非常规形式(如 Unicode 转义序列、表情符号、自定义编码),使得人工阅读几乎不可行。

  2. 动态解密与实时执行
    关键代码段在运行时动态解密并执行(如通过 eval 或 Function 构造函数),避免以明文形式出现在静态代码中。


总结:

JavaScript 混淆技术从数据隐藏结构变形环境检测动态行为多个层面构建保护体系。实际应用中常组合多种方式,形成深度防御。但需注意,混淆可能影响代码性能与可维护性,需根据安全需求与执行环境权衡使用。

四、实现ob混淆

安装ob混淆库

npm install javascript-obfuscator -g

安装完成后,javascript-obfuscator 就是一个独立的可执行命令了。

代码压缩

这里 javascript-obfuscator 也提供了代码压缩的功能,使用其参数 compact 即可完成 JavaScript 代码的压缩,输出为一行内容。默认是ture,如果定义为false,则混淆后的代码会分行显示。

const JavaScriptObfuscator = require('javascript-obfuscator');const sourceCode = `function myFunction() {var myVariable = 'Hello, World!';console.log(myVariable);}myFunction();`;const options = {compact: true, // 启用压缩controlFlowFlattening: true, // 控制流 平坦化controlFlowFlatteningThreshold: 0.75, // 控制流平坦化阈值deadCodeInjection: true, // 使死代码注入deadCodeInjectionThreshold: 0.4, // 死代码注入阈值identifierNamesGenerator: 'hexadecimal', // 生成标识符的方式log: false, // 关闭日志rotateStringArray: true, // 旋转字符串数组selfDefending: true, // 启用自我防御stringArray: true, // 启用字符串数组stringArrayThreshold: 0.75, // 字符串数组阈值// domainLock: ['example.com'], // 锁定域名debugProtection: true, // 调试保护disableConsoleOutput: true, // 禁用控制台输出unicodeEscapeSequence: false, // 禁用 Unicode 转义序列rotateUnicodeArray: true, // 旋转 Unicode 数组};const obfuscatedCode = JavaScriptObfuscator.obfuscate(sourceCode, options).getObfuscatedCode();console.log(obfuscatedCode);

五、案例

案例一

1.逆向目标

网址:https://hangzhou.qccqcc.com/

接口:https://newopenapiweb.17qcc.com/api/services/app/SearchFactory/GetPageList

加密参数:

2.逆向分析

xhr进行定位:

加密的请求载荷的核心代码的定位:

hook定位:

var my_parse = JSON.parse;JSON.parse = function (params) {//这里可以添加其他逻辑比如 debuggerdebugger;console.log("json_parse params:",params);return my_parse(params);};

解密响应数据的核心代码的定位:

3.代码实现

javascript代码:

var CryptoJS = require('crypto-js')
var JSEncrypt = require('jsencrypt')window = global;navigator = {appName: "Netscape"
}var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64pad = "=";function hex2b64(d) {var b;var e;var a = "";for (b = 0; b + 3 <= d.length; b += 3) {e = parseInt(d.substring(b, b + 3), 16);a += b64map.charAt(e >> 6) + b64map.charAt(e & 63)}if (b + 1 == d.length) {e = parseInt(d.substring(b, b + 1), 16);a += b64map.charAt(e << 2)} else {if (b + 2 == d.length) {e = parseInt(d.substring(b, b + 2), 16);a += b64map.charAt(e >> 2) + b64map.charAt((e & 3) << 4)}}if (b64pad) {while ((a.length & 3) > 0) {a += b64pad}}return a
}function b64tohex(f) {var d = "";var e;var b = 0;var c;var a;for (e = 0; e < f.length; ++e) {if (f.charAt(e) == b64pad) {break}a = b64map.indexOf(f.charAt(e));if (a < 0) {continue}if (b == 0) {d += int2char(a >> 2);c = a & 3;b = 1} else {if (b == 1) {d += int2char((c << 2) | (a >> 4));c = a & 15;b = 2} else {if (b == 2) {d += int2char(c);d += int2char(a >> 2);c = a & 3;b = 3} else {d += int2char((c << 2) | (a >> 4));d += int2char(a & 15);b = 0}}}}if (b == 1) {d += int2char(c << 2)}return d
}function b64toBA(e) {var d = b64tohex(e);var c;var b = new Array();for (c = 0; 2 * c < d.length; ++c) {b[c] = parseInt(d.substring(2 * c, 2 * c + 2), 16)}return b
}
;var dbits;
var canary = 244837814094590;
var j_lm = ((canary & 16777215) == 15715070);function BigInteger(e, d, f) {if (e != null) {if ("number" == typeof e) {this.fromNumber(e, d, f)} else {if (d == null && "string" != typeof e) {this.fromString(e, 256)} else {this.fromString(e, d)}}}
}function nbi() {return new BigInteger(null)
}function am1(f, a, b, e, h, g) {while (--g >= 0) {var d = a * this[f++] + b[e] + h;h = Math.floor(d / 67108864);b[e++] = d & 67108863}return h
}function am2(f, q, r, e, o, a) {var k = q & 32767, p = q >> 15;while (--a >= 0) {var d = this[f] & 32767;var g = this[f++] >> 15;var b = p * d + g * k;d = k * d + ((b & 32767) << 15) + r[e] + (o & 1073741823);o = (d >>> 30) + (b >>> 15) + p * g + (o >>> 30);r[e++] = d & 1073741823}return o
}function am3(f, q, r, e, o, a) {var k = q & 16383, p = q >> 14;while (--a >= 0) {var d = this[f] & 16383;var g = this[f++] >> 14;var b = p * d + g * k;d = k * d + ((b & 16383) << 14) + r[e] + o;o = (d >> 28) + (b >> 14) + p * g;r[e++] = d & 268435455}return o
}if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) {BigInteger.prototype.am = am2;dbits = 30
} else {if (j_lm && (navigator.appName != "Netscape")) {BigInteger.prototype.am = am1;dbits = 26} else {BigInteger.prototype.am = am3;dbits = 28}
}
BigInteger.prototype.DB = dbits;
BigInteger.prototype.DM = ((1 << dbits) - 1);
BigInteger.prototype.DV = (1 << dbits);
var BI_FP = 52;
BigInteger.prototype.FV = Math.pow(2, BI_FP);
BigInteger.prototype.F1 = BI_FP - dbits;
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC = new Array();
var rr, vv;
rr = "0".charCodeAt(0);
for (vv = 0; vv <= 9; ++vv) {BI_RC[rr++] = vv
}
rr = "a".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) {BI_RC[rr++] = vv
}
rr = "A".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) {BI_RC[rr++] = vv
}function int2char(a) {return BI_RM.charAt(a)
}function intAt(b, a) {var d = BI_RC[b.charCodeAt(a)];return (d == null) ? -1 : d
}function bnpCopyTo(b) {for (var a = this.t - 1; a >= 0; --a) {b[a] = this[a]}b.t = this.t;b.s = this.s
}function bnpFromInt(a) {this.t = 1;this.s = (a < 0) ? -1 : 0;if (a > 0) {this[0] = a} else {if (a < -1) {this[0] = a + this.DV} else {this.t = 0}}
}function nbv(a) {var b = nbi();b.fromInt(a);return b
}function bnpFromString(h, c) {var e;if (c == 16) {e = 4} else {if (c == 8) {e = 3} else {if (c == 256) {e = 8} else {if (c == 2) {e = 1} else {if (c == 32) {e = 5} else {if (c == 4) {e = 2} else {this.fromRadix(h, c);return}}}}}}this.t = 0;this.s = 0;var g = h.length, d = false, f = 0;while (--g >= 0) {var a = (e == 8) ? h[g] & 255 : intAt(h, g);if (a < 0) {if (h.charAt(g) == "-") {d = true}continue}d = false;if (f == 0) {this[this.t++] = a} else {if (f + e > this.DB) {this[this.t - 1] |= (a & ((1 << (this.DB - f)) - 1)) << f;this[this.t++] = (a >> (this.DB - f))} else {this[this.t - 1] |= a << f}}f += e;if (f >= this.DB) {f -= this.DB}}if (e == 8 && (h[0] & 128) != 0) {this.s = -1;if (f > 0) {this[this.t - 1] |= ((1 << (this.DB - f)) - 1) << f}}this.clamp();if (d) {BigInteger.ZERO.subTo(this, this)}
}function bnpClamp() {var a = this.s & this.DM;while (this.t > 0 && this[this.t - 1] == a) {--this.t}
}function bnToString(c) {if (this.s < 0) {return "-" + this.negate().toString(c)}var e;if (c == 16) {e = 4} else {if (c == 8) {e = 3} else {if (c == 2) {e = 1} else {if (c == 32) {e = 5} else {if (c == 4) {e = 2} else {return this.toRadix(c)}}}}}var g = (1 << e) - 1, l, a = false, h = "", f = this.t;var j = this.DB - (f * this.DB) % e;if (f-- > 0) {if (j < this.DB && (l = this[f] >> j) > 0) {a = true;h = int2char(l)}while (f >= 0) {if (j < e) {l = (this[f] & ((1 << j) - 1)) << (e - j);l |= this[--f] >> (j += this.DB - e)} else {l = (this[f] >> (j -= e)) & g;if (j <= 0) {j += this.DB;--f}}if (l > 0) {a = true}if (a) {h += int2char(l)}}}return a ? h : "0"
}function bnNegate() {var a = nbi();BigInteger.ZERO.subTo(this, a);return a
}function bnAbs() {return (this.s < 0) ? this.negate() : this
}function bnCompareTo(b) {var d = this.s - b.s;if (d != 0) {return d}var c = this.t;d = c - b.t;if (d != 0) {return (this.s < 0) ? -d : d}while (--c >= 0) {if ((d = this[c] - b[c]) != 0) {return d}}return 0
}function nbits(a) {var c = 1, b;if ((b = a >>> 16) != 0) {a = b;c += 16}if ((b = a >> 8) != 0) {a = b;c += 8}if ((b = a >> 4) != 0) {a = b;c += 4}if ((b = a >> 2) != 0) {a = b;c += 2}if ((b = a >> 1) != 0) {a = b;c += 1}return c
}function bnBitLength() {if (this.t <= 0) {return 0}return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM))
}function bnpDLShiftTo(c, b) {var a;for (a = this.t - 1; a >= 0; --a) {b[a + c] = this[a]}for (a = c - 1; a >= 0; --a) {b[a] = 0}b.t = this.t + c;b.s = this.s
}function bnpDRShiftTo(c, b) {for (var a = c; a < this.t; ++a) {b[a - c] = this[a]}b.t = Math.max(this.t - c, 0);b.s = this.s
}function bnpLShiftTo(j, e) {var b = j % this.DB;var a = this.DB - b;var g = (1 << a) - 1;var f = Math.floor(j / this.DB), h = (this.s << b) & this.DM, d;for (d = this.t - 1; d >= 0; --d) {e[d + f + 1] = (this[d] >> a) | h;h = (this[d] & g) << b}for (d = f - 1; d >= 0; --d) {e[d] = 0}e[f] = h;e.t = this.t + f + 1;e.s = this.s;e.clamp()
}function bnpRShiftTo(g, d) {d.s = this.s;var e = Math.floor(g / this.DB);if (e >= this.t) {d.t = 0;return}var b = g % this.DB;var a = this.DB - b;var f = (1 << b) - 1;d[0] = this[e] >> b;for (var c = e + 1; c < this.t; ++c) {d[c - e - 1] |= (this[c] & f) << a;d[c - e] = this[c] >> b}if (b > 0) {d[this.t - e - 1] |= (this.s & f) << a}d.t = this.t - e;d.clamp()
}function bnpSubTo(d, f) {var e = 0, g = 0, b = Math.min(d.t, this.t);while (e < b) {g += this[e] - d[e];f[e++] = g & this.DM;g >>= this.DB}if (d.t < this.t) {g -= d.s;while (e < this.t) {g += this[e];f[e++] = g & this.DM;g >>= this.DB}g += this.s} else {g += this.s;while (e < d.t) {g -= d[e];f[e++] = g & this.DM;g >>= this.DB}g -= d.s}f.s = (g < 0) ? -1 : 0;if (g < -1) {f[e++] = this.DV + g} else {if (g > 0) {f[e++] = g}}f.t = e;f.clamp()
}function bnpMultiplyTo(c, e) {var b = this.abs(), f = c.abs();var d = b.t;e.t = d + f.t;while (--d >= 0) {e[d] = 0}for (d = 0; d < f.t; ++d) {e[d + b.t] = b.am(0, f[d], e, d, 0, b.t)}e.s = 0;e.clamp();if (this.s != c.s) {BigInteger.ZERO.subTo(e, e)}
}function bnpSquareTo(d) {var a = this.abs();var b = d.t = 2 * a.t;while (--b >= 0) {d[b] = 0}for (b = 0; b < a.t - 1; ++b) {var e = a.am(b, a[b], d, 2 * b, 0, 1);if ((d[b + a.t] += a.am(b + 1, 2 * a[b], d, 2 * b + 1, e, a.t - b - 1)) >= a.DV) {d[b + a.t] -= a.DV;d[b + a.t + 1] = 1}}if (d.t > 0) {d[d.t - 1] += a.am(b, a[b], d, 2 * b, 0, 1)}d.s = 0;d.clamp()
}function bnpDivRemTo(n, h, g) {var w = n.abs();if (w.t <= 0) {return}var k = this.abs();if (k.t < w.t) {if (h != null) {h.fromInt(0)}if (g != null) {this.copyTo(g)}return}if (g == null) {g = nbi()}var d = nbi(), a = this.s, l = n.s;var v = this.DB - nbits(w[w.t - 1]);if (v > 0) {w.lShiftTo(v, d);k.lShiftTo(v, g)} else {w.copyTo(d);k.copyTo(g)}var p = d.t;var b = d[p - 1];if (b == 0) {return}var o = b * (1 << this.F1) + ((p > 1) ? d[p - 2] >> this.F2 : 0);var A = this.FV / o, z = (1 << this.F1) / o, x = 1 << this.F2;var u = g.t, s = u - p, f = (h == null) ? nbi() : h;d.dlShiftTo(s, f);if (g.compareTo(f) >= 0) {g[g.t++] = 1;g.subTo(f, g)}BigInteger.ONE.dlShiftTo(p, f);f.subTo(d, d);while (d.t < p) {d[d.t++] = 0}while (--s >= 0) {var c = (g[--u] == b) ? this.DM : Math.floor(g[u] * A + (g[u - 1] + x) * z);if ((g[u] += d.am(0, c, g, s, 0, p)) < c) {d.dlShiftTo(s, f);g.subTo(f, g);while (g[u] < --c) {g.subTo(f, g)}}}if (h != null) {g.drShiftTo(p, h);if (a != l) {BigInteger.ZERO.subTo(h, h)}}g.t = p;g.clamp();if (v > 0) {g.rShiftTo(v, g)}if (a < 0) {BigInteger.ZERO.subTo(g, g)}
}function bnMod(b) {var c = nbi();this.abs().divRemTo(b, null, c);if (this.s < 0 && c.compareTo(BigInteger.ZERO) > 0) {b.subTo(c, c)}return c
}function Classic(a) {this.m = a
}function cConvert(a) {if (a.s < 0 || a.compareTo(this.m) >= 0) {return a.mod(this.m)} else {return a}
}function cRevert(a) {return a
}function cReduce(a) {a.divRemTo(this.m, null, a)
}function cMulTo(a, c, b) {a.multiplyTo(c, b);this.reduce(b)
}function cSqrTo(a, b) {a.squareTo(b);this.reduce(b)
}Classic.prototype.convert = cConvert;
Classic.prototype.revert = cRevert;
Classic.prototype.reduce = cReduce;
Classic.prototype.mulTo = cMulTo;
Classic.prototype.sqrTo = cSqrTo;function bnpInvDigit() {if (this.t < 1) {return 0}var a = this[0];if ((a & 1) == 0) {return 0}var b = a & 3;b = (b * (2 - (a & 15) * b)) & 15;b = (b * (2 - (a & 255) * b)) & 255;b = (b * (2 - (((a & 65535) * b) & 65535))) & 65535;b = (b * (2 - a * b % this.DV)) % this.DV;return (b > 0) ? this.DV - b : -b
}function Montgomery(a) {this.m = a;this.mp = a.invDigit();this.mpl = this.mp & 32767;this.mph = this.mp >> 15;this.um = (1 << (a.DB - 15)) - 1;this.mt2 = 2 * a.t
}function montConvert(a) {var b = nbi();a.abs().dlShiftTo(this.m.t, b);b.divRemTo(this.m, null, b);if (a.s < 0 && b.compareTo(BigInteger.ZERO) > 0) {this.m.subTo(b, b)}return b
}function montRevert(a) {var b = nbi();a.copyTo(b);this.reduce(b);return b
}function montReduce(a) {while (a.t <= this.mt2) {a[a.t++] = 0}for (var c = 0; c < this.m.t; ++c) {var b = a[c] & 32767;var d = (b * this.mpl + (((b * this.mph + (a[c] >> 15) * this.mpl) & this.um) << 15)) & a.DM;b = c + this.m.t;a[b] += this.m.am(0, d, a, c, 0, this.m.t);while (a[b] >= a.DV) {a[b] -= a.DV;a[++b]++}}a.clamp();a.drShiftTo(this.m.t, a);if (a.compareTo(this.m) >= 0) {a.subTo(this.m, a)}
}function montSqrTo(a, b) {a.squareTo(b);this.reduce(b)
}function montMulTo(a, c, b) {a.multiplyTo(c, b);this.reduce(b)
}Montgomery.prototype.convert = montConvert;
Montgomery.prototype.revert = montRevert;
Montgomery.prototype.reduce = montReduce;
Montgomery.prototype.mulTo = montMulTo;
Montgomery.prototype.sqrTo = montSqrTo;function bnpIsEven() {return ((this.t > 0) ? (this[0] & 1) : this.s) == 0
}function bnpExp(h, j) {if (h > 4294967295 || h < 1) {return BigInteger.ONE}var f = nbi(), a = nbi(), d = j.convert(this), c = nbits(h) - 1;d.copyTo(f);while (--c >= 0) {j.sqrTo(f, a);if ((h & (1 << c)) > 0) {j.mulTo(a, d, f)} else {var b = f;f = a;a = b}}return j.revert(f)
}function bnModPowInt(b, a) {var c;if (b < 256 || a.isEven()) {c = new Classic(a)} else {c = new Montgomery(a)}return this.exp(b, c)
}BigInteger.prototype.copyTo = bnpCopyTo;
BigInteger.prototype.fromInt = bnpFromInt;
BigInteger.prototype.fromString = bnpFromString;
BigInteger.prototype.clamp = bnpClamp;
BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
BigInteger.prototype.drShiftTo = bnpDRShiftTo;
BigInteger.prototype.lShiftTo = bnpLShiftTo;
BigInteger.prototype.rShiftTo = bnpRShiftTo;
BigInteger.prototype.subTo = bnpSubTo;
BigInteger.prototype.multiplyTo = bnpMultiplyTo;
BigInteger.prototype.squareTo = bnpSquareTo;
BigInteger.prototype.divRemTo = bnpDivRemTo;
BigInteger.prototype.invDigit = bnpInvDigit;
BigInteger.prototype.isEven = bnpIsEven;
BigInteger.prototype.exp = bnpExp;
BigInteger.prototype.toString = bnToString;
BigInteger.prototype.negate = bnNegate;
BigInteger.prototype.abs = bnAbs;
BigInteger.prototype.compareTo = bnCompareTo;
BigInteger.prototype.bitLength = bnBitLength;
BigInteger.prototype.mod = bnMod;
BigInteger.prototype.modPowInt = bnModPowInt;
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);function bnClone() {var a = nbi();this.copyTo(a);return a
}function bnIntValue() {if (this.s < 0) {if (this.t == 1) {return this[0] - this.DV} else {if (this.t == 0) {return -1}}} else {if (this.t == 1) {return this[0]} else {if (this.t == 0) {return 0}}}return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]
}function bnByteValue() {return (this.t == 0) ? this.s : (this[0] << 24) >> 24
}function bnShortValue() {return (this.t == 0) ? this.s : (this[0] << 16) >> 16
}function bnpChunkSize(a) {return Math.floor(Math.LN2 * this.DB / Math.log(a))
}function bnSigNum() {if (this.s < 0) {return -1} else {if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {return 0} else {return 1}}
}function bnpToRadix(c) {if (c == null) {c = 10}if (this.signum() == 0 || c < 2 || c > 36) {return "0"}var f = this.chunkSize(c);var e = Math.pow(c, f);var i = nbv(e), j = nbi(), h = nbi(), g = "";this.divRemTo(i, j, h);while (j.signum() > 0) {g = (e + h.intValue()).toString(c).substr(1) + g;j.divRemTo(i, j, h)}return h.intValue().toString(c) + g
}function bnpFromRadix(m, h) {this.fromInt(0);if (h == null) {h = 10}var f = this.chunkSize(h);var g = Math.pow(h, f), e = false, a = 0, l = 0;for (var c = 0; c < m.length; ++c) {var k = intAt(m, c);if (k < 0) {if (m.charAt(c) == "-" && this.signum() == 0) {e = true}continue}l = h * l + k;if (++a >= f) {this.dMultiply(g);this.dAddOffset(l, 0);a = 0;l = 0}}if (a > 0) {this.dMultiply(Math.pow(h, a));this.dAddOffset(l, 0)}if (e) {BigInteger.ZERO.subTo(this, this)}
}function bnpFromNumber(f, e, h) {if ("number" == typeof e) {if (f < 2) {this.fromInt(1)} else {this.fromNumber(f, h);if (!this.testBit(f - 1)) {this.bitwiseTo(BigInteger.ONE.shiftLeft(f - 1), op_or, this)}if (this.isEven()) {this.dAddOffset(1, 0)}while (!this.isProbablePrime(e)) {this.dAddOffset(2, 0);if (this.bitLength() > f) {this.subTo(BigInteger.ONE.shiftLeft(f - 1), this)}}}} else {var d = new Array(), g = f & 7;d.length = (f >> 3) + 1;e.nextBytes(d);if (g > 0) {d[0] &= ((1 << g) - 1)} else {d[0] = 0}this.fromString(d, 256)}
}function bnToByteArray() {var b = this.t, c = new Array();c[0] = this.s;var e = this.DB - (b * this.DB) % 8, f, a = 0;if (b-- > 0) {if (e < this.DB && (f = this[b] >> e) != (this.s & this.DM) >> e) {c[a++] = f | (this.s << (this.DB - e))}while (b >= 0) {if (e < 8) {f = (this[b] & ((1 << e) - 1)) << (8 - e);f |= this[--b] >> (e += this.DB - 8)} else {f = (this[b] >> (e -= 8)) & 255;if (e <= 0) {e += this.DB;--b}}if ((f & 128) != 0) {f |= -256}if (a == 0 && (this.s & 128) != (f & 128)) {++a}if (a > 0 || f != this.s) {c[a++] = f}}}return c
}function bnEquals(b) {return (this.compareTo(b) == 0)
}function bnMin(b) {return (this.compareTo(b) < 0) ? this : b
}function bnMax(b) {return (this.compareTo(b) > 0) ? this : b
}function bnpBitwiseTo(c, h, e) {var d, g, b = Math.min(c.t, this.t);for (d = 0; d < b; ++d) {e[d] = h(this[d], c[d])}if (c.t < this.t) {g = c.s & this.DM;for (d = b; d < this.t; ++d) {e[d] = h(this[d], g)}e.t = this.t} else {g = this.s & this.DM;for (d = b; d < c.t; ++d) {e[d] = h(g, c[d])}e.t = c.t}e.s = h(this.s, c.s);e.clamp()
}function op_and(a, b) {return a & b
}function bnAnd(b) {var c = nbi();this.bitwiseTo(b, op_and, c);return c
}function op_or(a, b) {return a | b
}function bnOr(b) {var c = nbi();this.bitwiseTo(b, op_or, c);return c
}function op_xor(a, b) {return a ^ b
}function bnXor(b) {var c = nbi();this.bitwiseTo(b, op_xor, c);return c
}function op_andnot(a, b) {return a & ~b
}function bnAndNot(b) {var c = nbi();this.bitwiseTo(b, op_andnot, c);return c
}function bnNot() {var b = nbi();for (var a = 0; a < this.t; ++a) {b[a] = this.DM & ~this[a]}b.t = this.t;b.s = ~this.s;return b
}function bnShiftLeft(b) {var a = nbi();if (b < 0) {this.rShiftTo(-b, a)} else {this.lShiftTo(b, a)}return a
}function bnShiftRight(b) {var a = nbi();if (b < 0) {this.lShiftTo(-b, a)} else {this.rShiftTo(b, a)}return a
}function lbit(a) {if (a == 0) {return -1}var b = 0;if ((a & 65535) == 0) {a >>= 16;b += 16}if ((a & 255) == 0) {a >>= 8;b += 8}if ((a & 15) == 0) {a >>= 4;b += 4}if ((a & 3) == 0) {a >>= 2;b += 2}if ((a & 1) == 0) {++b}return b
}function bnGetLowestSetBit() {for (var a = 0; a < this.t; ++a) {if (this[a] != 0) {return a * this.DB + lbit(this[a])}}if (this.s < 0) {return this.t * this.DB}return -1
}function cbit(a) {var b = 0;while (a != 0) {a &= a - 1;++b}return b
}function bnBitCount() {var c = 0, a = this.s & this.DM;for (var b = 0; b < this.t; ++b) {c += cbit(this[b] ^ a)}return c
}function bnTestBit(b) {var a = Math.floor(b / this.DB);if (a >= this.t) {return (this.s != 0)}return ((this[a] & (1 << (b % this.DB))) != 0)
}function bnpChangeBit(c, b) {var a = BigInteger.ONE.shiftLeft(c);this.bitwiseTo(a, b, a);return a
}function bnSetBit(a) {return this.changeBit(a, op_or)
}function bnClearBit(a) {return this.changeBit(a, op_andnot)
}function bnFlipBit(a) {return this.changeBit(a, op_xor)
}function bnpAddTo(d, f) {var e = 0, g = 0, b = Math.min(d.t, this.t);while (e < b) {g += this[e] + d[e];f[e++] = g & this.DM;g >>= this.DB}if (d.t < this.t) {g += d.s;while (e < this.t) {g += this[e];f[e++] = g & this.DM;g >>= this.DB}g += this.s} else {g += this.s;while (e < d.t) {g += d[e];f[e++] = g & this.DM;g >>= this.DB}g += d.s}f.s = (g < 0) ? -1 : 0;if (g > 0) {f[e++] = g} else {if (g < -1) {f[e++] = this.DV + g}}f.t = e;f.clamp()
}function bnAdd(b) {var c = nbi();this.addTo(b, c);return c
}function bnSubtract(b) {var c = nbi();this.subTo(b, c);return c
}function bnMultiply(b) {var c = nbi();this.multiplyTo(b, c);return c
}function bnSquare() {var a = nbi();this.squareTo(a);return a
}function bnDivide(b) {var c = nbi();this.divRemTo(b, c, null);return c
}function bnRemainder(b) {var c = nbi();this.divRemTo(b, null, c);return c
}function bnDivideAndRemainder(b) {var d = nbi(), c = nbi();this.divRemTo(b, d, c);return new Array(d, c)
}function bnpDMultiply(a) {this[this.t] = this.am(0, a - 1, this, 0, 0, this.t);++this.t;this.clamp()
}function bnpDAddOffset(b, a) {if (b == 0) {return}while (this.t <= a) {this[this.t++] = 0}this[a] += b;while (this[a] >= this.DV) {this[a] -= this.DV;if (++a >= this.t) {this[this.t++] = 0}++this[a]}
}function NullExp() {
}function nNop(a) {return a
}function nMulTo(a, c, b) {a.multiplyTo(c, b)
}function nSqrTo(a, b) {a.squareTo(b)
}NullExp.prototype.convert = nNop;
NullExp.prototype.revert = nNop;
NullExp.prototype.mulTo = nMulTo;
NullExp.prototype.sqrTo = nSqrTo;function bnPow(a) {return this.exp(a, new NullExp())
}function bnpMultiplyLowerTo(b, f, e) {var d = Math.min(this.t + b.t, f);e.s = 0;e.t = d;while (d > 0) {e[--d] = 0}var c;for (c = e.t - this.t; d < c; ++d) {e[d + this.t] = this.am(0, b[d], e, d, 0, this.t)}for (c = Math.min(b.t, f); d < c; ++d) {this.am(0, b[d], e, d, 0, f - d)}e.clamp()
}function bnpMultiplyUpperTo(b, e, d) {--e;var c = d.t = this.t + b.t - e;d.s = 0;while (--c >= 0) {d[c] = 0}for (c = Math.max(e - this.t, 0); c < b.t; ++c) {d[this.t + c - e] = this.am(e - c, b[c], d, 0, 0, this.t + c - e)}d.clamp();d.drShiftTo(1, d)
}function Barrett(a) {this.r2 = nbi();this.q3 = nbi();BigInteger.ONE.dlShiftTo(2 * a.t, this.r2);this.mu = this.r2.divide(a);this.m = a
}function barrettConvert(a) {if (a.s < 0 || a.t > 2 * this.m.t) {return a.mod(this.m)} else {if (a.compareTo(this.m) < 0) {return a} else {var b = nbi();a.copyTo(b);this.reduce(b);return b}}
}function barrettRevert(a) {return a
}function barrettReduce(a) {a.drShiftTo(this.m.t - 1, this.r2);if (a.t > this.m.t + 1) {a.t = this.m.t + 1;a.clamp()}this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);while (a.compareTo(this.r2) < 0) {a.dAddOffset(1, this.m.t + 1)}a.subTo(this.r2, a);while (a.compareTo(this.m) >= 0) {a.subTo(this.m, a)}
}function barrettSqrTo(a, b) {a.squareTo(b);this.reduce(b)
}function barrettMulTo(a, c, b) {a.multiplyTo(c, b);this.reduce(b)
}Barrett.prototype.convert = barrettConvert;
Barrett.prototype.revert = barrettRevert;
Barrett.prototype.reduce = barrettReduce;
Barrett.prototype.mulTo = barrettMulTo;
Barrett.prototype.sqrTo = barrettSqrTo;function bnModPow(q, f) {var o = q.bitLength(), h, b = nbv(1), v;if (o <= 0) {return b} else {if (o < 18) {h = 1} else {if (o < 48) {h = 3} else {if (o < 144) {h = 4} else {if (o < 768) {h = 5} else {h = 6}}}}}if (o < 8) {v = new Classic(f)} else {if (f.isEven()) {v = new Barrett(f)} else {v = new Montgomery(f)}}var p = new Array(), d = 3, s = h - 1, a = (1 << h) - 1;p[1] = v.convert(this);if (h > 1) {var A = nbi();v.sqrTo(p[1], A);while (d <= a) {p[d] = nbi();v.mulTo(A, p[d - 2], p[d]);d += 2}}var l = q.t - 1, x, u = true, c = nbi(), y;o = nbits(q[l]) - 1;while (l >= 0) {if (o >= s) {x = (q[l] >> (o - s)) & a} else {x = (q[l] & ((1 << (o + 1)) - 1)) << (s - o);if (l > 0) {x |= q[l - 1] >> (this.DB + o - s)}}d = h;while ((x & 1) == 0) {x >>= 1;--d}if ((o -= d) < 0) {o += this.DB;--l}if (u) {p[x].copyTo(b);u = false} else {while (d > 1) {v.sqrTo(b, c);v.sqrTo(c, b);d -= 2}if (d > 0) {v.sqrTo(b, c)} else {y = b;b = c;c = y}v.mulTo(c, p[x], b)}while (l >= 0 && (q[l] & (1 << o)) == 0) {v.sqrTo(b, c);y = b;b = c;c = y;if (--o < 0) {o = this.DB - 1;--l}}}return v.revert(b)
}function bnGCD(c) {var b = (this.s < 0) ? this.negate() : this.clone();var h = (c.s < 0) ? c.negate() : c.clone();if (b.compareTo(h) < 0) {var e = b;b = h;h = e}var d = b.getLowestSetBit(), f = h.getLowestSetBit();if (f < 0) {return b}if (d < f) {f = d}if (f > 0) {b.rShiftTo(f, b);h.rShiftTo(f, h)}while (b.signum() > 0) {if ((d = b.getLowestSetBit()) > 0) {b.rShiftTo(d, b)}if ((d = h.getLowestSetBit()) > 0) {h.rShiftTo(d, h)}if (b.compareTo(h) >= 0) {b.subTo(h, b);b.rShiftTo(1, b)} else {h.subTo(b, h);h.rShiftTo(1, h)}}if (f > 0) {h.lShiftTo(f, h)}return h
}function bnpModInt(e) {if (e <= 0) {return 0}var c = this.DV % e, b = (this.s < 0) ? e - 1 : 0;if (this.t > 0) {if (c == 0) {b = this[0] % e} else {for (var a = this.t - 1; a >= 0; --a) {b = (c * b + this[a]) % e}}}return b
}function bnModInverse(f) {var j = f.isEven();if ((this.isEven() && j) || f.signum() == 0) {return BigInteger.ZERO}var i = f.clone(), h = this.clone();var g = nbv(1), e = nbv(0), l = nbv(0), k = nbv(1);while (i.signum() != 0) {while (i.isEven()) {i.rShiftTo(1, i);if (j) {if (!g.isEven() || !e.isEven()) {g.addTo(this, g);e.subTo(f, e)}g.rShiftTo(1, g)} else {if (!e.isEven()) {e.subTo(f, e)}}e.rShiftTo(1, e)}while (h.isEven()) {h.rShiftTo(1, h);if (j) {if (!l.isEven() || !k.isEven()) {l.addTo(this, l);k.subTo(f, k)}l.rShiftTo(1, l)} else {if (!k.isEven()) {k.subTo(f, k)}}k.rShiftTo(1, k)}if (i.compareTo(h) >= 0) {i.subTo(h, i);if (j) {g.subTo(l, g)}e.subTo(k, e)} else {h.subTo(i, h);if (j) {l.subTo(g, l)}k.subTo(e, k)}}if (h.compareTo(BigInteger.ONE) != 0) {return BigInteger.ZERO}if (k.compareTo(f) >= 0) {return k.subtract(f)}if (k.signum() < 0) {k.addTo(f, k)} else {return k}if (k.signum() < 0) {return k.add(f)} else {return k}
}var lowprimes = [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];
var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];function bnIsProbablePrime(e) {var d, b = this.abs();if (b.t == 1 && b[0] <= lowprimes[lowprimes.length - 1]) {for (d = 0; d < lowprimes.length; ++d) {if (b[0] == lowprimes[d]) {return true}}return false}if (b.isEven()) {return false}d = 1;while (d < lowprimes.length) {var a = lowprimes[d], c = d + 1;while (c < lowprimes.length && a < lplim) {a *= lowprimes[c++]}a = b.modInt(a);while (d < c) {if (a % lowprimes[d++] == 0) {return false}}}return b.millerRabin(e)
}function bnpMillerRabin(f) {var g = this.subtract(BigInteger.ONE);var c = g.getLowestSetBit();if (c <= 0) {return false}var h = g.shiftRight(c);f = (f + 1) >> 1;if (f > lowprimes.length) {f = lowprimes.length}var b = nbi();for (var e = 0; e < f; ++e) {b.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);var l = b.modPow(h, this);if (l.compareTo(BigInteger.ONE) != 0 && l.compareTo(g) != 0) {var d = 1;while (d++ < c && l.compareTo(g) != 0) {l = l.modPowInt(2, this);if (l.compareTo(BigInteger.ONE) == 0) {return false}}if (l.compareTo(g) != 0) {return false}}}return true
}BigInteger.prototype.chunkSize = bnpChunkSize;
BigInteger.prototype.toRadix = bnpToRadix;
BigInteger.prototype.fromRadix = bnpFromRadix;
BigInteger.prototype.fromNumber = bnpFromNumber;
BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
BigInteger.prototype.changeBit = bnpChangeBit;
BigInteger.prototype.addTo = bnpAddTo;
BigInteger.prototype.dMultiply = bnpDMultiply;
BigInteger.prototype.dAddOffset = bnpDAddOffset;
BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
BigInteger.prototype.modInt = bnpModInt;
BigInteger.prototype.millerRabin = bnpMillerRabin;
BigInteger.prototype.clone = bnClone;
BigInteger.prototype.intValue = bnIntValue;
BigInteger.prototype.byteValue = bnByteValue;
BigInteger.prototype.shortValue = bnShortValue;
BigInteger.prototype.signum = bnSigNum;
BigInteger.prototype.toByteArray = bnToByteArray;
BigInteger.prototype.equals = bnEquals;
BigInteger.prototype.min = bnMin;
BigInteger.prototype.max = bnMax;
BigInteger.prototype.and = bnAnd;
BigInteger.prototype.or = bnOr;
BigInteger.prototype.xor = bnXor;
BigInteger.prototype.andNot = bnAndNot;
BigInteger.prototype.not = bnNot;
BigInteger.prototype.shiftLeft = bnShiftLeft;
BigInteger.prototype.shiftRight = bnShiftRight;
BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
BigInteger.prototype.bitCount = bnBitCount;
BigInteger.prototype.testBit = bnTestBit;
BigInteger.prototype.setBit = bnSetBit;
BigInteger.prototype.clearBit = bnClearBit;
BigInteger.prototype.flipBit = bnFlipBit;
BigInteger.prototype.add = bnAdd;
BigInteger.prototype.subtract = bnSubtract;
BigInteger.prototype.multiply = bnMultiply;
BigInteger.prototype.divide = bnDivide;
BigInteger.prototype.remainder = bnRemainder;
BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
BigInteger.prototype.modPow = bnModPow;
BigInteger.prototype.modInverse = bnModInverse;
BigInteger.prototype.pow = bnPow;
BigInteger.prototype.gcd = bnGCD;
BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
BigInteger.prototype.square = bnSquare;function Arcfour() {this.i = 0;this.j = 0;this.S = new Array()
}function ARC4init(d) {var c, a, b;for (c = 0; c < 256; ++c) {this.S[c] = c}a = 0;for (c = 0; c < 256; ++c) {a = (a + this.S[c] + d[c % d.length]) & 255;b = this.S[c];this.S[c] = this.S[a];this.S[a] = b}this.i = 0;this.j = 0
}function ARC4next() {var a;this.i = (this.i + 1) & 255;this.j = (this.j + this.S[this.i]) & 255;a = this.S[this.i];this.S[this.i] = this.S[this.j];this.S[this.j] = a;return this.S[(a + this.S[this.i]) & 255]
}Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;function prng_newstate() {return new Arcfour()
}var rng_psize = 256;
var rng_state;
var rng_pool;
var rng_pptr;function rng_seed_int(a) {rng_pool[rng_pptr++] ^= a & 255;rng_pool[rng_pptr++] ^= (a >> 8) & 255;rng_pool[rng_pptr++] ^= (a >> 16) & 255;rng_pool[rng_pptr++] ^= (a >> 24) & 255;if (rng_pptr >= rng_psize) {rng_pptr -= rng_psize}
}function rng_seed_time() {rng_seed_int(new Date().getTime())
}if (rng_pool == null) {rng_pool = new Array();rng_pptr = 0;var t;if (window !== undefined && (window.crypto !== undefined || window.msCrypto !== undefined)) {var crypto = window.crypto || window.msCrypto;if (crypto.getRandomValues) {var ua = new Uint8Array(32);crypto.getRandomValues(ua);for (t = 0; t < 32; ++t) {rng_pool[rng_pptr++] = ua[t]}} else {if (navigator.appName == "Netscape" && navigator.appVersion < "5") {var z = window.crypto.random(32);for (t = 0; t < z.length; ++t) {rng_pool[rng_pptr++] = z.charCodeAt(t) & 255}}}}while (rng_pptr < rng_psize) {t = Math.floor(65536 * Math.random());rng_pool[rng_pptr++] = t >>> 8;rng_pool[rng_pptr++] = t & 255}rng_pptr = 0;rng_seed_time()
}function rng_get_byte() {if (rng_state == null) {rng_seed_time();rng_state = prng_newstate();rng_state.init(rng_pool);for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {rng_pool[rng_pptr] = 0}rng_pptr = 0}return rng_state.next()
}function rng_get_bytes(b) {var a;for (a = 0; a < b.length; ++a) {b[a] = rng_get_byte()}
}function SecureRandom() {
}SecureRandom.prototype.nextBytes = rng_get_bytes;function parseBigInt(b, a) {return new BigInteger(b, a)
}function linebrk(c, d) {var a = "";var b = 0;while (b + d < c.length) {a += c.substring(b, b + d) + "\n";b += d}return a + c.substring(b, c.length)
}function byte2Hex(a) {if (a < 16) {return "0" + a.toString(16)} else {return a.toString(16)}
}function pkcs1pad2(e, h) {if (h < e.length + 11) {throw "Message too long for RSA";return null}var g = new Array();var d = e.length - 1;while (d >= 0 && h > 0) {var f = e.charCodeAt(d--);if (f < 128) {g[--h] = f} else {if ((f > 127) && (f < 2048)) {g[--h] = (f & 63) | 128;g[--h] = (f >> 6) | 192} else {g[--h] = (f & 63) | 128;g[--h] = ((f >> 6) & 63) | 128;g[--h] = (f >> 12) | 224}}}g[--h] = 0;var b = new SecureRandom();var a = new Array();while (h > 2) {a[0] = 0;while (a[0] == 0) {b.nextBytes(a)}g[--h] = a[0]}g[--h] = 2;g[--h] = 0;return new BigInteger(g)
}function oaep_mgf1_arr(c, a, e) {var b = "", d = 0;while (b.length < a) {b += e(String.fromCharCode.apply(String, c.concat([(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255])));d += 1}return b
}function oaep_pad(q, a, f, l) {var c = KJUR.crypto.MessageDigest;var o = KJUR.crypto.Util;var b = null;if (!f) {f = "sha1"}if (typeof f === "string") {b = c.getCanonicalAlgName(f);l = c.getHashLength(b);f = function (i) {return hextorstr(o.hashHex(rstrtohex(i), b))}}if (q.length + 2 * l + 2 > a) {throw "Message too long for RSA"}var k = "", e;for (e = 0; e < a - q.length - 2 * l - 2; e += 1) {k += "\x00"}var h = f("") + k + "\x01" + q;var g = new Array(l);new SecureRandom().nextBytes(g);var j = oaep_mgf1_arr(g, h.length, f);var p = [];for (e = 0; e < h.length; e += 1) {p[e] = h.charCodeAt(e) ^ j.charCodeAt(e)}var m = oaep_mgf1_arr(p, g.length, f);var d = [0];for (e = 0; e < g.length; e += 1) {d[e + 1] = g[e] ^ m.charCodeAt(e)}return new BigInteger(d.concat(p))
}function RSAKey() {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 RSASetPublic(b, a) {this.isPublic = true;this.isPrivate = false;if (typeof b !== "string") {this.n = b;this.e = a} else {if (b != null && a != null && b.length > 0 && a.length > 0) {this.n = parseBigInt(b, 16);this.e = parseInt(a, 16)} else {throw "Invalid RSA public key"}}
}function RSADoPublic(a) {return a.modPowInt(this.e, this.n)
}function RSAEncrypt(d) {var a = pkcs1pad2(d, (this.n.bitLength() + 7) >> 3);if (a == null) {return null}var e = this.doPublic(a);if (e == null) {return null}var b = e.toString(16);if ((b.length & 1) == 0) {return b} else {return "0" + b}
}function RSAEncryptOAEP(f, e, b) {var a = oaep_pad(f, (this.n.bitLength() + 7) >> 3, e, b);if (a == null) {return null}var g = this.doPublic(a);if (g == null) {return null}var d = g.toString(16);if ((d.length & 1) == 0) {return d} else {return "0" + d}
}RSAKey.prototype.doPublic = RSADoPublic;
RSAKey.prototype.setPublic = RSASetPublic;
RSAKey.prototype.encrypt = RSAEncrypt;
RSAKey.prototype.encryptOAEP = RSAEncryptOAEP;
RSAKey.prototype.type = "RSA";function pkcs1unpad2(g, j) {var a = g.toByteArray();var f = 0;while (f < a.length && a[f] == 0) {++f}if (a.length - f != j - 1 || a[f] != 2) {return null}++f;while (a[f] != 0) {if (++f >= a.length) {return null}}var e = "";while (++f < a.length) {var h = a[f] & 255;if (h < 128) {e += String.fromCharCode(h)} else {if ((h > 191) && (h < 224)) {e += String.fromCharCode(((h & 31) << 6) | (a[f + 1] & 63));++f} else {e += String.fromCharCode(((h & 15) << 12) | ((a[f + 1] & 63) << 6) | (a[f + 2] & 63));f += 2}}}return e
}function oaep_mgf1_str(c, a, e) {var b = "", d = 0;while (b.length < a) {b += e(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]));d += 1}return b
}function oaep_unpad(o, b, g, p) {var e = KJUR.crypto.MessageDigest;var r = KJUR.crypto.Util;var c = null;if (!g) {g = "sha1"}if (typeof g === "string") {c = e.getCanonicalAlgName(g);p = e.getHashLength(c);g = function (d) {return hextorstr(r.hashHex(rstrtohex(d), c))}}o = o.toByteArray();var h;for (h = 0; h < o.length; h += 1) {o[h] &= 255}while (o.length < b) {o.unshift(0)}o = String.fromCharCode.apply(String, o);if (o.length < 2 * p + 2) {throw "Cipher too short"}var f = o.substr(1, p);var s = o.substr(p + 1);var q = oaep_mgf1_str(s, p, g);var k = [], h;for (h = 0; h < f.length; h += 1) {k[h] = f.charCodeAt(h) ^ q.charCodeAt(h)}var l = oaep_mgf1_str(String.fromCharCode.apply(String, k), o.length - p, g);var j = [];for (h = 0; h < s.length; h += 1) {j[h] = s.charCodeAt(h) ^ l.charCodeAt(h)}j = String.fromCharCode.apply(String, j);if (j.substr(0, p) !== g("")) {throw "Hash mismatch"}j = j.substr(p);var a = j.indexOf("\x01");var m = (a != -1) ? j.substr(0, a).lastIndexOf("\x00") : -1;if (m + 1 != a) {throw "Malformed data"}return j.substr(a + 1)
}function RSASetPrivate(c, a, b) {this.isPrivate = true;if (typeof c !== "string") {this.n = c;this.e = a;this.d = b} else {if (c != null && a != null && c.length > 0 && a.length > 0) {this.n = parseBigInt(c, 16);this.e = parseInt(a, 16);this.d = parseBigInt(b, 16)} else {throw "Invalid RSA private key"}}
}function RSASetPrivateEx(g, d, e, c, b, a, h, f) {this.isPrivate = true;this.isPublic = false;if (g == null) {throw "RSASetPrivateEx N == null"}if (d == null) {throw "RSASetPrivateEx E == null"}if (g.length == 0) {throw "RSASetPrivateEx N.length == 0"}if (d.length == 0) {throw "RSASetPrivateEx E.length == 0"}if (g != null && d != null && g.length > 0 && d.length > 0) {this.n = parseBigInt(g, 16);this.e = parseInt(d, 16);this.d = parseBigInt(e, 16);this.p = parseBigInt(c, 16);this.q = parseBigInt(b, 16);this.dmp1 = parseBigInt(a, 16);this.dmq1 = parseBigInt(h, 16);this.coeff = parseBigInt(f, 16)} else {throw "Invalid RSA private key in RSASetPrivateEx"}
}function RSAGenerate(b, i) {var a = new SecureRandom();var f = b >> 1;this.e = parseInt(i, 16);var c = new BigInteger(i, 16);for (; ;) {for (; ;) {this.p = new BigInteger(b - f, 1, a);if (this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {break}}for (; ;) {this.q = new BigInteger(f, 1, a);if (this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {break}}if (this.p.compareTo(this.q) <= 0) {var h = this.p;this.p = this.q;this.q = h}var g = this.p.subtract(BigInteger.ONE);var d = this.q.subtract(BigInteger.ONE);var e = g.multiply(d);if (e.gcd(c).compareTo(BigInteger.ONE) == 0) {this.n = this.p.multiply(this.q);this.d = c.modInverse(e);this.dmp1 = this.d.mod(g);this.dmq1 = this.d.mod(d);this.coeff = this.q.modInverse(this.p);break}}this.isPrivate = true
}function RSADoPrivate(a) {if (this.p == null || this.q == null) {return a.modPow(this.d, this.n)}var c = a.mod(this.p).modPow(this.dmp1, this.p);var b = a.mod(this.q).modPow(this.dmq1, this.q);while (c.compareTo(b) < 0) {c = c.add(this.p)}return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)
}function RSADecrypt(b) {var d = parseBigInt(b, 16);var a = this.doPrivate(d);if (a == null) {return null}return pkcs1unpad2(a, (this.n.bitLength() + 7) >> 3)
}function RSADecryptOAEP(e, d, b) {var f = parseBigInt(e, 16);var a = this.doPrivate(f);if (a == null) {return null}return oaep_unpad(a, (this.n.bitLength() + 7) >> 3, d, b)
}RSAKey.prototype.doPrivate = RSADoPrivate;
RSAKey.prototype.setPrivate = RSASetPrivate;
RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
RSAKey.prototype.generate = RSAGenerate;
RSAKey.prototype.decrypt = RSADecrypt;
RSAKey.prototype.decryptOAEP = RSADecryptOAEP;
var ASN1HEX = new function () {}
;
ASN1HEX.getLblen = function (c, a) {if (c.substr(a + 2, 1) != "8") {return 1}var b = parseInt(c.substr(a + 3, 1));if (b == 0) {return -1}if (0 < b && b < 10) {return b + 1}return -2
}
;
ASN1HEX.getL = function (c, b) {var a = ASN1HEX.getLblen(c, b);if (a < 1) {return ""}return c.substr(b + 2, a * 2)
}
;
ASN1HEX.getVblen = function (d, a) {var c, b;c = ASN1HEX.getL(d, a);if (c == "") {return -1}if (c.substr(0, 1) === "8") {b = new BigInteger(c.substr(2), 16)} else {b = new BigInteger(c, 16)}return b.intValue()
}
;
ASN1HEX.getVidx = function (c, b) {var a = ASN1HEX.getLblen(c, b);if (a < 0) {return a}return b + (a + 1) * 2
}
;
ASN1HEX.getV = function (d, a) {var c = ASN1HEX.getVidx(d, a);var b = ASN1HEX.getVblen(d, a);return d.substr(c, b * 2)
}
;
ASN1HEX.getTLV = function (b, a) {return b.substr(a, 2) + ASN1HEX.getL(b, a) + ASN1HEX.getV(b, a)
}
;
ASN1HEX.getNextSiblingIdx = function (d, a) {var c = ASN1HEX.getVidx(d, a);var b = ASN1HEX.getVblen(d, a);return c + b * 2
}
;
ASN1HEX.getChildIdx = function (e, f) {var j = ASN1HEX;var g = new Array();var i = j.getVidx(e, f);if (e.substr(f, 2) == "03") {g.push(i + 2)} else {g.push(i)}var l = j.getVblen(e, f);var c = i;var d = 0;while (1) {var b = j.getNextSiblingIdx(e, c);if (b == null || (b - i >= (l * 2))) {break}if (d >= 200) {break}g.push(b);c = b;d++}return g
}
;
ASN1HEX.getNthChildIdx = function (d, b, e) {var c = ASN1HEX.getChildIdx(d, b);return c[e]
}
;
ASN1HEX.getIdxbyList = function (e, d, c, i) {var g = ASN1HEX;var f, b;if (c.length == 0) {if (i !== undefined) {if (e.substr(d, 2) !== i) {throw "checking tag doesn't match: " + e.substr(d, 2) + "!=" + i}}return d}f = c.shift();b = g.getChildIdx(e, d);return g.getIdxbyList(e, b[f], c, i)
}
;
ASN1HEX.getTLVbyList = function (d, c, b, f) {var e = ASN1HEX;var a = e.getIdxbyList(d, c, b);if (a === undefined) {throw "can't find nthList object"}if (f !== undefined) {if (d.substr(a, 2) != f) {throw "checking tag doesn't match: " + d.substr(a, 2) + "!=" + f}}return e.getTLV(d, a)
}
;
ASN1HEX.getVbyList = function (e, c, b, g, i) {var f = ASN1HEX;var a, d;a = f.getIdxbyList(e, c, b, g);if (a === undefined) {throw "can't find nthList object"}d = f.getV(e, a);if (i === true) {d = d.substr(2)}return d
}
;
ASN1HEX.hextooidstr = function (e) {var h = function (b, a) {if (b.length >= a) {return b}return new Array(a - b.length + 1).join("0") + b};var l = [];var o = e.substr(0, 2);var f = parseInt(o, 16);l[0] = new String(Math.floor(f / 40));l[1] = new String(f % 40);var m = e.substr(2);var k = [];for (var g = 0; g < m.length / 2; g++) {k.push(parseInt(m.substr(g * 2, 2), 16))}var j = [];var d = "";for (var g = 0; g < k.length; g++) {if (k[g] & 128) {d = d + h((k[g] & 127).toString(2), 7)} else {d = d + h((k[g] & 127).toString(2), 7);j.push(new String(parseInt(d, 2)));d = ""}}var n = l.join(".");if (j.length > 0) {n = n + "." + j.join(".")}return n
}
;
ASN1HEX.dump = function (t, c, l, g) {var p = ASN1HEX;var j = p.getV;var y = p.dump;var w = p.getChildIdx;var e = t;if (t instanceof KJUR.asn1.ASN1Object) {e = t.getEncodedHex()}var q = function (A, i) {if (A.length <= i * 2) {return A} else {var v = A.substr(0, i) + "..(total " + A.length / 2 + "bytes).." + A.substr(A.length - i, i);return v}};if (c === undefined) {c = {ommit_long_octet: 32}}if (l === undefined) {l = 0}if (g === undefined) {g = ""}var x = c.ommit_long_octet;if (e.substr(l, 2) == "01") {var h = j(e, l);if (h == "00") {return g + "BOOLEAN FALSE\n"} else {return g + "BOOLEAN TRUE\n"}}if (e.substr(l, 2) == "02") {var h = j(e, l);return g + "INTEGER " + q(h, x) + "\n"}if (e.substr(l, 2) == "03") {var h = j(e, l);return g + "BITSTRING " + q(h, x) + "\n"}if (e.substr(l, 2) == "04") {var h = j(e, l);if (p.isASN1HEX(h)) {var k = g + "OCTETSTRING, encapsulates\n";k = k + y(h, c, 0, g + "  ");return k} else {return g + "OCTETSTRING " + q(h, x) + "\n"}}if (e.substr(l, 2) == "05") {return g + "NULL\n"}if (e.substr(l, 2) == "06") {var m = j(e, l);var a = KJUR.asn1.ASN1Util.oidHexToInt(m);var o = KJUR.asn1.x509.OID.oid2name(a);var b = a.replace(/\./g, " ");if (o != "") {return g + "ObjectIdentifier " + o + " (" + b + ")\n"} else {return g + "ObjectIdentifier (" + b + ")\n"}}if (e.substr(l, 2) == "0c") {return g + "UTF8String '" + hextoutf8(j(e, l)) + "'\n"}if (e.substr(l, 2) == "13") {return g + "PrintableString '" + hextoutf8(j(e, l)) + "'\n"}if (e.substr(l, 2) == "14") {return g + "TeletexString '" + hextoutf8(j(e, l)) + "'\n"}if (e.substr(l, 2) == "16") {return g + "IA5String '" + hextoutf8(j(e, l)) + "'\n"}if (e.substr(l, 2) == "17") {return g + "UTCTime " + hextoutf8(j(e, l)) + "\n"}if (e.substr(l, 2) == "18") {return g + "GeneralizedTime " + hextoutf8(j(e, l)) + "\n"}if (e.substr(l, 2) == "30") {if (e.substr(l, 4) == "3000") {return g + "SEQUENCE {}\n"}var k = g + "SEQUENCE\n";var d = w(e, l);var f = c;if ((d.length == 2 || d.length == 3) && e.substr(d[0], 2) == "06" && e.substr(d[d.length - 1], 2) == "04") {var o = p.oidname(j(e, d[0]));var r = JSON.parse(JSON.stringify(c));r.x509ExtName = o;f = r}for (var u = 0; u < d.length; u++) {k = k + y(e, f, d[u], g + "  ")}return k}if (e.substr(l, 2) == "31") {var k = g + "SET\n";var d = w(e, l);for (var u = 0; u < d.length; u++) {k = k + y(e, c, d[u], g + "  ")}return k}var z = parseInt(e.substr(l, 2), 16);if ((z & 128) != 0) {var n = z & 31;if ((z & 32) != 0) {var k = g + "[" + n + "]\n";var d = w(e, l);for (var u = 0; u < d.length; u++) {k = k + y(e, c, d[u], g + "  ")}return k} else {var h = j(e, l);if (h.substr(0, 8) == "68747470") {h = hextoutf8(h)}if (c.x509ExtName === "subjectAltName" && n == 2) {h = hextoutf8(h)}var k = g + "[" + n + "] " + h + "\n";return k}}return g + "UNKNOWN(" + e.substr(l, 2) + ") " + j(e, l) + "\n"
}
;
ASN1HEX.isASN1HEX = function (e) {var d = ASN1HEX;if (e.length % 2 == 1) {return false}var c = d.getVblen(e, 0);var b = e.substr(0, 2);var f = d.getL(e, 0);var a = e.length - b.length - f.length;if (a == c * 2) {return true}return false
}
;
ASN1HEX.oidname = function (a) {var c = KJUR.asn1;if (KJUR.lang.String.isHex(a)) {a = c.ASN1Util.oidHexToInt(a)}var b = c.x509.OID.oid2name(a);if (b === "") {b = a}return b
}
;
var KJUR;
if (typeof KJUR == "undefined" || !KJUR) {KJUR = {}
}
if (typeof KJUR.lang == "undefined" || !KJUR.lang) {KJUR.lang = {}
}
KJUR.lang.String = function () {
}
;function Base64x() {
}function stoBA(d) {var b = new Array();for (var c = 0; c < d.length; c++) {b[c] = d.charCodeAt(c)}return b
}function BAtos(b) {var d = "";for (var c = 0; c < b.length; c++) {d = d + String.fromCharCode(b[c])}return d
}function BAtohex(b) {var e = "";for (var d = 0; d < b.length; d++) {var c = b[d].toString(16);if (c.length == 1) {c = "0" + c}e = e + c}return e
}function stohex(a) {return BAtohex(stoBA(a))
}function stob64(a) {return hex2b64(stohex(a))
}function stob64u(a) {return b64tob64u(hex2b64(stohex(a)))
}function b64utos(a) {return BAtos(b64toBA(b64utob64(a)))
}function b64tob64u(a) {a = a.replace(/\=/g, "");a = a.replace(/\+/g, "-");a = a.replace(/\//g, "_");return a
}function b64utob64(a) {if (a.length % 4 == 2) {a = a + "=="} else {if (a.length % 4 == 3) {a = a + "="}}a = a.replace(/-/g, "+");a = a.replace(/_/g, "/");return a
}function hextob64u(a) {if (a.length % 2 == 1) {a = "0" + a}return b64tob64u(hex2b64(a))
}function b64utohex(a) {return b64tohex(b64utob64(a))
}var utf8tob64u, b64utoutf8;
if (typeof Buffer === "function") {utf8tob64u = function (a) {return b64tob64u(new Buffer(a, "utf8").toString("base64"))};b64utoutf8 = function (a) {return new Buffer(b64utob64(a), "base64").toString("utf8")}
} else {utf8tob64u = function (a) {return hextob64u(uricmptohex(encodeURIComponentAll(a)))};b64utoutf8 = function (a) {return decodeURIComponent(hextouricmp(b64utohex(a)))}
}function utf8tob64(a) {return hex2b64(uricmptohex(encodeURIComponentAll(a)))
}function b64toutf8(a) {return decodeURIComponent(hextouricmp(b64tohex(a)))
}function utf8tohex(a) {return uricmptohex(encodeURIComponentAll(a))
}function hextoutf8(a) {return decodeURIComponent(hextouricmp(a))
}function hextorstr(c) {var b = "";for (var a = 0; a < c.length - 1; a += 2) {b += String.fromCharCode(parseInt(c.substr(a, 2), 16))}return b
}function rstrtohex(c) {var a = "";for (var b = 0; b < c.length; b++) {a += ("0" + c.charCodeAt(b).toString(16)).slice(-2)}return a
}function hextob64(a) {return hex2b64(a)
}function hextob64nl(b) {var a = hextob64(b);var c = a.replace(/(.{64})/g, "$1\r\n");c = c.replace(/\r\n$/, "");return c
}function b64nltohex(b) {var a = b.replace(/[^0-9A-Za-z\/+=]*/g, "");var c = b64tohex(a);return c
}function hextopem(a, b) {var c = hextob64nl(a);return "-----BEGIN " + b + "-----\r\n" + c + "\r\n-----END " + b + "-----\r\n"
}function pemtohex(a, b) {if (a.indexOf("-----BEGIN ") == -1) {throw "can't find PEM header: " + b}if (b !== undefined) {a = a.replace("-----BEGIN " + b + "-----", "");a = a.replace("-----END " + b + "-----", "")} else {a = a.replace(/-----BEGIN [^-]+-----/, "");a = a.replace(/-----END [^-]+-----/, "")}return b64nltohex(a)
}function hextoArrayBuffer(d) {if (d.length % 2 != 0) {throw "input is not even length"}if (d.match(/^[0-9A-Fa-f]+$/) == null) {throw "input is not hexadecimal"}var b = new ArrayBuffer(d.length / 2);var a = new DataView(b);for (var c = 0; c < d.length / 2; c++) {a.setUint8(c, parseInt(d.substr(c * 2, 2), 16))}return b
}function ArrayBuffertohex(b) {var d = "";var a = new DataView(b);for (var c = 0; c < b.byteLength; c++) {d += ("00" + a.getUint8(c).toString(16)).slice(-2)}return d
}function zulutomsec(n) {var l, j, m, e, f, i, b, k;var a, h, g, c;c = n.match(/^(\d{2}|\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(|\.\d+)Z$/);if (c) {a = c[1];l = parseInt(a);if (a.length === 2) {if (50 <= l && l < 100) {l = 1900 + l} else {if (0 <= l && l < 50) {l = 2000 + l}}}j = parseInt(c[2]) - 1;m = parseInt(c[3]);e = parseInt(c[4]);f = parseInt(c[5]);i = parseInt(c[6]);b = 0;h = c[7];if (h !== "") {g = (h.substr(1) + "00").substr(0, 3);b = parseInt(g)}return Date.UTC(l, j, m, e, f, i, b)}throw "unsupported zulu format: " + n
}function zulutosec(a) {var b = zulutomsec(a);return ~~(b / 1000)
}function zulutodate(a) {return new Date(zulutomsec(a))
}function datetozulu(g, e, f) {var b;var a = g.getUTCFullYear();if (e) {if (a < 1950 || 2049 < a) {throw "not proper year for UTCTime: " + a}b = ("" + a).slice(-2)} else {b = ("000" + a).slice(-4)}b += ("0" + (g.getUTCMonth() + 1)).slice(-2);b += ("0" + g.getUTCDate()).slice(-2);b += ("0" + g.getUTCHours()).slice(-2);b += ("0" + g.getUTCMinutes()).slice(-2);b += ("0" + g.getUTCSeconds()).slice(-2);if (f) {var c = g.getUTCMilliseconds();if (c !== 0) {c = ("00" + c).slice(-3);c = c.replace(/0+$/g, "");b += "." + c}}b += "Z";return b
}function uricmptohex(a) {return a.replace(/%/g, "")
}function hextouricmp(a) {return a.replace(/(..)/g, "%$1")
}function ipv6tohex(g) {var b = "malformed IPv6 address";if (!g.match(/^[0-9A-Fa-f:]+$/)) {throw b}g = g.toLowerCase();var d = g.split(":").length - 1;if (d < 2) {throw b}var e = ":".repeat(7 - d + 2);g = g.replace("::", e);var c = g.split(":");if (c.length != 8) {throw b}for (var f = 0; f < 8; f++) {c[f] = ("0000" + c[f]).slice(-4)}return c.join("")
}function hextoipv6(e) {if (!e.match(/^[0-9A-Fa-f]{32}$/)) {throw "malformed IPv6 address octet"}e = e.toLowerCase();var b = e.match(/.{1,4}/g);for (var d = 0; d < 8; d++) {b[d] = b[d].replace(/^0+/, "");if (b[d] == "") {b[d] = "0"}}e = ":" + b.join(":") + ":";var c = e.match(/:(0:){2,}/g);if (c === null) {return e.slice(1, -1)}var f = "";for (var d = 0; d < c.length; d++) {if (c[d].length > f.length) {f = c[d]}}e = e.replace(f, "::");return e.slice(1, -1)
}function hextoip(b) {var d = "malformed hex value";if (!b.match(/^([0-9A-Fa-f][0-9A-Fa-f]){1,}$/)) {throw d}if (b.length == 8) {var c;try {c = parseInt(b.substr(0, 2), 16) + "." + parseInt(b.substr(2, 2), 16) + "." + parseInt(b.substr(4, 2), 16) + "." + parseInt(b.substr(6, 2), 16);return c} catch (a) {throw d}} else {if (b.length == 32) {return hextoipv6(b)} else {return b}}
}function iptohex(f) {var j = "malformed IP address";f = f.toLowerCase(f);if (f.match(/^[0-9.]+$/)) {var b = f.split(".");if (b.length !== 4) {throw j}var g = "";try {for (var e = 0; e < 4; e++) {var h = parseInt(b[e]);g += ("0" + h.toString(16)).slice(-2)}return g} catch (c) {throw j}} else {if (f.match(/^[0-9a-f:]+$/) && f.indexOf(":") !== -1) {return ipv6tohex(f)} else {throw j}}
}function encodeURIComponentAll(a) {var d = encodeURIComponent(a);var b = "";for (var c = 0; c < d.length; c++) {if (d[c] == "%") {b = b + d.substr(c, 3);c = c + 2} else {b = b + "%" + stohex(d[c])}}return b
}function newline_toUnix(a) {a = a.replace(/\r\n/mg, "\n");return a
}function newline_toDos(a) {a = a.replace(/\r\n/mg, "\n");a = a.replace(/\n/mg, "\r\n");return a
}KJUR.lang.String.isInteger = function (a) {if (a.match(/^[0-9]+$/)) {return true} else {if (a.match(/^-[0-9]+$/)) {return true} else {return false}}
}
;
KJUR.lang.String.isHex = function (a) {if (a.length % 2 == 0 && (a.match(/^[0-9a-f]+$/) || a.match(/^[0-9A-F]+$/))) {return true} else {return false}
}
;
KJUR.lang.String.isBase64 = function (a) {a = a.replace(/\s+/g, "");if (a.match(/^[0-9A-Za-z+\/]+={0,3}$/) && a.length % 4 == 0) {return true} else {return false}
}
;
KJUR.lang.String.isBase64URL = function (a) {if (a.match(/[+/=]/)) {return false}a = b64utob64(a);return KJUR.lang.String.isBase64(a)
}
;
KJUR.lang.String.isIntegerArray = function (a) {a = a.replace(/\s+/g, "");if (a.match(/^\[[0-9,]+\]$/)) {return true} else {return false}
}
;function hextoposhex(a) {if (a.length % 2 == 1) {return "0" + a}if (a.substr(0, 1) > "7") {return "00" + a}return a
}function intarystrtohex(b) {b = b.replace(/^\s*\[\s*/, "");b = b.replace(/\s*\]\s*$/, "");b = b.replace(/\s*/g, "");try {var c = b.split(/,/).map(function (g, e, h) {var f = parseInt(g);if (f < 0 || 255 < f) {throw "integer not in range 0-255"}var d = ("00" + f.toString(16)).slice(-2);return d}).join("");return c} catch (a) {throw "malformed integer array string: " + a}
}var strdiffidx = function (c, a) {var d = c.length;if (c.length > a.length) {d = a.length}for (var b = 0; b < d; b++) {if (c.charCodeAt(b) != a.charCodeAt(b)) {return b}}if (c.length != a.length) {return d}return -1
};
if (typeof KJUR == "undefined" || !KJUR) {KJUR = {}
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {KJUR.crypto = {}
}
KJUR.crypto.Util = new function () {this.DIGESTINFOHEAD = {sha1: "3021300906052b0e03021a05000414",sha224: "302d300d06096086480165030402040500041c",sha256: "3031300d060960864801650304020105000420",sha384: "3041300d060960864801650304020205000430",sha512: "3051300d060960864801650304020305000440",md2: "3020300c06082a864886f70d020205000410",md5: "3020300c06082a864886f70d020505000410",ripemd160: "3021300906052b2403020105000414",};this.DEFAULTPROVIDER = {md5: "cryptojs",sha1: "cryptojs",sha224: "cryptojs",sha256: "cryptojs",sha384: "cryptojs",sha512: "cryptojs",ripemd160: "cryptojs",hmacmd5: "cryptojs",hmacsha1: "cryptojs",hmacsha224: "cryptojs",hmacsha256: "cryptojs",hmacsha384: "cryptojs",hmacsha512: "cryptojs",hmacripemd160: "cryptojs",MD5withRSA: "cryptojs/jsrsa",SHA1withRSA: "cryptojs/jsrsa",SHA224withRSA: "cryptojs/jsrsa",SHA256withRSA: "cryptojs/jsrsa",SHA384withRSA: "cryptojs/jsrsa",SHA512withRSA: "cryptojs/jsrsa",RIPEMD160withRSA: "cryptojs/jsrsa",MD5withECDSA: "cryptojs/jsrsa",SHA1withECDSA: "cryptojs/jsrsa",SHA224withECDSA: "cryptojs/jsrsa",SHA256withECDSA: "cryptojs/jsrsa",SHA384withECDSA: "cryptojs/jsrsa",SHA512withECDSA: "cryptojs/jsrsa",RIPEMD160withECDSA: "cryptojs/jsrsa",SHA1withDSA: "cryptojs/jsrsa",SHA224withDSA: "cryptojs/jsrsa",SHA256withDSA: "cryptojs/jsrsa",MD5withRSAandMGF1: "cryptojs/jsrsa",SHA1withRSAandMGF1: "cryptojs/jsrsa",SHA224withRSAandMGF1: "cryptojs/jsrsa",SHA256withRSAandMGF1: "cryptojs/jsrsa",SHA384withRSAandMGF1: "cryptojs/jsrsa",SHA512withRSAandMGF1: "cryptojs/jsrsa",RIPEMD160withRSAandMGF1: "cryptojs/jsrsa",};this.CRYPTOJSMESSAGEDIGESTNAME = {md5: CryptoJS.algo.MD5,sha1: CryptoJS.algo.SHA1,sha224: CryptoJS.algo.SHA224,sha256: CryptoJS.algo.SHA256,sha384: CryptoJS.algo.SHA384,sha512: CryptoJS.algo.SHA512,ripemd160: CryptoJS.algo.RIPEMD160};this.getDigestInfoHex = function (a, b) {if (typeof this.DIGESTINFOHEAD[b] == "undefined") {throw "alg not supported in Util.DIGESTINFOHEAD: " + b}return this.DIGESTINFOHEAD[b] + a};this.getPaddedDigestInfoHex = function (h, a, j) {var c = this.getDigestInfoHex(h, a);var d = j / 4;if (c.length + 22 > d) {throw "key is too short for SigAlg: keylen=" + j + "," + a}var b = "0001";var k = "00" + c;var g = "";var l = d - b.length - k.length;for (var f = 0; f < l; f += 2) {g += "ff"}var e = b + g + k;return e};this.hashString = function (a, c) {var b = new KJUR.crypto.MessageDigest({alg: c});return b.digestString(a)};this.hashHex = function (b, c) {var a = new KJUR.crypto.MessageDigest({alg: c});return a.digestHex(b)};this.sha1 = function (a) {var b = new KJUR.crypto.MessageDigest({alg: "sha1",prov: "cryptojs"});return b.digestString(a)};this.sha256 = function (a) {var b = new KJUR.crypto.MessageDigest({alg: "sha256",prov: "cryptojs"});return b.digestString(a)};this.sha256Hex = function (a) {var b = new KJUR.crypto.MessageDigest({alg: "sha256",prov: "cryptojs"});return b.digestHex(a)};this.sha512 = function (a) {var b = new KJUR.crypto.MessageDigest({alg: "sha512",prov: "cryptojs"});return b.digestString(a)};this.sha512Hex = function (a) {var b = new KJUR.crypto.MessageDigest({alg: "sha512",prov: "cryptojs"});return b.digestHex(a)}
}
;
KJUR.crypto.Util.md5 = function (a) {var b = new KJUR.crypto.MessageDigest({alg: "md5",prov: "cryptojs"});return b.digestString(a)
}
;
KJUR.crypto.Util.ripemd160 = function (a) {var b = new KJUR.crypto.MessageDigest({alg: "ripemd160",prov: "cryptojs"});return b.digestString(a)
}
;
KJUR.crypto.Util.SECURERANDOMGEN = new SecureRandom();
KJUR.crypto.Util.getRandomHexOfNbytes = function (b) {var a = new Array(b);KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(a);return BAtohex(a)
}
;
KJUR.crypto.Util.getRandomBigIntegerOfNbytes = function (a) {return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbytes(a), 16)
}
;
KJUR.crypto.Util.getRandomHexOfNbits = function (d) {var c = d % 8;var a = (d - c) / 8;var b = new Array(a + 1);KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(b);b[0] = (((255 << c) & 255) ^ 255) & b[0];return BAtohex(b)
}
;
KJUR.crypto.Util.getRandomBigIntegerOfNbits = function (a) {return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbits(a), 16)
}
;
KJUR.crypto.Util.getRandomBigIntegerZeroToMax = function (b) {var a = b.bitLength();while (1) {var c = KJUR.crypto.Util.getRandomBigIntegerOfNbits(a);if (b.compareTo(c) != -1) {return c}}
}
;
KJUR.crypto.Util.getRandomBigIntegerMinToMax = function (e, b) {var c = e.compareTo(b);if (c == 1) {throw "biMin is greater than biMax"}if (c == 0) {return e}var a = b.subtract(e);var d = KJUR.crypto.Util.getRandomBigIntegerZeroToMax(a);return d.add(e)
}
;
KJUR.crypto.MessageDigest = function (c) {var b = null;var a = null;var d = null;this.setAlgAndProvider = function (g, f) {g = KJUR.crypto.MessageDigest.getCanonicalAlgName(g);if (g !== null && f === undefined) {f = KJUR.crypto.Util.DEFAULTPROVIDER[g]}if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && f == "cryptojs") {try {this.md = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g].create()} catch (e) {throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e}this.updateString = function (h) {this.md.update(h)};this.updateHex = function (h) {var i = CryptoJS.enc.Hex.parse(h);this.md.update(i)};this.digest = function () {var h = this.md.finalize();return h.toString(CryptoJS.enc.Hex)};this.digestString = function (h) {this.updateString(h);return this.digest()};this.digestHex = function (h) {this.updateHex(h);return this.digest()}}if (":sha256:".indexOf(g) != -1 && f == "sjcl") {try {this.md = new sjcl.hash.sha256()} catch (e) {throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e}this.updateString = function (h) {this.md.update(h)};this.updateHex = function (i) {var h = sjcl.codec.hex.toBits(i);this.md.update(h)};this.digest = function () {var h = this.md.finalize();return sjcl.codec.hex.fromBits(h)};this.digestString = function (h) {this.updateString(h);return this.digest()};this.digestHex = function (h) {this.updateHex(h);return this.digest()}}};this.updateString = function (e) {throw "updateString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName};this.updateHex = function (e) {throw "updateHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName};this.digest = function () {throw "digest() not supported for this alg/prov: " + this.algName + "/" + this.provName};this.digestString = function (e) {throw "digestString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName};this.digestHex = function (e) {throw "digestHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName};if (c !== undefined) {if (c.alg !== undefined) {this.algName = c.alg;if (c.prov === undefined) {this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]}this.setAlgAndProvider(this.algName, this.provName)}}
}
;
KJUR.crypto.MessageDigest.getCanonicalAlgName = function (a) {if (typeof a === "string") {a = a.toLowerCase();a = a.replace(/-/, "")}return a
}
;
KJUR.crypto.MessageDigest.getHashLength = function (c) {var b = KJUR.crypto.MessageDigest;var a = b.getCanonicalAlgName(c);if (b.HASHLENGTH[a] === undefined) {throw "not supported algorithm: " + c}return b.HASHLENGTH[a]
}
;
KJUR.crypto.MessageDigest.HASHLENGTH = {md5: 16,sha1: 20,sha224: 28,sha256: 32,sha384: 48,sha512: 64,ripemd160: 20
};
KJUR.crypto.Mac = function (d) {var f = null;var c = null;var a = null;var e = null;var b = null;this.setAlgAndProvider = function (k, i) {k = k.toLowerCase();if (k == null) {k = "hmacsha1"}k = k.toLowerCase();if (k.substr(0, 4) != "hmac") {throw "setAlgAndProvider unsupported HMAC alg: " + k}if (i === undefined) {i = KJUR.crypto.Util.DEFAULTPROVIDER[k]}this.algProv = k + "/" + i;var g = k.substr(4);if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && i == "cryptojs") {try {var j = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g];this.mac = CryptoJS.algo.HMAC.create(j, this.pass)} catch (h) {throw "setAlgAndProvider hash alg set fail hashAlg=" + g + "/" + h}this.updateString = function (l) {this.mac.update(l)};this.updateHex = function (l) {var m = CryptoJS.enc.Hex.parse(l);this.mac.update(m)};this.doFinal = function () {var l = this.mac.finalize();return l.toString(CryptoJS.enc.Hex)};this.doFinalString = function (l) {this.updateString(l);return this.doFinal()};this.doFinalHex = function (l) {this.updateHex(l);return this.doFinal()}}};this.updateString = function (g) {throw "updateString(str) not supported for this alg/prov: " + this.algProv};this.updateHex = function (g) {throw "updateHex(hex) not supported for this alg/prov: " + this.algProv};this.doFinal = function () {throw "digest() not supported for this alg/prov: " + this.algProv};this.doFinalString = function (g) {throw "digestString(str) not supported for this alg/prov: " + this.algProv};this.doFinalHex = function (g) {throw "digestHex(hex) not supported for this alg/prov: " + this.algProv};this.setPassword = function (h) {if (typeof h == "string") {var g = h;if (h.length % 2 == 1 || !h.match(/^[0-9A-Fa-f]+$/)) {g = rstrtohex(h)}this.pass = CryptoJS.enc.Hex.parse(g);return}if (typeof h != "object") {throw "KJUR.crypto.Mac unsupported password type: " + h}var g = null;if (h.hex !== undefined) {if (h.hex.length % 2 != 0 || !h.hex.match(/^[0-9A-Fa-f]+$/)) {throw "Mac: wrong hex password: " + h.hex}g = h.hex}if (h.utf8 !== undefined) {g = utf8tohex(h.utf8)}if (h.rstr !== undefined) {g = rstrtohex(h.rstr)}if (h.b64 !== undefined) {g = b64tohex(h.b64)}if (h.b64u !== undefined) {g = b64utohex(h.b64u)}if (g == null) {throw "KJUR.crypto.Mac unsupported password type: " + h}this.pass = CryptoJS.enc.Hex.parse(g)};if (d !== undefined) {if (d.pass !== undefined) {this.setPassword(d.pass)}if (d.alg !== undefined) {this.algName = d.alg;if (d.prov === undefined) {this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]}this.setAlgAndProvider(this.algName, this.provName)}}
}
;
KJUR.crypto.Signature = function (o) {var q = null;var n = null;var r = null;var c = null;var l = null;var d = null;var k = null;var h = null;var p = null;var e = null;var b = -1;var g = null;var j = null;var a = null;var i = null;var f = null;this._setAlgNames = function () {var s = this.algName.match(/^(.+)with(.+)$/);if (s) {this.mdAlgName = s[1].toLowerCase();this.pubkeyAlgName = s[2].toLowerCase()}};this._zeroPaddingOfSignature = function (x, w) {var v = "";var t = w / 4 - x.length;for (var u = 0; u < t; u++) {v = v + "0"}return v + x};this.setAlgAndProvider = function (u, t) {this._setAlgNames();if (t != "cryptojs/jsrsa") {throw "provider not supported: " + t}if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName) != -1) {try {this.md = new KJUR.crypto.MessageDigest({alg: this.mdAlgName})} catch (s) {throw "setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + s}this.init = function (w, x) {var y = null;try {if (x === undefined) {y = KEYUTIL.getKey(w)} else {y = KEYUTIL.getKey(w, x)}} catch (v) {throw "init failed:" + v}if (y.isPrivate === true) {this.prvKey = y;this.state = "SIGN"} else {if (y.isPublic === true) {this.pubKey = y;this.state = "VERIFY"} else {throw "init failed.:" + y}}};this.updateString = function (v) {this.md.updateString(v)};this.updateHex = function (v) {this.md.updateHex(v)};this.sign = function () {this.sHashHex = this.md.digest();if (typeof this.ecprvhex != "undefined" && typeof this.eccurvename != "undefined") {var v = new KJUR.crypto.ECDSA({curve: this.eccurvename});this.hSign = v.signHex(this.sHashHex, this.ecprvhex)} else {if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen)} else {if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName)} else {if (this.prvKey instanceof KJUR.crypto.ECDSA) {this.hSign = this.prvKey.signWithMessageHash(this.sHashHex)} else {if (this.prvKey instanceof KJUR.crypto.DSA) {this.hSign = this.prvKey.signWithMessageHash(this.sHashHex)} else {throw "Signature: unsupported private key alg: " + this.pubkeyAlgName}}}}}return this.hSign};this.signString = function (v) {this.updateString(v);return this.sign()};this.signHex = function (v) {this.updateHex(v);return this.sign()};this.verify = function (v) {this.sHashHex = this.md.digest();if (typeof this.ecpubhex != "undefined" && typeof this.eccurvename != "undefined") {var w = new KJUR.crypto.ECDSA({curve: this.eccurvename});return w.verifyHex(this.sHashHex, v, this.ecpubhex)} else {if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, v, this.mdAlgName, this.pssSaltLen)} else {if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {return this.pubKey.verifyWithMessageHash(this.sHashHex, v)} else {if (KJUR.crypto.ECDSA !== undefined && this.pubKey instanceof KJUR.crypto.ECDSA) {return this.pubKey.verifyWithMessageHash(this.sHashHex, v)} else {if (KJUR.crypto.DSA !== undefined && this.pubKey instanceof KJUR.crypto.DSA) {return this.pubKey.verifyWithMessageHash(this.sHashHex, v)} else {throw "Signature: unsupported public key alg: " + this.pubkeyAlgName}}}}}}}};this.init = function (s, t) {throw "init(key, pass) not supported for this alg:prov=" + this.algProvName};this.updateString = function (s) {throw "updateString(str) not supported for this alg:prov=" + this.algProvName};this.updateHex = function (s) {throw "updateHex(hex) not supported for this alg:prov=" + this.algProvName};this.sign = function () {throw "sign() not supported for this alg:prov=" + this.algProvName};this.signString = function (s) {throw "digestString(str) not supported for this alg:prov=" + this.algProvName};this.signHex = function (s) {throw "digestHex(hex) not supported for this alg:prov=" + this.algProvName};this.verify = function (s) {throw "verify(hSigVal) not supported for this alg:prov=" + this.algProvName};this.initParams = o;if (o !== undefined) {if (o.alg !== undefined) {this.algName = o.alg;if (o.prov === undefined) {this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]} else {this.provName = o.prov}this.algProvName = this.algName + ":" + this.provName;this.setAlgAndProvider(this.algName, this.provName);this._setAlgNames()}if (o.psssaltlen !== undefined) {this.pssSaltLen = o.psssaltlen}if (o.prvkeypem !== undefined) {if (o.prvkeypas !== undefined) {throw "both prvkeypem and prvkeypas parameters not supported"} else {try {var q = KEYUTIL.getKey(o.prvkeypem);this.init(q)} catch (m) {throw "fatal error to load pem private key: " + m}}}}
}
;
KJUR.crypto.Cipher = function (a) {
}
;
KJUR.crypto.Cipher.encrypt = function (e, f, d) {if (f instanceof RSAKey && f.isPublic) {var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);if (c === "RSA") {return f.encrypt(e)}if (c === "RSAOAEP") {return f.encryptOAEP(e, "sha1")}var b = c.match(/^RSAOAEP(\d+)$/);if (b !== null) {return f.encryptOAEP(e, "sha" + b[1])}throw "Cipher.encrypt: unsupported algorithm for RSAKey: " + d} else {throw "Cipher.encrypt: unsupported key or algorithm"}
}
;
KJUR.crypto.Cipher.decrypt = function (e, f, d) {if (f instanceof RSAKey && f.isPrivate) {var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);if (c === "RSA") {return f.decrypt(e)}if (c === "RSAOAEP") {return f.decryptOAEP(e, "sha1")}var b = c.match(/^RSAOAEP(\d+)$/);if (b !== null) {return f.decryptOAEP(e, "sha" + b[1])}throw "Cipher.decrypt: unsupported algorithm for RSAKey: " + d} else {throw "Cipher.decrypt: unsupported key or algorithm"}
}
;
KJUR.crypto.Cipher.getAlgByKeyAndName = function (b, a) {if (b instanceof RSAKey) {if (":RSA:RSAOAEP:RSAOAEP224:RSAOAEP256:RSAOAEP384:RSAOAEP512:".indexOf(a) != -1) {return a}if (a === null || a === undefined) {return "RSA"}throw "getAlgByKeyAndName: not supported algorithm name for RSAKey: " + a}throw "getAlgByKeyAndName: not supported algorithm name: " + a
}
;
KJUR.crypto.OID = new function () {this.oidhex2name = {"2a864886f70d010101": "rsaEncryption","2a8648ce3d0201": "ecPublicKey","2a8648ce380401": "dsa","2a8648ce3d030107": "secp256r1","2b8104001f": "secp192k1","2b81040021": "secp224r1","2b8104000a": "secp256k1","2b81040023": "secp521r1","2b81040022": "secp384r1","2a8648ce380403": "SHA1withDSA","608648016503040301": "SHA224withDSA","608648016503040302": "SHA256withDSA",}
}
;
var KEYUTIL = function () {var d = function (p, r, q) {return k(CryptoJS.AES, p, r, q)};var e = function (p, r, q) {return k(CryptoJS.TripleDES, p, r, q)};var a = function (p, r, q) {return k(CryptoJS.DES, p, r, q)};var k = function (s, x, u, q) {var r = CryptoJS.enc.Hex.parse(x);var w = CryptoJS.enc.Hex.parse(u);var p = CryptoJS.enc.Hex.parse(q);var t = {};t.key = w;t.iv = p;t.ciphertext = r;var v = s.decrypt(t, w, {iv: p});return CryptoJS.enc.Hex.stringify(v)};var l = function (p, r, q) {return g(CryptoJS.AES, p, r, q)};var o = function (p, r, q) {return g(CryptoJS.TripleDES, p, r, q)};var f = function (p, r, q) {return g(CryptoJS.DES, p, r, q)};var g = function (t, y, v, q) {var s = CryptoJS.enc.Hex.parse(y);var x = CryptoJS.enc.Hex.parse(v);var p = CryptoJS.enc.Hex.parse(q);var w = t.encrypt(s, x, {iv: p});var r = CryptoJS.enc.Hex.parse(w.toString());var u = CryptoJS.enc.Base64.stringify(r);return u};var i = {"AES-256-CBC": {proc: d,eproc: l,keylen: 32,ivlen: 16},"AES-192-CBC": {proc: d,eproc: l,keylen: 24,ivlen: 16},"AES-128-CBC": {proc: d,eproc: l,keylen: 16,ivlen: 16},"DES-EDE3-CBC": {proc: e,eproc: o,keylen: 24,ivlen: 8},"DES-CBC": {proc: a,eproc: f,keylen: 8,ivlen: 8}};var c = function (p) {return i[p]["proc"]};var m = function (p) {var r = CryptoJS.lib.WordArray.random(p);var q = CryptoJS.enc.Hex.stringify(r);return q};var n = function (v) {var w = {};var q = v.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"));if (q) {w.cipher = q[1];w.ivsalt = q[2]}var p = v.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"));if (p) {w.type = p[1]}var u = -1;var x = 0;if (v.indexOf("\r\n\r\n") != -1) {u = v.indexOf("\r\n\r\n");x = 2}if (v.indexOf("\n\n") != -1) {u = v.indexOf("\n\n");x = 1}var t = v.indexOf("-----END");if (u != -1 && t != -1) {var r = v.substring(u + x * 2, t - x);r = r.replace(/\s+/g, "");w.data = r}return w};var j = function (q, y, p) {var v = p.substring(0, 16);var t = CryptoJS.enc.Hex.parse(v);var r = CryptoJS.enc.Utf8.parse(y);var u = i[q]["keylen"] + i[q]["ivlen"];var x = "";var w = null;for (; ;) {var s = CryptoJS.algo.MD5.create();if (w != null) {s.update(w)}s.update(r);s.update(t);w = s.finalize();x = x + CryptoJS.enc.Hex.stringify(w);if (x.length >= u * 2) {break}}var z = {};z.keyhex = x.substr(0, i[q]["keylen"] * 2);z.ivhex = x.substr(i[q]["keylen"] * 2, i[q]["ivlen"] * 2);return z};var b = function (p, v, r, w) {var s = CryptoJS.enc.Base64.parse(p);var q = CryptoJS.enc.Hex.stringify(s);var u = i[v]["proc"];var t = u(q, r, w);return t};var h = function (p, s, q, u) {var r = i[s]["eproc"];var t = r(p, q, u);return t};return {version: "1.0.0",parsePKCS5PEM: function (p) {return n(p)},getKeyAndUnusedIvByPasscodeAndIvsalt: function (q, p, r) {return j(q, p, r)},decryptKeyB64: function (p, r, q, s) {return b(p, r, q, s)},getDecryptedKeyHex: function (y, x) {var q = n(y);var t = q.type;var r = q.cipher;var p = q.ivsalt;var s = q.data;var w = j(r, x, p);var v = w.keyhex;var u = b(s, r, v, p);return u},getEncryptedPKCS5PEMFromPrvKeyHex: function (x, s, A, t, r) {var p = "";if (typeof t == "undefined" || t == null) {t = "AES-256-CBC"}if (typeof i[t] == "undefined") {throw "KEYUTIL unsupported algorithm: " + t}if (typeof r == "undefined" || r == null) {var v = i[t]["ivlen"];var u = m(v);r = u.toUpperCase()}var z = j(t, A, r);var y = z.keyhex;var w = h(s, t, y, r);var q = w.replace(/(.{64})/g, "$1\r\n");var p = "-----BEGIN " + x + " PRIVATE KEY-----\r\n";p += "Proc-Type: 4,ENCRYPTED\r\n";p += "DEK-Info: " + t + "," + r + "\r\n";p += "\r\n";p += q;p += "\r\n-----END " + x + " PRIVATE KEY-----\r\n";return p},parseHexOfEncryptedPKCS8: function (y) {var B = ASN1HEX;var z = B.getChildIdx;var w = B.getV;var t = {};var r = z(y, 0);if (r.length != 2) {throw "malformed format: SEQUENCE(0).items != 2: " + r.length}t.ciphertext = w(y, r[1]);var A = z(y, r[0]);if (A.length != 2) {throw "malformed format: SEQUENCE(0.0).items != 2: " + A.length}if (w(y, A[0]) != "2a864886f70d01050d") {throw "this only supports pkcs5PBES2"}var p = z(y, A[1]);if (A.length != 2) {throw "malformed format: SEQUENCE(0.0.1).items != 2: " + p.length}var q = z(y, p[1]);if (q.length != 2) {throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + q.length}if (w(y, q[0]) != "2a864886f70d0307") {throw "this only supports TripleDES"}t.encryptionSchemeAlg = "TripleDES";t.encryptionSchemeIV = w(y, q[1]);var s = z(y, p[0]);if (s.length != 2) {throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + s.length}if (w(y, s[0]) != "2a864886f70d01050c") {throw "this only supports pkcs5PBKDF2"}var x = z(y, s[1]);if (x.length < 2) {throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + x.length}t.pbkdf2Salt = w(y, x[0]);var u = w(y, x[1]);try {t.pbkdf2Iter = parseInt(u, 16)} catch (v) {throw "malformed format pbkdf2Iter: " + u}return t},getPBKDF2KeyHexFromParam: function (u, p) {var t = CryptoJS.enc.Hex.parse(u.pbkdf2Salt);var q = u.pbkdf2Iter;var s = CryptoJS.PBKDF2(p, t, {keySize: 192 / 32,iterations: q});var r = CryptoJS.enc.Hex.stringify(s);return r},_getPlainPKCS8HexFromEncryptedPKCS8PEM: function (x, y) {var r = pemtohex(x, "ENCRYPTED PRIVATE KEY");var p = this.parseHexOfEncryptedPKCS8(r);var u = KEYUTIL.getPBKDF2KeyHexFromParam(p, y);var v = {};v.ciphertext = CryptoJS.enc.Hex.parse(p.ciphertext);var t = CryptoJS.enc.Hex.parse(u);var s = CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);var w = CryptoJS.TripleDES.decrypt(v, t, {iv: s});var q = CryptoJS.enc.Hex.stringify(w);return q},getKeyFromEncryptedPKCS8PEM: function (s, q) {var p = this._getPlainPKCS8HexFromEncryptedPKCS8PEM(s, q);var r = this.getKeyFromPlainPrivatePKCS8Hex(p);return r},parsePlainPrivatePKCS8Hex: function (s) {var v = ASN1HEX;var u = v.getChildIdx;var t = v.getV;var q = {};q.algparam = null;if (s.substr(0, 2) != "30") {throw "malformed plain PKCS8 private key(code:001)"}var r = u(s, 0);if (r.length != 3) {throw "malformed plain PKCS8 private key(code:002)"}if (s.substr(r[1], 2) != "30") {throw "malformed PKCS8 private key(code:003)"}var p = u(s, r[1]);if (p.length != 2) {throw "malformed PKCS8 private key(code:004)"}if (s.substr(p[0], 2) != "06") {throw "malformed PKCS8 private key(code:005)"}q.algoid = t(s, p[0]);if (s.substr(p[1], 2) == "06") {q.algparam = t(s, p[1])}if (s.substr(r[2], 2) != "04") {throw "malformed PKCS8 private key(code:006)"}q.keyidx = v.getVidx(s, r[2]);return q},getKeyFromPlainPrivatePKCS8PEM: function (q) {var p = pemtohex(q, "PRIVATE KEY");var r = this.getKeyFromPlainPrivatePKCS8Hex(p);return r},getKeyFromPlainPrivatePKCS8Hex: function (p) {var q = this.parsePlainPrivatePKCS8Hex(p);var r;if (q.algoid == "2a864886f70d010101") {r = new RSAKey()} else {if (q.algoid == "2a8648ce380401") {r = new KJUR.crypto.DSA()} else {if (q.algoid == "2a8648ce3d0201") {r = new KJUR.crypto.ECDSA()} else {throw "unsupported private key algorithm"}}}r.readPKCS8PrvKeyHex(p);return r},_getKeyFromPublicPKCS8Hex: function (q) {var p;var r = ASN1HEX.getVbyList(q, 0, [0, 0], "06");if (r === "2a864886f70d010101") {p = new RSAKey()} else {if (r === "2a8648ce380401") {p = new KJUR.crypto.DSA()} else {if (r === "2a8648ce3d0201") {p = new KJUR.crypto.ECDSA()} else {throw "unsupported PKCS#8 public key hex"}}}p.readPKCS8PubKeyHex(q);return p},parsePublicRawRSAKeyHex: function (r) {var u = ASN1HEX;var t = u.getChildIdx;var s = u.getV;var p = {};if (r.substr(0, 2) != "30") {throw "malformed RSA key(code:001)"}var q = t(r, 0);if (q.length != 2) {throw "malformed RSA key(code:002)"}if (r.substr(q[0], 2) != "02") {throw "malformed RSA key(code:003)"}p.n = s(r, q[0]);if (r.substr(q[1], 2) != "02") {throw "malformed RSA key(code:004)"}p.e = s(r, q[1]);return p},parsePublicPKCS8Hex: function (t) {var v = ASN1HEX;var u = v.getChildIdx;var s = v.getV;var q = {};q.algparam = null;var r = u(t, 0);if (r.length != 2) {throw "outer DERSequence shall have 2 elements: " + r.length}var w = r[0];if (t.substr(w, 2) != "30") {throw "malformed PKCS8 public key(code:001)"}var p = u(t, w);if (p.length != 2) {throw "malformed PKCS8 public key(code:002)"}if (t.substr(p[0], 2) != "06") {throw "malformed PKCS8 public key(code:003)"}q.algoid = s(t, p[0]);if (t.substr(p[1], 2) == "06") {q.algparam = s(t, p[1])} else {if (t.substr(p[1], 2) == "30") {q.algparam = {};q.algparam.p = v.getVbyList(t, p[1], [0], "02");q.algparam.q = v.getVbyList(t, p[1], [1], "02");q.algparam.g = v.getVbyList(t, p[1], [2], "02")}}if (t.substr(r[1], 2) != "03") {throw "malformed PKCS8 public key(code:004)"}q.key = s(t, r[1]).substr(2);return q},}
}();
KEYUTIL.getKey = function (l, k, n) {var G = ASN1HEX, L = G.getChildIdx, v = G.getV, d = G.getVbyList, c = KJUR.crypto, i = c.ECDSA, C = c.DSA, w = RSAKey, M = pemtohex, F = KEYUTIL;if (typeof w != "undefined" && l instanceof w) {return l}if (typeof i != "undefined" && l instanceof i) {return l}if (typeof C != "undefined" && l instanceof C) {return l}if (l.curve !== undefined && l.xy !== undefined && l.d === undefined) {return new i({pub: l.xy,curve: l.curve})}if (l.curve !== undefined && l.d !== undefined) {return new i({prv: l.d,curve: l.curve})}if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d === undefined) {var P = new w();P.setPublic(l.n, l.e);return P}if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.co !== undefined && l.qi === undefined) {var P = new w();P.setPrivateEx(l.n, l.e, l.d, l.p, l.q, l.dp, l.dq, l.co);return P}if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p === undefined) {var P = new w();P.setPrivate(l.n, l.e, l.d);return P}if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x === undefined) {var P = new C();P.setPublic(l.p, l.q, l.g, l.y);return P}if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x !== undefined) {var P = new C();P.setPrivate(l.p, l.q, l.g, l.y, l.x);return P}if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d === undefined) {var P = new w();P.setPublic(b64utohex(l.n), b64utohex(l.e));return P}if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.qi !== undefined) {var P = new w();P.setPrivateEx(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d), b64utohex(l.p), b64utohex(l.q), b64utohex(l.dp), b64utohex(l.dq), b64utohex(l.qi));return P}if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined) {var P = new w();P.setPrivate(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d));return P}if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d === undefined) {var j = new i({curve: l.crv});var t = j.ecparams.keylen / 4;var B = ("0000000000" + b64utohex(l.x)).slice(-t);var z = ("0000000000" + b64utohex(l.y)).slice(-t);var u = "04" + B + z;j.setPublicKeyHex(u);return j}if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d !== undefined) {var j = new i({curve: l.crv});var t = j.ecparams.keylen / 4;var B = ("0000000000" + b64utohex(l.x)).slice(-t);var z = ("0000000000" + b64utohex(l.y)).slice(-t);var u = "04" + B + z;var b = ("0000000000" + b64utohex(l.d)).slice(-t);j.setPublicKeyHex(u);j.setPrivateKeyHex(b);return j}if (n === "pkcs5prv") {var J = l, G = ASN1HEX, N, P;N = L(J, 0);if (N.length === 9) {P = new w();P.readPKCS5PrvKeyHex(J)} else {if (N.length === 6) {P = new C();P.readPKCS5PrvKeyHex(J)} else {if (N.length > 2 && J.substr(N[1], 2) === "04") {P = new i();P.readPKCS5PrvKeyHex(J)} else {throw "unsupported PKCS#1/5 hexadecimal key"}}}return P}if (n === "pkcs8prv") {var P = F.getKeyFromPlainPrivatePKCS8Hex(l);return P}if (n === "pkcs8pub") {return F._getKeyFromPublicPKCS8Hex(l)}if (n === "x509pub") {return X509.getPublicKeyFromCertHex(l)}if (l.indexOf("-END CERTIFICATE-", 0) != -1 || l.indexOf("-END X509 CERTIFICATE-", 0) != -1 || l.indexOf("-END TRUSTED CERTIFICATE-", 0) != -1) {return X509.getPublicKeyFromCertPEM(l)}if (l.indexOf("-END PUBLIC KEY-") != -1) {var O = pemtohex(l, "PUBLIC KEY");return F._getKeyFromPublicPKCS8Hex(O)}if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {var m = M(l, "RSA PRIVATE KEY");return F.getKey(m, null, "pkcs5prv")}if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {var I = M(l, "DSA PRIVATE KEY");var E = d(I, 0, [1], "02");var D = d(I, 0, [2], "02");var K = d(I, 0, [3], "02");var r = d(I, 0, [4], "02");var s = d(I, 0, [5], "02");var P = new C();P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));return P}if (l.indexOf("-END PRIVATE KEY-") != -1) {return F.getKeyFromPlainPrivatePKCS8PEM(l)}if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {var o = F.getDecryptedKeyHex(l, k);var H = new RSAKey();H.readPKCS5PrvKeyHex(o);return H}if (l.indexOf("-END EC PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {var I = F.getDecryptedKeyHex(l, k);var P = d(I, 0, [1], "04");var f = d(I, 0, [2, 0], "06");var A = d(I, 0, [3, 0], "03").substr(2);var e = "";if (KJUR.crypto.OID.oidhex2name[f] !== undefined) {e = KJUR.crypto.OID.oidhex2name[f]} else {throw "undefined OID(hex) in KJUR.crypto.OID: " + f}var j = new i({curve: e});j.setPublicKeyHex(A);j.setPrivateKeyHex(P);j.isPublic = false;return j}if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {var I = F.getDecryptedKeyHex(l, k);var E = d(I, 0, [1], "02");var D = d(I, 0, [2], "02");var K = d(I, 0, [3], "02");var r = d(I, 0, [4], "02");var s = d(I, 0, [5], "02");var P = new C();P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));return P}if (l.indexOf("-END ENCRYPTED PRIVATE KEY-") != -1) {return F.getKeyFromEncryptedPKCS8PEM(l, k)}throw "not supported argument"
}
;
KEYUTIL.generateKeypair = function (a, c) {if (a == "RSA") {var b = c;var h = new RSAKey();h.generate(b, "10001");h.isPrivate = true;h.isPublic = true;var f = new RSAKey();var e = h.n.toString(16);var i = h.e.toString(16);f.setPublic(e, i);f.isPrivate = false;f.isPublic = true;var k = {};k.prvKeyObj = h;k.pubKeyObj = f;return k} else {if (a == "EC") {var d = c;var g = new KJUR.crypto.ECDSA({curve: d});var j = g.generateKeyPairHex();var h = new KJUR.crypto.ECDSA({curve: d});h.setPublicKeyHex(j.ecpubhex);h.setPrivateKeyHex(j.ecprvhex);h.isPrivate = true;h.isPublic = false;var f = new KJUR.crypto.ECDSA({curve: d});f.setPublicKeyHex(j.ecpubhex);f.isPrivate = false;f.isPublic = true;var k = {};k.prvKeyObj = h;k.pubKeyObj = f;return k} else {throw "unknown algorithm: " + a}}
}
;
KEYUTIL.getPEM = function (b, D, y, m, q, j) {var F = KJUR, k = F.asn1, z = k.DERObjectIdentifier, f = k.DERInteger, l = k.ASN1Util.newObject, a = k.x509, C = a.SubjectPublicKeyInfo, e = F.crypto, u = e.DSA, r = e.ECDSA, n = RSAKey;function A(s) {var G = l({seq: [{"int": 0}, {"int": {bigint: s.n}}, {"int": s.e}, {"int": {bigint: s.d}}, {"int": {bigint: s.p}}, {"int": {bigint: s.q}}, {"int": {bigint: s.dmp1}}, {"int": {bigint: s.dmq1}}, {"int": {bigint: s.coeff}}]});return G}function B(G) {var s = l({seq: [{"int": 1}, {octstr: {hex: G.prvKeyHex}}, {tag: ["a0", true, {oid: {name: G.curveName}}]}, {tag: ["a1", true, {bitstr: {hex: "00" + G.pubKeyHex}}]}]});return s}function x(s) {var G = l({seq: [{"int": 0}, {"int": {bigint: s.p}}, {"int": {bigint: s.q}}, {"int": {bigint: s.g}}, {"int": {bigint: s.y}}, {"int": {bigint: s.x}}]});return G}if (((n !== undefined && b instanceof n) || (u !== undefined && b instanceof u) || (r !== undefined && b instanceof r)) && b.isPublic == true && (D === undefined || D == "PKCS8PUB")) {var E = new C(b);var w = E.getEncodedHex();return hextopem(w, "PUBLIC KEY")}if (D == "PKCS1PRV" && n !== undefined && b instanceof n && (y === undefined || y == null) && b.isPrivate == true) {var E = A(b);var w = E.getEncodedHex();return hextopem(w, "RSA PRIVATE KEY")}if (D == "PKCS1PRV" && r !== undefined && b instanceof r && (y === undefined || y == null) && b.isPrivate == true) {var i = new z({name: b.curveName});var v = i.getEncodedHex();var h = B(b);var t = h.getEncodedHex();var p = "";p += hextopem(v, "EC PARAMETERS");p += hextopem(t, "EC PRIVATE KEY");return p}if (D == "PKCS1PRV" && u !== undefined && b instanceof u && (y === undefined || y == null) && b.isPrivate == true) {var E = x(b);var w = E.getEncodedHex();return hextopem(w, "DSA PRIVATE KEY")}if (D == "PKCS5PRV" && n !== undefined && b instanceof n && (y !== undefined && y != null) && b.isPrivate == true) {var E = A(b);var w = E.getEncodedHex();if (m === undefined) {m = "DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", w, y, m, j)}if (D == "PKCS5PRV" && r !== undefined && b instanceof r && (y !== undefined && y != null) && b.isPrivate == true) {var E = B(b);var w = E.getEncodedHex();if (m === undefined) {m = "DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC", w, y, m, j)}if (D == "PKCS5PRV" && u !== undefined && b instanceof u && (y !== undefined && y != null) && b.isPrivate == true) {var E = x(b);var w = E.getEncodedHex();if (m === undefined) {m = "DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA", w, y, m, j)}var o = function (G, s) {var I = c(G, s);var H = new l({seq: [{seq: [{oid: {name: "pkcs5PBES2"}}, {seq: [{seq: [{oid: {name: "pkcs5PBKDF2"}}, {seq: [{octstr: {hex: I.pbkdf2Salt}}, {"int": I.pbkdf2Iter}]}]}, {seq: [{oid: {name: "des-EDE3-CBC"}}, {octstr: {hex: I.encryptionSchemeIV}}]}]}]}, {octstr: {hex: I.ciphertext}}]});return H.getEncodedHex()};var c = function (N, O) {var H = 100;var M = CryptoJS.lib.WordArray.random(8);var L = "DES-EDE3-CBC";var s = CryptoJS.lib.WordArray.random(8);var I = CryptoJS.PBKDF2(O, M, {keySize: 192 / 32,iterations: H});var J = CryptoJS.enc.Hex.parse(N);var K = CryptoJS.TripleDES.encrypt(J, I, {iv: s}) + "";var G = {};G.ciphertext = K;G.pbkdf2Salt = CryptoJS.enc.Hex.stringify(M);G.pbkdf2Iter = H;G.encryptionSchemeAlg = L;G.encryptionSchemeIV = CryptoJS.enc.Hex.stringify(s);return G};if (D == "PKCS8PRV" && n != undefined && b instanceof n && b.isPrivate == true) {var g = A(b);var d = g.getEncodedHex();var E = l({seq: [{"int": 0}, {seq: [{oid: {name: "rsaEncryption"}}, {"null": true}]}, {octstr: {hex: d}}]});var w = E.getEncodedHex();if (y === undefined || y == null) {return hextopem(w, "PRIVATE KEY")} else {var t = o(w, y);return hextopem(t, "ENCRYPTED PRIVATE KEY")}}if (D == "PKCS8PRV" && r !== undefined && b instanceof r && b.isPrivate == true) {var g = new l({seq: [{"int": 1}, {octstr: {hex: b.prvKeyHex}}, {tag: ["a1", true, {bitstr: {hex: "00" + b.pubKeyHex}}]}]});var d = g.getEncodedHex();var E = l({seq: [{"int": 0}, {seq: [{oid: {name: "ecPublicKey"}}, {oid: {name: b.curveName}}]}, {octstr: {hex: d}}]});var w = E.getEncodedHex();if (y === undefined || y == null) {return hextopem(w, "PRIVATE KEY")} else {var t = o(w, y);return hextopem(t, "ENCRYPTED PRIVATE KEY")}}if (D == "PKCS8PRV" && u !== undefined && b instanceof u && b.isPrivate == true) {var g = new f({bigint: b.x});var d = g.getEncodedHex();var E = l({seq: [{"int": 0}, {seq: [{oid: {name: "dsa"}}, {seq: [{"int": {bigint: b.p}}, {"int": {bigint: b.q}}, {"int": {bigint: b.g}}]}]}, {octstr: {hex: d}}]});var w = E.getEncodedHex();if (y === undefined || y == null) {return hextopem(w, "PRIVATE KEY")} else {var t = o(w, y);return hextopem(t, "ENCRYPTED PRIVATE KEY")}}throw "unsupported object nor format"
}
;
KEYUTIL.getKeyFromCSRPEM = function (b) {var a = pemtohex(b, "CERTIFICATE REQUEST");var c = KEYUTIL.getKeyFromCSRHex(a);return c
}
;
KEYUTIL.getKeyFromCSRHex = function (a) {var c = KEYUTIL.parseCSRHex(a);var b = KEYUTIL.getKey(c.p8pubkeyhex, null, "pkcs8pub");return b
}
;
KEYUTIL.parseCSRHex = function (d) {var i = ASN1HEX;var f = i.getChildIdx;var c = i.getTLV;var b = {};var g = d;if (g.substr(0, 2) != "30") {throw "malformed CSR(code:001)"}var e = f(g, 0);if (e.length < 1) {throw "malformed CSR(code:002)"}if (g.substr(e[0], 2) != "30") {throw "malformed CSR(code:003)"}var a = f(g, e[0]);if (a.length < 3) {throw "malformed CSR(code:004)"}b.p8pubkeyhex = c(g, a[2]);return b
}
;
KEYUTIL.getJWKFromKey = function (d) {var b = {};if (d instanceof RSAKey && d.isPrivate) {b.kty = "RSA";b.n = hextob64u(d.n.toString(16));b.e = hextob64u(d.e.toString(16));b.d = hextob64u(d.d.toString(16));b.p = hextob64u(d.p.toString(16));b.q = hextob64u(d.q.toString(16));b.dp = hextob64u(d.dmp1.toString(16));b.dq = hextob64u(d.dmq1.toString(16));b.qi = hextob64u(d.coeff.toString(16));return b} else {if (d instanceof RSAKey && d.isPublic) {b.kty = "RSA";b.n = hextob64u(d.n.toString(16));b.e = hextob64u(d.e.toString(16));return b} else {if (d instanceof KJUR.crypto.ECDSA && d.isPrivate) {var a = d.getShortNISTPCurveName();if (a !== "P-256" && a !== "P-384") {throw "unsupported curve name for JWT: " + a}var c = d.getPublicKeyXYHex();b.kty = "EC";b.crv = a;b.x = hextob64u(c.x);b.y = hextob64u(c.y);b.d = hextob64u(d.prvKeyHex);return b} else {if (d instanceof KJUR.crypto.ECDSA && d.isPublic) {var a = d.getShortNISTPCurveName();if (a !== "P-256" && a !== "P-384") {throw "unsupported curve name for JWT: " + a}var c = d.getPublicKeyXYHex();b.kty = "EC";b.crv = a;b.x = hextob64u(c.x);b.y = hextob64u(c.y);return b}}}}throw "not supported key object"
}
;
RSAKey.getPosArrayOfChildrenFromHex = function (a) {return ASN1HEX.getChildIdx(a, 0)
}
;
RSAKey.getHexValueArrayOfChildrenFromHex = function (f) {var n = ASN1HEX;var i = n.getV;var k = RSAKey.getPosArrayOfChildrenFromHex(f);var e = i(f, k[0]);var j = i(f, k[1]);var b = i(f, k[2]);var c = i(f, k[3]);var h = i(f, k[4]);var g = i(f, k[5]);var m = i(f, k[6]);var l = i(f, k[7]);var d = i(f, k[8]);var k = new Array();k.push(e, j, b, c, h, g, m, l, d);return k
}
;
RSAKey.prototype.readPrivateKeyFromPEMString = function (d) {var c = pemtohex(d);var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
}
;
RSAKey.prototype.readPKCS5PrvKeyHex = function (c) {var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
}
;
RSAKey.prototype.readPKCS8PrvKeyHex = function (e) {var c, j, l, b, a, f, d, k;var m = ASN1HEX;var g = m.getVbyList;if (m.isASN1HEX(e) === false) {throw "not ASN.1 hex string"}try {c = g(e, 0, [2, 0, 1], "02");j = g(e, 0, [2, 0, 2], "02");l = g(e, 0, [2, 0, 3], "02");b = g(e, 0, [2, 0, 4], "02");a = g(e, 0, [2, 0, 5], "02");f = g(e, 0, [2, 0, 6], "02");d = g(e, 0, [2, 0, 7], "02");k = g(e, 0, [2, 0, 8], "02")} catch (i) {throw "malformed PKCS#8 plain RSA private key"}this.setPrivateEx(c, j, l, b, a, f, d, k)
}
;
RSAKey.prototype.readPKCS5PubKeyHex = function (c) {var e = ASN1HEX;var b = e.getV;if (e.isASN1HEX(c) === false) {throw "keyHex is not ASN.1 hex string"}var a = e.getChildIdx(c, 0);if (a.length !== 2 || c.substr(a[0], 2) !== "02" || c.substr(a[1], 2) !== "02") {throw "wrong hex for PKCS#5 public key"}var f = b(c, a[0]);var d = b(c, a[1]);this.setPublic(f, d)
}
;
RSAKey.prototype.readPKCS8PubKeyHex = function (b) {var c = ASN1HEX;if (c.isASN1HEX(b) === false) {throw "not ASN.1 hex string"}if (c.getTLVbyList(b, 0, [0, 0]) !== "06092a864886f70d010101") {throw "not PKCS8 RSA public key"}var a = c.getTLVbyList(b, 0, [1, 0]);this.readPKCS5PubKeyHex(a)
}
;
RSAKey.prototype.readCertPubKeyHex = function (b, d) {var a, c;a = new X509();a.readCertHex(b);c = a.getPublicKeyHex();this.readPKCS8PubKeyHex(c)
}
;
var _RE_HEXDECONLY = new RegExp("");
_RE_HEXDECONLY.compile("[^0-9a-f]", "gi");function _rsasign_getHexPaddedDigestInfoForString(d, e, a) {var b = function (f) {return KJUR.crypto.Util.hashString(f, a)};var c = b(d);return KJUR.crypto.Util.getPaddedDigestInfoHex(c, a, e)
}function _zeroPaddingOfSignature(e, d) {var c = "";var a = d / 4 - e.length;for (var b = 0; b < a; b++) {c = c + "0"}return c + e
}RSAKey.prototype.sign = function (d, a) {var b = function (e) {return KJUR.crypto.Util.hashString(e, a)};var c = b(d);return this.signWithMessageHash(c, a)
}
;
RSAKey.prototype.signWithMessageHash = function (e, c) {var f = KJUR.crypto.Util.getPaddedDigestInfoHex(e, c, this.n.bitLength());var b = parseBigInt(f, 16);var d = this.doPrivate(b);var a = d.toString(16);return _zeroPaddingOfSignature(a, this.n.bitLength())
}
;function pss_mgf1_str(c, a, e) {var b = "", d = 0;while (b.length < a) {b += hextorstr(e(rstrtohex(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]))));d += 1}return b
}RSAKey.prototype.signPSS = function (e, a, d) {var c = function (f) {return KJUR.crypto.Util.hashHex(f, a)};var b = c(rstrtohex(e));if (d === undefined) {d = -1}return this.signWithMessageHashPSS(b, a, d)
}
;
RSAKey.prototype.signWithMessageHashPSS = function (l, a, k) {var b = hextorstr(l);var g = b.length;var m = this.n.bitLength() - 1;var c = Math.ceil(m / 8);var d;var o = function (i) {return KJUR.crypto.Util.hashHex(i, a)};if (k === -1 || k === undefined) {k = g} else {if (k === -2) {k = c - g - 2} else {if (k < -2) {throw "invalid salt length"}}}if (c < (g + k + 2)) {throw "data too long"}var f = "";if (k > 0) {f = new Array(k);new SecureRandom().nextBytes(f);f = String.fromCharCode.apply(String, f)}var n = hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + b + f)));var j = [];for (d = 0; d < c - k - g - 2; d += 1) {j[d] = 0}var e = String.fromCharCode.apply(String, j) + "\x01" + f;var h = pss_mgf1_str(n, e.length, o);var q = [];for (d = 0; d < e.length; d += 1) {q[d] = e.charCodeAt(d) ^ h.charCodeAt(d)}var p = (65280 >> (8 * c - m)) & 255;q[0] &= ~p;for (d = 0; d < g; d++) {q.push(n.charCodeAt(d))}q.push(188);return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16), this.n.bitLength())
}
;function _rsasign_getDecryptSignatureBI(a, d, c) {var b = new RSAKey();b.setPublic(d, c);var e = b.doPublic(a);return e
}function _rsasign_getHexDigestInfoFromSig(a, c, b) {var e = _rsasign_getDecryptSignatureBI(a, c, b);var d = e.toString(16).replace(/^1f+00/, "");return d
}function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f) {for (var e in KJUR.crypto.Util.DIGESTINFOHEAD) {var d = KJUR.crypto.Util.DIGESTINFOHEAD[e];var b = d.length;if (f.substring(0, b) == d) {var c = [e, f.substring(b)];return c}}return []
}RSAKey.prototype.verify = function (f, j) {j = j.replace(_RE_HEXDECONLY, "");j = j.replace(/[ \n]+/g, "");var b = parseBigInt(j, 16);if (b.bitLength() > this.n.bitLength()) {return 0}var i = this.doPublic(b);var e = i.toString(16).replace(/^1f+00/, "");var g = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if (g.length == 0) {return false}var d = g[0];var h = g[1];var a = function (k) {return KJUR.crypto.Util.hashString(k, d)};var c = a(f);return (h == c)
}
;
RSAKey.prototype.verifyWithMessageHash = function (e, a) {a = a.replace(_RE_HEXDECONLY, "");a = a.replace(/[ \n]+/g, "");var b = parseBigInt(a, 16);if (b.bitLength() > this.n.bitLength()) {return 0}var h = this.doPublic(b);var g = h.toString(16).replace(/^1f+00/, "");var c = _rsasign_getAlgNameAndHashFromHexDisgestInfo(g);if (c.length == 0) {return false}var d = c[0];var f = c[1];return (f == e)
}
;
RSAKey.prototype.verifyPSS = function (c, b, a, f) {var e = function (g) {return KJUR.crypto.Util.hashHex(g, a)};var d = e(rstrtohex(c));if (f === undefined) {f = -1}return this.verifyWithMessageHashPSS(d, b, a, f)
}
;
RSAKey.prototype.verifyWithMessageHashPSS = function (f, s, l, c) {var k = new BigInteger(s, 16);if (k.bitLength() > this.n.bitLength()) {return false}var r = function (i) {return KJUR.crypto.Util.hashHex(i, l)};var j = hextorstr(f);var h = j.length;var g = this.n.bitLength() - 1;var m = Math.ceil(g / 8);var q;if (c === -1 || c === undefined) {c = h} else {if (c === -2) {c = m - h - 2} else {if (c < -2) {throw "invalid salt length"}}}if (m < (h + c + 2)) {throw "data too long"}var a = this.doPublic(k).toByteArray();for (q = 0; q < a.length; q += 1) {a[q] &= 255}while (a.length < m) {a.unshift(0)}if (a[m - 1] !== 188) {throw "encoded message does not end in 0xbc"}a = String.fromCharCode.apply(String, a);var d = a.substr(0, m - h - 1);var e = a.substr(d.length, h);var p = (65280 >> (8 * m - g)) & 255;if ((d.charCodeAt(0) & p) !== 0) {throw "bits beyond keysize not zero"}var n = pss_mgf1_str(e, d.length, r);var o = [];for (q = 0; q < d.length; q += 1) {o[q] = d.charCodeAt(q) ^ n.charCodeAt(q)}o[0] &= ~p;var b = m - h - c - 2;for (q = 0; q < b; q += 1) {if (o[q] !== 0) {throw "leftmost octets not zero"}}if (o[b] !== 1) {throw "0x01 marker not found"}return e === hextorstr(r(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + j + String.fromCharCode.apply(String, o.slice(-c)))))
}
;
RSAKey.SALT_LEN_HLEN = -1;
RSAKey.SALT_LEN_MAX = -2;
RSAKey.SALT_LEN_RECOVER = -2;var _0xod3 = "jsjiami.com.v7";// 包含大数组的函数
function _0x4921() {var _0x308272 = (function () {return [_0xod3, "ewjknsDjpELiaOxmrPiU.POtcMPuoNemeWX.klv7==", "W6pcH8kHWRq", "WOtdJaRcHSoWcG", "W5KQWQBdHmkUWRT3Fa", "gCoKWRy", "W75cwW1D", "gNZdO8o+Ca", "W63cI8obyCkltuNdRq", "W7u4WPbLvW", "sN0qvfqsD1iH", "WOv8heZdG2q", "W5usWQ3cLCof", "u8omW5tcHZC", "CSkLFsO", "WQy3WPxdGmk+irVcU8ocW6a9tHq", "5RkC772D6Act6z6F6zss576z5AE05lMe5zEg772c6zYz6kwF5yMf5PET5OQW6iok6i2x5y6O5Q6o5BUt5Ps+5O2c44cC", "c3LSW74NW6e", "tmorW7hcGWZcGa", "WP/cPeHXW5e", "iaqdWORcKG", "WOVdMX3cKCoWdq", "jCoXnIC2A8ogf2/cJvy", "5P2055Ud5B2K", "dcjmaazckaivWPzPWPpcRWW", "ecifWO/cMCkhWQO", "W6xdJSkqW5tcGW", "WRuzW7f4WPhdGGK", "WR7cT05/W7xdRSkT", "WQRdLCkQjmonhrBcV8oLvaivmvm", "W6SuWOhcTgWnW4FdPYyYsWmmfSk8rqjbzW", "gb8TWRlcOW", "WOK7cmo9wG", "z8kmwY1k", "hSoCWOhdVSkU", "W5NdJwNcKLa", "WRz7dCosi1ldRW", "gxWNp8oVW49+WPa", "WORcGWdcPmo2amkjweyv", "WPyqFW", "5RgY77YC5Oks6k6r6zst55Q65PAe5O+v5BwE5lQx5AAY77+M6z+R6kA65yQi5PAE5OIL6icE5Q+h5BQv6k6o6zAw44cR", "W5VdIx3cK1b+W5O", "WQ3cLSoxWPtcJ8kFW5q8qsK", "W5ZcTYyKWQ40W48", "E8kVnY4dsmoqia", "m8oxvCkl", "W4e8WRxdGa", "CSoUW5FcGIW", "WO8bW5OWqxea", "W7JcOG3cMX4IW7n6WQf3iCo5", "W5XnCbHi", "WOhdMIxcJCoHemkN", "WPqtW6u", "W5bXbNZdIMFdOq", "iSkexg5V", "W6/cTqZcRr8", "iSosWQfqpW", "WQBdJXKSWOa", "WOzlW77dKCkausn7W6agsCkysq", "WO9Jfa", "WQ/dONzVW7P0W5/dUCkkqvDIWQC", "W6z2W4THiWC", "6k255Rk25yYP5PsQ5B2e5l2O", "W5lcHmkxWRJdJW", "W4CBWRZcT8oeahHcW5e1qmkI", "W4ddN1RcJvb/W4y", "WOOCbSo3vaddLW"].concat((function () {return ["W5/cSXJdKW", "W4/cHmkBD8oio8oEW4dcOKVcJ8kS", "W7ion2jW", "W7qioG", "FCkaW6hcQSoPWOJcHatcNmk7DcldPq", "W63cPYuLWR80", "WQiHtCowW6m", "emo7umkiuG", "WPhcG8oTWP/dS2a", "WPJcNhBcKufcW4fl", "WQGpamoEqW", "o8o5dMGo", "DgCsCLS", "Ffe3", "o8owuG", "WOWfW5OdCMCcm8oCWPNcTa7cK8o0WRncca", "W7FcOqy6WQ40WPS", "W7VcOdu5WRK", "bZmuWPtcJSkqWRDNW5K", "WR3dHCosBmkYF8ofW4xcPwdcVmklW7K", "W6NcQbhcGbGP", "dxhdHmkn", "cSoSi0ii", "5O285y6k5B2N5BQS77YR6l6N5zM656Ml5lYR5OgU", "W790sehcJW", "W7VdQSksW4pcJa", "W5ZcKY8hWOC", "vrDaW7ldQa", "WOGDW6y", "WRWhbG", "WOLgW5VdIcXTWPtdJb4ryJ4K", "W4JcVJ/cOcq", "WQjoBSkgW6hcJSodd8kOWP8nDW", "WQNcOKH3W43dRmk2WQLE", "WOldKJGaWRy", "W7uoWRJdISoNb2zyW5SrsW", "WP5nDZLfpw0", "WR7dMchcLSoq", "WRSma8o7qXBdT1tcPgu", "ECkJDtT4WPtcVLJcKLe0W4RcUKi", "ssX3zSkSWPKpWQ7cMCoHW41upG", "WQ3cMmkIACoiwbldTSkgr30", "WP4qW4OWy3eHkmoaWOpcVYe", "W55Ja0/dJcJdO8kfWQ9PqmohquhdRSo6WOaYW6OQWR7cQSkoW4rInSobdmkcAq3cTCkKzq3cU8oKWQ/dPCkYW7/dSwhdMmoDsmoovmoAna/cIv7dQCoCzeG", "W5e5WPTKrG", "W5PIW5FcISoUDe4", "W4yUWPP+wmkk", "fSoizG", "WQRcPrNcI8ox", "WO18W7dcLSkZWRnHEWev", "W5unWRhcICos", "zuRdRmkVda", "6lo155EoW6JcT8o1wmoDFCoP5yEi6zAl77YR57+R5BgQ5BYf6ksV5y2k5Pw/W7OwvHVcMCkgyG7dON7cRSkbWRNcI8kGWPNKUkpLR47PKylNMQlLHAK", "W50GWQtdGCk/WQbR", "W79OwvZcHe7cGa", "A8kLw2W9cdZcQmkL", "kSkPx3XdWQym", "wCo6hcWBW78CW71fWQBdTsi", "pxFdKmoAvW", "W7C6WPZcGCo+", "WOBcH8oRWQFdSW", "DdeYWQzMW5dcKwRdSwBdQmo5EmozuvldPmkYiH/cQ8o0Emk6W5m", "W6RcLmo+Fmkn", "rLxdPSk5jG", "B1BdSSk5p2RdQtdcM8omW7u", "hmozWRVdQ8oP", "BmorW67cMqhcKa"].concat((function () {return ["WOdcMthcOmo2amkj", "wN0xq0SlBq", "WOFdHWJcMmoudCkGgmkZehlcUZm", "gSo0os1a", "uczsW4JdPG", "W6P0W4TUgW0Sr28", "WP8nALpcNa", "ohb6W7K/", "gmorWOy/WOfyWQy", "W44yWONcM3e", "W6OoWQRcPM0", "W5jJqG", "W5O6WQNcQSoj", "WQ0gpCoJya", "W6BdUuLUW4ldPCoH", "WOpcJsJcG8oY", "sCoAW63cKCkFASkCWP9QWOaXsd1j", "W7Lyzfm", "W4qFWRRcLmou", "W5lcJCkJWQpdMSouWPe", "WOBdTs4sWPi", "mmoPpcOa", "W70EfvPD", "t3igqLC", "s8kvomkEWPTTW4lcSGBcO8kTce4", "g8kIt3HmWQmrW5Pa", "W4hcSXJcQbG", "WPJdIbBcKSoH", "W4CGWRBdLCk1WRXRDZWaW4dcRa", "b8k/zg1pWQq", "lb/dT8o6zW", "W6bQW40", "W7KFWO/dI8kB", "mSoNngiWWQtcQ3dcQgTqW7VcNgOFoCkJCfDtDc5Zf8kGptBdJW", "WQy3WPtcJ8oiruhcGCoa", "W63cTZmeWQ43WPRdJSkOzfv1WPpdK8oVW4y", "W7GipuXWsSoh", "6Ao76z6w5Bsz6l6D5P6E772e6kYe5yQ75Pw96k6t6zsi77+d", "kSo0gwKF", "iWldMmo+t8ksWOzk", "hSkTww5p", "WOJcS0LRW4/dVW", "WRK5W5e", "W68AWPpcK3y", "tSovW7K", "kCoaWQRdNSkW", "W6BdISkwW7xcG8kpW5GWwY3cUmo3W4JcQwr9", "W7FdISkeW4JcLmkBW6S7", "WPSifSoXb0C", "WO0JtCkA", "WPW/xmorW4W", "W4NcTSo/Fmks", "W7HVzXXF", "W6rOW4TYiW", "l3mTnSoz", "WRnvb2tdMW", "ntCwW5dcRCkcWQ11WO0cDSk5gZm", "WP/cNc7dL0buW5DlBSoT", "W6n+AwFcJa", "w8ogW6/cGX8", "kwBdGCo0t1bm", "6zwT6k6O5O6256Eh", "WR0oW7bKWOi", "DSk5vJ94WOG", "nNjZW7iBW7RcRfRcNvNdNCozqa"];}()));}()));}());_0x4921 = function () {return _0x308272;};return _0x4921();
}(function (_0x19c416, _0x7fa9f8, _0x17c6d9, _0x5d0b17, _0x3d1bc3, _0x1e1533, _0x1100ff) {return _0x19c416 = _0x19c416 >> 1,_0x1e1533 = "hs",_0x1100ff = "hs",function (_0x1eb9bb, _0x1ebd1c, _0x18607d, _0x4768e4, _0x424aff) {var _0x334260 = _0x17f1;_0x4768e4 = "tfi",_0x1e1533 = _0x4768e4 + _0x1e1533,_0x424aff = "up",_0x1100ff += _0x424aff,_0x1e1533 = _0x18607d(_0x1e1533),_0x1100ff = _0x18607d(_0x1100ff),_0x18607d = 0;var _0x5d0a2a = _0x1eb9bb();while (!![] && --_0x5d0b17 + _0x1ebd1c) {try {_0x4768e4 = -parseInt(_0x334260(515, "8E1C")) / 1 * (parseInt(_0x334260(508, "(Ww7")) / 2) + -parseInt(_0x334260(562, "P30[")) / 3 + -parseInt(_0x334260(552, "Z8gj")) / 4 + parseInt(_0x334260(531, "VSia")) / 5 * (parseInt(_0x334260(526, "0HdB")) / 6) + -parseInt(_0x334260(571, "vRmk")) / 7 * (parseInt(_0x334260(449, "VSia")) / 8) + -parseInt(_0x334260(579, "qXik")) / 9 * (-parseInt(_0x334260(426, "$DhP")) / 10) + parseInt(_0x334260(479, "&sYj")) / 11;} catch (_0x42a1a2) {_0x4768e4 = _0x18607d;} finally {_0x424aff = _0x5d0a2a[_0x1e1533]();if (_0x19c416 <= _0x5d0b17) {_0x18607d ? _0x3d1bc3 ? _0x4768e4 = _0x424aff : _0x3d1bc3 = _0x424aff : _0x18607d = _0x424aff;} else {if (_0x18607d == _0x3d1bc3.replace(/[tMWUXwLONnpuDePErxkl=]/g, "")) {if (_0x4768e4 === _0x1ebd1c) {_0x5d0a2a["un" + _0x1e1533](_0x424aff);break;}_0x5d0a2a[_0x1100ff](_0x424aff);}}}}}(_0x17c6d9, _0x7fa9f8, function (_0x3a1bd7, _0x6f65a1, _0x2cd863, _0x571926, _0x21e19a, _0x3702ac, _0x258624) {return _0x6f65a1 = "\x73\x70\x6c\x69\x74",_0x3a1bd7 = arguments[0],_0x3a1bd7 = _0x3a1bd7[_0x6f65a1](""),_0x2cd863 = "\x72\x65\x76\x65\x72\x73\x65",_0x3a1bd7 = _0x3a1bd7[_0x2cd863]("\x76"),_0x571926 = "\x6a\x6f\x69\x6e",(1579292,_0x3a1bd7[_0x571926](""));});
}(384, 533749, _0x4921, 194),_0x4921) && (_0xod3 = 194);// 解密函数
function _0x17f1(_0x131990, _0x5cb106) {var _0x4921e1 = _0x4921();return _0x17f1 = function (_0x17f1d0, _0x6442f9) {_0x17f1d0 = _0x17f1d0 - 410;var _0x190de7 = _0x4921e1[_0x17f1d0];if (_0x17f1.FVQFvP === undefined) {var _0x4ee09e = function (_0x4c36a8) {var _0x59f818 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=";var _0x4884e8 = "", _0x53d869 = "";for (var _0x585cf0 = 0, _0x5f4126, _0x1a335c, _0x719c2a = 0; _0x1a335c = _0x4c36a8.charAt(_0x719c2a++); ~_0x1a335c && (_0x5f4126 = _0x585cf0 % 4 ? _0x5f4126 * 64 + _0x1a335c : _0x1a335c,_0x585cf0++ % 4) ? _0x4884e8 += String.fromCharCode(255 & _0x5f4126 >> (-2 * _0x585cf0 & 6)) : 0) {_0x1a335c = _0x59f818.indexOf(_0x1a335c);}for (var _0x579840 = 0, _0x2f2f0e = _0x4884e8.length; _0x579840 < _0x2f2f0e; _0x579840++) {_0x53d869 += "%" + ("00" + _0x4884e8.charCodeAt(_0x579840)["toString"](16))["slice"](-2);}return decodeURIComponent(_0x53d869);};var _0xbfedbe = function (_0x503b9b, _0x34d208) {var _0x195848 = [], _0x4ba104 = 0, _0x4f1b92, _0x17a319 = "";_0x503b9b = _0x4ee09e(_0x503b9b);var _0x106d86;for (_0x106d86 = 0; _0x106d86 < 256; _0x106d86++) {_0x195848[_0x106d86] = _0x106d86;}for (_0x106d86 = 0; _0x106d86 < 256; _0x106d86++) {_0x4ba104 = (_0x4ba104 + _0x195848[_0x106d86] + _0x34d208.charCodeAt(_0x106d86 % _0x34d208.length)) % 256,_0x4f1b92 = _0x195848[_0x106d86],_0x195848[_0x106d86] = _0x195848[_0x4ba104],_0x195848[_0x4ba104] = _0x4f1b92;}_0x106d86 = 0,_0x4ba104 = 0;for (var _0x141859 = 0; _0x141859 < _0x503b9b.length; _0x141859++) {_0x106d86 = (_0x106d86 + 1) % 256,_0x4ba104 = (_0x4ba104 + _0x195848[_0x106d86]) % 256,_0x4f1b92 = _0x195848[_0x106d86],_0x195848[_0x106d86] = _0x195848[_0x4ba104],_0x195848[_0x4ba104] = _0x4f1b92,_0x17a319 += String.fromCharCode(_0x503b9b.charCodeAt(_0x141859) ^ _0x195848[(_0x195848[_0x106d86] + _0x195848[_0x4ba104]) % 256]);}return _0x17a319;};_0x17f1.RUMWGN = _0xbfedbe,_0x131990 = arguments,_0x17f1.FVQFvP = !![];}var _0x2221af = _0x4921e1[0], _0x5eb458 = _0x17f1d0 + _0x2221af, _0xa5b197 = _0x131990[_0x5eb458];return !_0xa5b197 ? (_0x17f1.XKeniu === undefined && (_0x17f1.XKeniu = !![]),_0x190de7 = _0x17f1.RUMWGN(_0x190de7, _0x6442f9),_0x131990[_0x5eb458] = _0x190de7) : _0x190de7 = _0xa5b197,_0x190de7;},_0x17f1(_0x131990, _0x5cb106);
}_0x595165 = function (_0x4d373a, key, iv) {var _0x4633f5 = _0x17f1, _0x9cc440 = CryptoJS[_0x4633f5(536, "F8#f")]["Utf8"][_0x4633f5(430, "C*0S")](key), _0x989408 = CryptoJS.enc[_0x4633f5(522, "2MxW")][_0x4633f5(415, "&sYj")](iv), _0x12f1ea = "", _0x2dd779 = CryptoJS.enc[_0x4633f5(543, "v6Q*")][_0x4633f5(505, "KD8R")](_0x4d373a);return _0x12f1ea = CryptoJS.AES[_0x4633f5(590, "&sYj")](_0x2dd779, _0x9cc440, {iv: _0x989408,mode: CryptoJS[_0x4633f5(469, "#e0X")]["CBC"],padding: CryptoJS[_0x4633f5(436, "s1fn")][_0x4633f5(587, "0HdB")]}),_0x12f1ea[_0x4633f5(493, "F9mF")]["toString"]();
}var _0xa6527a = _0x17f1
_0x55c569 = {PRmik: function (_0x3da31, _0x5cafab) {return _0x3da31 != _0x5cafab;},iaZlB: function (_0x8ed24d, _0x130185) {return _0x8ed24d == _0x130185;},CDTfO: _0xa6527a(448, "C6*a"),TCewr: function (_0x4ee29e, _0x10b305) {return _0x4ee29e == _0x10b305;},vGnVE: function (_0x15b107, _0x27959c) {return _0x15b107 - _0x27959c;},RnYfp: function (_0xbbe7b9, _0xa624bd) {return _0xbbe7b9 == _0xa624bd;},NCafV: _0xa6527a(563, "qCdP"),BaCOz: "SHA1withRSA",PyHXr: function (_0x1c7fe7, _0x4aa6b4) {return _0x1c7fe7(_0x4aa6b4);},ByAKU: function (_0x1f18ff, _0x4062cc) {return _0x1f18ff + _0x4062cc;},GPQut: function (_0x3afdd0, _0xb3067a) {return _0x3afdd0 + _0xb3067a;},SMLRy: _0xa6527a(565, "(Ww7"),LHwsE: _0xa6527a(603, "Rorc"),mxIkZ: function (_0x4ed1a9, _0x2215ce) {return _0x4ed1a9 == _0x2215ce;},xGdHo: _0xa6527a(453, "C6*a"),LZJnA: function (_0x23257e, _0x11efb5) {return _0x23257e(_0x11efb5);},nEpdj: "访问异常,请刷新重试!",KtfCi: _0xa6527a(495, "%Ry%"),BAhQL: function (_0x2a2c4b, _0x3415f3) {return _0x2a2c4b(_0x3415f3);},gptUc: "function",NXSXh: function (_0x5e311c, _0x11b3aa) {return _0x5e311c(_0x11b3aa);},QEtJy: _0xa6527a(429, "Ci37"),TjlfD: _0xa6527a(471, "C6*a"),toXwQ: function (_0x4a12e6, _0xdc1e6c) {return _0x4a12e6 != _0xdc1e6c;},cWbGG: "App-GuestId",rlRip: "11|12|3|7|15|8|2|16|14|1|10|0|13|4|18|17|5|6|9",lxLsU: function (_0x512591, _0x46ef5a) {return _0x512591 == _0x46ef5a;},zvftw: function (_0x4342f4, _0x54cd13) {return _0x4342f4 != _0x54cd13;},CmUyU: function (_0x4afd55, _0x7b9059) {return _0x4afd55(_0x7b9059);},yxSIq: function (_0x589618, _0x443202) {return _0x589618(_0x443202);},xFBbW: function (_0x4b22f8, _0x3637f7) {return _0x4b22f8 > _0x3637f7;},qfeJr: _0xa6527a(478, "F8#f"),lXKOC: _0xa6527a(465, "&sYj"),Lwzuk: _0xa6527a(498, "8E1C"),nDaMx: _0xa6527a(517, "Ci37"),xTQrg: "注:请确保网络畅通,再刷新页面。",viUWv: "url参数必填",AgdIX: "POST",chnKx: "json",nbDCr: "GuestId",csFyx: function (_0x197529, _0x4eab3a) {return _0x197529 == _0x4eab3a;},CEYWw: function (_0x4ff434, _0x45eb56) {return _0x4ff434 > _0x45eb56;},jgXOa: function (_0x536f9f, _0x2f2dc7, _0x3018a3, _0x319124, _0x24399e) {return _0x536f9f(_0x2f2dc7, _0x3018a3, _0x319124, _0x24399e);},VqEwT: "调用qccAjax出错,缺少引用Jquery组件",COiGD: function (_0xa5d3d9, _0x12882a) {return _0xa5d3d9 + _0x12882a;},GGQvd: function (_0x4d303a, _0x492487) {return _0x4d303a < _0x492487;},FmxyX: function (_0x19f667, _0xb121e3, _0x575ed1) {return _0x19f667(_0xb121e3, _0x575ed1);}
};_0x25e194 = new JSEncrypt();
_0x25e194[_0xa6527a(519, "wE0e")]('-----BEGIN PUBLIC KEY-----\n' +'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCigl9qBi6/wNAZLbU/P+7t6AvIyHHHdiOmbbInHrv1ihRXFCpTQLHBg7MoImLGiS858i43T2sMSWnWfG5wfasLtblDPqodL7/O50Z5urICs3/WlbK/qeluHKVwhC3wfq+y1gdOQf+90GFOi3uyF03UhYSiyFlLpfTR13vwR8LBNwIDAQAB\n' +'-----END PUBLIC KEY-----')_0xad2e02 = function (_0x8c7424) {var _0x47d8cc = _0x17f1, _0x4fd74e = KEYUTIL[_0x47d8cc(530, "]**l")]('-----BEGIN PRIVATE KEY-----\n' +'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMvbPyPuExTOqhjouNe8Y6DzGIWwFVPxQRNAQ56NNBYy67nKmr2YB44UXz49AUTagbjikQyJHvmcL6tnJtNwEKc2yrrtag1NY25oENOoGIC+ts0iTTiuvus0IOGy6m6LxGrlN9SvW8nCw3m3L0XDZnx6XyTxBu8J0m0HUJTI5zUBAgMBAAECgYBFWlmox54GPijwQHxiKN1cLFfzY2xeGn2hJwPaNP+7bad0ldD/H3GyjIu6iNadrhjj5XCjayL2mIQ/M+Cpnj6LiLvmEIlSqRy6X4hV/DbesVWvfFv+QnFV53wo5oEwGS8BxED11lbEVY59B6UWpPCNrWVSOaQhtgt3A23bw9MwgQJBAPkJdVodDqx5A4f0RejFj8J4mFWToMaQdaqp1QrzkHoFH0pe8Gq2JGME32FAc5QIa4J8iLPUiSqK0G6gEC0Igv0CQQDRjmXbgX+/sbPxcOe2isF+cXOyahvUKWcyuu0HAqQU4W546+G0SjgzWJ00YajTtJBNjTCBR8L8+zjaxOtIkcNVAkB/+IFKPjZFIKZU3YxzEdpO14OILiVnA+LDQSRNzV1HpowuvlySqWhHTcCwC9uYjT8ZvX7N0gBuUQjMYAoP6hjNAkB7NdNztXdsOUqIqg7DSGAuPPx+qV7FZraToE5e8dGRqV4v4NjrDTxwDCkaNFV0bFTwFBSx3oSqA/fQwTlpiLKlAkEAhbyo9sJAbo2RFo3trIPCpufgAlgHl45aDimleZbko5nC100R7t6rUUs5itzjiY1Psn0yb6darH3dXx0o795Jlg==\n' +'-----END PRIVATE KEY-----'), _0x26889a = new KJUR[(_0x47d8cc(476, "Z&5c"))]["Signature"]({alg: _0x55c569[_0x47d8cc(549, "FHU%")]});return _0x26889a.init(_0x4fd74e),_0x26889a[_0x47d8cc(564, "rEi5")](_0x8c7424),_0x55c569[_0x47d8cc(599, "Z8gj")](hextob64, _0x26889a.sign());
}
var _0x4b42dc = function (_0x3bdde8, _0x4cb56d) {var _0xaad1d8 = _0xa6527a, _0x52764f = "";do {_0x52764f = _0x3bdde8[_0xaad1d8(576, "%Ry%")](_0x4cb56d);var _0x350867 = _0x52764f[_0xaad1d8(527, "8E1C")](_0x55c569.vGnVE(_0x52764f[_0xaad1d8(458, "Z&5c")], 2), 2);_0x55c569.iaZlB(_0x350867, "==") && (_0x52764f = "");} while (_0x55c569[_0xaad1d8(489, "0HdB")](_0x52764f, ""));return _0x52764f;
}function get_params(page,key,iv,TimesTamp) {_0x5182a9 = {"Page": page,"PageSize": 20,"MarketIds": [14,17],"ProductOrderType": 0,"IsGetVipPrice": 0}
// content_0x963e97 = _0x595165(JSON.stringify(_0x5182a9), key, iv);// signvar _0x1c8141 = _0xad2e02(_0x963e97);// RsaPubAes_0x30ed66 = _0x4b42dc(_0x25e194, key)_0x35c44f = {Content: _0x963e97,Sign: _0x1c8141,RsaPubAes: _0x30ed66,IV: iv,TimesTamp: TimesTamp,}return _0x35c44f
}// console.log(get_params('sgKMt6zD2jE1fLxbCki3JVsVWcB9dx8T','yJxpI1THbubhdieW','6E9D5678D76B63069AB23C4667515893'))
var data="87653B547CBC3313B84CC0210BF24236058B67D65313866E71B235E344D3550E1F15C1B9EF74BF33510033ECB4B1B4B42F727395CB5A926BF062E7E5DEFE2FCA6E3417B1445B8045141206F32BB527DCD2B1AE5CD76EFA02070BE1C328BA368765B61801A3D734FD0E635E451AB982DF584D63815AE9068D3BA7E74E59B2A92C95188D641FED9EEDC8FA6C44B81ACEE4CDC0FA4AE67944AF9EE250B1C1EC7737908AA0B29B2237AAA322391C16F2A248054D9021798B238106A70BC57C0F069E131761BE37DAB719CD04EBE19A43B0090AB3B1DE067402088F0D51D3697D6B50F96AA020DD87354451B6AA69535FCA7887B2ED25BACE17AB3599D1B94947E444F00A96DBEC594089CF54CDBE4DC868A96AD30542099A6492406DC916F673E189FC0B9ECD3532FE2929DF224C4629AF1C583FC8F75FA7481B0A9A88225B96CCCDE8911E21CE42880C260F945003D3F8E5D2CC079438B084C984D255CE9F24117A9659EEC32C4A11ADD2B548BC1A78921A9450329AEC97AA6F0E637F7ED4989833AEEF75A605EF0E34EFE150521DEBB6E2099985E76A4A1DEBB936D09A49266CF0DCB5276017FF22146626BD588D9B3893792BD600616457266CF26D2D6768509EC707992C5C2DFACC4000CFE28A453F6E43C8FDCBC2A011C05E07C58556678DBD75E46E630BE7057D3F0B117E7FA0242757F6AE5E57A1A555CBF5DF8BCE63A8B9B9623E5669483C4C1A6E3C3BC2F8DC18A1D132CA917E36F83C745AB9479A25D66164059C1B783F6931FB75B9F9F8463E40A44B5D44B974C43DB2EEDE6C542C7E8DDA0D9E3DCE6A629299BEC1F15E136C3BEC99DE3AABE11E90598314661C8C474A330175C907217DD5E859A5E63B58A7C5A8601C5D4AF4EB302287AF608EC6D2D70E9FDDA5B3354680A30F9B12D35B8D8F6B1A991E4E3D361C5F246FEF5829C759BE0A0669BD3A2FF94C3619CE9CBC50674BDA22914D028454C6CC3EBCE034181BB9C1733F0547560C67DD2DC266F3055518801AB7A96551848A68386E4402465F9550F302E93720426F0BD0546E8A78F749F5E32C3EC3E339FBE1F2D93466FCD1DE871E50054BA11ED2CB5892872B312FF52552A84B91C41B522B34903215E4E52D243057CB78694723595FC20F211239EDE0DD9B3AC35857F2E29B86D45D40A485E5AD758DD71242C6FBF641030259228E116D0192900FCB3417B29A73F3C6D2940BB2965A57903182963B5F89AA6C0762C20AE210F834D4F90CA900D9E44C657678333C676FFA4C14545E251559D3FC498C5DF3B2485D47EE63BE4A66A1361FE26BE8B38E50E696C37732557B937BACE13789497F0217E5512464FD203DF45C58FAC0D82FE632666A701BA3E5C863169E6FC66E7FA47F81F29F1CF6861C4CA9D999C4DDD9C65EC302D3B06FC16D5C0BC522AAFAB3F24CE10367B48C5214A63A12BDED4CEA9EDB04E0C8E1B99168D623BCC058990FE46C5373EC24CF4B67E549EA5B3B7DAD21B007B77D50AEE35DCEC573B966D13DCEBFB0F40B2B23D786A52CBD85A71CD418FC00F2ADEFE52443CBA96C6FE98849038E93C615D88BCAECED53F49EC85BAFDB57A22EEEF1E34406FB725A5603170E0D8117939559D39392B3312162D15F955A4E43B1663158DACBCDF8C1AAB99739B1D4517130DCCA39490CA559EEB08A9C8B4D9ED8761C0ED3473C487070418ED64D2B1B8F95E2F6098469DBDE69B2BA76AAF68D42691D9F9D7974285D69F66A8CF263D0D0E6FDEABAEB9D180619E6446B7A4E89DC9C4ECD1F104B690FC415EEDF1B2C06E56F8C9228098D74A48C7112464942C760CE57B67FDBDE66F7322B46D14C6C293EE822B1F38E1F14065771D390B72524A0912D3B5C2A19C6AA4428855DF5977F12208CA5F6B6A966E2B8FF5B709ADA5BB8C00A5EF2882C24B6A931AED1226B0EBE1494EB3545B5D2EC32F1F025DFF12AC5C1DDF0BA8C271AEB089DCF2A19F48CB1177913B80A9379F4B6CA35DB2D7272D2D5E35D2BAAD2E2F3D5E00BE1A4AB39CC7F183AE0F6DC88AA4C71356093E2B36BC0391BA098EDFA272CEE0274F0AAA3803157DEB27D22F2FA6AA91B92B1C9B06B8B71195D7B28A2B47F4F37E89C711EA9C668FBEFA37EC72113A08AB4BA2C21B33C2E0991A4B87837ADBBFE8E77BE3B3E2809BD2D8248370406AB5DF1834680FEEC4534A0846988A51DC9684B6BD6F90EFD83F4C43ED96637DA8BC1235549DD60FA848C747485EB72626A6F6ED734A375B1A8341BE6196DA2251477B435586C8F19791B1EA63F217568A1694DA22A5380E0530526B09F275DFB070C0E531C2DC915DBD77DC294BE10657479B9E854D22DA14E3A88EAA63BB8667F4A1769A6372515BDBA369414EAF9CA9F5CF2660C7B311202EC314661D1BDED3BD8A02487327BF62F7C8DB444A8A930D6B58CFA814C60D9BCAE4C12401A9872F0E05CAD6EACC9B7D136D0579D8EBB0F3F8FA00E9E07C7932608DD83A46251156620C8C06DE6C41CB9D7EC6A1E10545F99232E3C69A8951AE688B50C058155882B43F18F624D0ADC92A4DF0576F1D408FE841072EC5D86E96C3F45D6645EB793781EBD8254BF9BEC9E42D72E4868B6D0923DA0040142D75EF47AABE0E276D5FF2C234DCAF51402E3B53EC4E0AF2423276419E2E0515DD72CBF2B9871A8C489399342DE82B5AD6F73A0586AAD93D81F2F6CB9820CFF85E83A6E451697B1DE9C5FF463D5FE7A41D35B3475CD93D473ED669B152ED11CC2B3585F5FFEE60C08BC406CBE8CA910ED04D5F008FD6D2E07D7239C638702AD91BF9C1B9B24CCCFB6341DD821A2FD856BDE7055FC8AE1E5C0773DC62728EBA4410BA5620F106CF04BDA77F922682E01DF2B2359F55E931ECCFC90636AC7B8D36369823494C7ACE27C7FD41F8DD9EE759C6AB296BB53C63484AD4BDFC6224E7C6C833E91F2833096882D80108BB453B69692D590075D3349E34CDD70F7C7CCAD5B6AA6FA6C8B58B2AF9353A948646417EE1F36482F5DE094305FBFDD8ECF427FD39A9158685D3FB9058D7A58456F229508BB537821A8F6476FECA788105211288DCA0BCABA7562F67DF396A77EA93533CB1023C055610A11A1529EC827B8CC6BC62EA7679008E0F6C7FB374A63A5F3C57D87D64EDD6DB1A9B892F46E9BC97E31AE7BC8BAA56D1A1C7266734CC5B68853B08647F859F1193E63E227709AC98629DB28E533A4CE04A06FF95DF576A040106EEE5D26ADD5152F3A7FC0FA7A57779DC95F92845694831258526E1968E530CE562C2CF44F6854F6081B67211CA98720D8F2A2075FB5D7FCBD33E1C5EFE3107DA0F9AB393E2A3ECCAC2860B8668FF60374CE4FCABE743B1A91C74821FAB4D280DF0478188FA4E89EEC3A7A5DD6A3D8D77139AE287B7C1B86BC610C075B05742F184E187BBF9E4A7C9735431F5B08907E90602F695152EC4F6BC1D9DF599F25A720B51B57351806052F5B3850E8C5C05548990AA72CBF896B5AF675CE6ABC9C0229E6B46FB609A7E0352F2C5089AB9269F483F2FCE2B9EE54652491CFE37878718D6D3C1E3EBA5935430E5F6F5A173BA65113F3760A4EF37AD7FCC2A3107A1FDEDBB97AB7C633F069EC464DF3A2197C255E2503395F56F21C9FA34638335BAA8F8B9D2C3A48DE19BB28188A44430DC3E1A5DB970D4DB64483559025B2476C2AD0D9A20A9786BC9C2E6786B69E5E3F6A85D7CE5A93A41CFD65EFE77D753F9CBD3700DCFC42C39F797D23936138E6F4B62B67088E81323E5D5F14A1CAC1828FA7716C0D9EA684F30D1412720F42CB7993AC4D3E0B7A9DA02394900790BAAE687F8C02ECE3FFDD941A66277A46B8E726DCE0D732B49CA8678CEA3FCDBFDF53F7F91A2D60F499CD1C8696A09CB3311009F2CA0B4C40D3C4B4F9A891A9A4D0A62092FCE561D1F56F176A4D5DF2F2831B5025B6BE08E1A4531391D28031B04B6621A0A52A75D6189D68E7A31430F6020858FA2205CF5FE6573FC44658E0C3E713664D2D98E0A4733222CB89F3CAD7483B536872D03E147587750BFCBC4BCDD806AFDD95420DEA193A72611F5B5F21D85900E188388638567823B661CC49049EAA525B7B7E4310A77088B0F7D9EB19C0E590737BE467528A7356B9606ED06F59031B2C2FE8237CA3DED19752AC66514A96BD2F31B578618570098527079B7ED8A4330F97DE33DB4F056F0F98B8359E9C40064A515B219D92422E588CD41E17AC796C0CEB42B4943B932A034B5A8E0EE9022085F08D933E0C929FB8CEF59246F320AEF84201B5416123CC3F03628F54756B3E10A009E959B5B80DCC167B07404BBD09E24897D1C03BB225D6A5B6E2094A5ECE27E55141EFB16068B144C8A49B14ECAC86FCB15CD64D6381AE3F689F1DB5D34930C412F932CD1724D9987B686DC9CB7CE82F8138920F9102E65D9B454F0B1504378EAB56A38755CDC55617A81D0EB1BE262B1BD715E00B73477C79685ED2CF48868B8E5C4425795907BAB6CFCC4D92A5E5F15EDA3D3995AA727D3FABD53A867EA69880E736491AAB690FDB5096BD8399CCBC62384B6F49B507350B9D1447250ADD2DDA46A672E841B5DCC3143623B4B9C94B71C9A084E04CD906F211B88E8F83F080BCCD1EC1FCD7095A41B065DB079B48B56F81A69283751F31E8334200DB8462D5C036CA99C160CA16E3F2F73AF793F9E4107A5D71EB1C41877949DEE38F75FA6B43DE7F953F6FE0E9A37E1AD7EBCEF8E3A9CA9A9EC1A3B05DC7CECEA6CE5B2C1AA0EA5C58B2F37B2232A32CA0344C53D326074C957CFECCE80FD71F92D92E21D8FDDBDDA9B1446E0E87CA7B75D45A16CEFAF604CDE9C599525744F0CB415BA90A99C6EF30A0B357817B9AA6BF4D2D2304D5CD3DD20D018B2D158548CD04A1A93AAFF14FE2C09852DD648A1B24404E916EA8789342DB711893DC052ED9E4E1AA91280640AA689D8B533B4D845BF5B77DF8FEC49A7E7EDAEE3A69FFEBCEE1DD2E82D315D126FFA41A840A7E4AB1CE44982C0671492F397C6FD0CB870C3BB5C94F018140A3801B508876A64A7FB658BC1BF2B2570E5049CB6F0D9E4F64A7FD2C44E3FFDDF4D36C2FDE8D8EC5F3ED2AD107721C7202C69CBA1B0357136A745F756FB01A41840EC76AC727BEC0EA70A748DFE838E651E182C4B6A1E9F320CAE6E86AB61D9EE8600B16E535AAA0B1934BBBC97658150312AE9DCE4AE2CE9DFCA1B8D61095447851D7D3B2C4F78D0DE227C8B362050825447DB6E54F87AD8745544BF36E3103F09216F0043E60D78000F472FF36807962B9502CC400E49C2A133240625A031AB4A18A24456B5CBB3D6A22742333CE958CEF7DF855E2B7DC46F281EAAE5577DCC65EC7884B93DDCB1306D5289EFABE553DFBB7AC68F036773D6E82217508658FAD4D0021E0453798B48E09428DD6C570049F41A7CE8A7C17461039ED36D7938257BA28D412701551D4BF747596B6FE22ACB535A00CF8F3D7E8D8D0605F774B969E72CEAA4781001A753CC4DB343F8089449D071EC8A5BCD76075C1AB873D18BCD52FAFEB81DC1A32200C81BB892B83974531F6040CDF6BA32F69C8094DBF504D4E1BB289461BA2681143CAE3385FAA33B4791385BB2DBBDB077215EA69115B764E87C4163004B955B88BB0705ADD5F843CEC3776779F7F0806E7B88335E43CDC542BA1ED94889523496CE0549A3C4A4802B3486B2CCD23878C58C1923F351C49F65C7031C615DDEA22344EBD3996DD834CBE9E5B3CDF9C480DCC0DA24D1CA9C8BC81F37B0E7AD97E46C57F4D791DCDD68D5770F3FE29F150CAF596DCE874EAC66F6FD7E7BD2443FD447A395218ADF1F00C8797CCC822EE50F47D56B4C5201FEB01A7D720B0BBB6ABA4121327B5683844DCF28F58F5346FF3AAA09F6BC43B38B2C945B90DF503671EF2E0F872FAF7E0CF0B3D2967A483E2B3AA6CA038941295288A97B492A0B84D9E4D4871FCB89814D77C05FB49075ACC5DA4C152CB1195227AC656BA0464854E5E1DC690052EDFE2AEDA4C2672DB1B26204E2428F3F282308BDBC238556238791F89E4477E5CE672B16021E743100921402360DAF8F148204513D43C81110D0CBEC469C9F09333F638130493A2C5713DBFE9FF26F6A2705B3CE8C116A6C8EA2D288B98A6A589404CC8D3DFC8DF17AE4503A11861099635341F49AEBE2CFAFC65C6286E40069166C8CE19F93ED93694747988BDBBDACC5BE0F27837447CB81B2B034E4142E944711EB7CC6B11212ADA88A03A60850E6A32F3ABF2B47823F785C3FA2ADA9B6A3A98FB4DBBB78BF2C017DF101190B20EF2749DBD7ACCC61587121745DEA13F6175E66E3B3334C15E9F3D027C1DE553206735C46AC4A67A600AFE36913BB7AF5DFD623CB06219EE900DCBDE6328E4FDF6FFF6F3E977851DE3901055AF715EC6FD3D8C70A6812E68315BC4484A0932BF7A40CEDE17C400D476E011F9ED3AC076660AA2CD85530C8E68B5B99DA5B769ADFC5B0F4DE02771DAA7A0EE38A1B079338291D9E35E5EBDC9B9AB0803B03C3549611286360B6F584BF419AD0D263F7476086C5405647457C2B3B6E5D6923F094FCDEAE0856933F73D0506E5D469D51A9EE71230E8F6F01E5B301E38ABC85B5B2257810301AC33559D23483ABE92538418646FFA2848BF32B022C343AF1141BAEEB73099BBFED48CE166F7882F337EFD6BE43BE6CA5B606EFACA5B3A5A097F6DD367D32E7A91B89CC2871BACBAB593BF3A3BA639845F1F3D94C7107F39DDB0528731EF02052E4635077D63B69679F7DBE5DCEE3C955FD4561D3AF8D5A2DAA8EB0E7D6DFAB25B4C120F38A7213DE55788681F1AB5D8399F835F48345B752D64F94B6852347576EEB819CE96FF2D51A9E28A6B5BA292F15B35D8764E66A4A75AF2F71DE8F14AA378C80A33D792A58777FA980FBE01C7027CC4FDF6911D63399ADB1CD02AFB427643A121FAD5121820F4AA5A80702C6BCE46E38117A044C42E9168E8ACFCD27886E743ECCAEFB257B132BC8347695299A197E1E3A90F0A88B71827521933578AACEDC61F4D60E3CC3244880C7BA87CB03D136BD0043DC62FB52A4C0C0599A0C3B9B0C76F560015E33733BCCA08CEE…"function res_data(data,key,iv){_0x316c29 = function(_0x50d2de) {var _0x57bf1e = _0xa6527a, _0x19d8f6 = _0x55c569[_0x57bf1e(529, "F8#f")]["split"]("|"), _0x9d1ea2 = 0;while (!![]) {switch (_0x19d8f6[_0x9d1ea2++]) {case "0":var _0x5393d5 = CryptoJS.enc[_0x57bf1e(606, "KD8R")][_0x57bf1e(410, "wE0e")](iv);continue;case "1":var _0x59b62f = CryptoJS[_0x57bf1e(423, ")DW^")]["Base64"][_0x57bf1e(555, "Rorc")](CryptoJS[_0x57bf1e(525, "pstP")][_0x57bf1e(600, "%Ry%")][_0x57bf1e(582, "]**l")](_0x50d2de));continue;case "2":return _0x47f47d[_0x57bf1e(463, "qCdP")](CryptoJS.enc[_0x57bf1e(441, "rl)n")]);case "3":var _0x47f47d = CryptoJS[_0x57bf1e(434, "toaS")][_0x57bf1e(480, "C6*a")](_0x11aca, _0x1d6ab3, {iv: _0x5393d5,mode: CryptoJS[_0x57bf1e(500, "F8#f")][_0x57bf1e(535, "&sYj")],padding: CryptoJS[_0x57bf1e(550, "toaS")][_0x57bf1e(592, "65S[")]});continue;case "4":var _0x1d6ab3 = CryptoJS[_0x57bf1e(551, "c0j]")]["Utf8"][_0x57bf1e(432, "qXik")](key);continue;case "5":var _0x11aca = CryptoJS.lib[_0x57bf1e(554, ")Mf!")][_0x57bf1e(516, ")DW^")]({ciphertext: CryptoJS[_0x57bf1e(525, "pstP")][_0x57bf1e(440, "c0j]")][_0x57bf1e(419, "Z&5c")](_0x59b62f)});continue;}break;}}return _0x316c29(data)
}

python代码:

import requests
import json
import re
import execjsclass QingChuang():def __init__(self):self.headers = {"accept": "application/json, text/javascript, */*; q=0.01","accept-language": "zh-CN,zh;q=0.9","app-guestid": "CC0244A69B8E709E50371AA783B601CF","app-version": "0","cache-control": "no-cache","content-type": "application/json","origin": "https://hangzhou.qccqcc.com","pragma": "no-cache","priority": "u=1, i","referer": "https://hangzhou.qccqcc.com/","sec-ch-ua": "\"Google Chrome\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "\"Windows\"","sec-fetch-dest": "empty","sec-fetch-mode": "cors","sec-fetch-site": "cross-site","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"}self.html_url = "https://hangzhou.qccqcc.com/"self.url = "https://newopenapiweb.17qcc.com/api/services/app/SearchFactory/GetPageList"def get_info(self,page):# 获取key,iv,timestamphtml_res=requests.get(self.html_url,headers=self.headers)qccppm=re.findall('var qccppm = "(.*?)";',html_res.text)key,iv,timestamp=qccppm[0].split('|')# 获取新的加密好的请求载荷with open('青创网.js','r',encoding='utf-8')as f:js_code=f.read()js=execjs.compile(js_code)params=js.call('get_params',page,key,iv,timestamp)data = {"Content": params['Content'],"Sign": params['Sign'],"RsaPubAes": params["RsaPubAes"],"IV": params['IV'],"TimesTamp":params['TimesTamp']}data = json.dumps(data, separators=(',', ':'))response = requests.post(self.url, headers=self.headers, data=data)# 将加密的响应数据解密result=js.call('res_data',response.json()['Result'],key,iv)print(result)def main(self):for page in range(1,5):print(f'正在爬取第{page}页')self.get_info(page)if __name__ == '__main__':q=QingChuang()q.main()

案例二

0.postMessage方法

window.postMessage 是一种用于在不同的窗口、iframe 或者标签页之间安全地传递消息的API,它可以跨领域传递数据。它主要用来解决在同源策略下,不同来源的文档无法直接进行 JavaScript 交互的问题。 postMessage 方法为跨文档消息传递提供了安全的途径。

otherWindow.postMessage(message,targetOrigin,[transfer]);

  • otherWindow : 要发送消息的目标窗口对象,可以是window , iframe.contentWindow 等
  • message : 发送的消息内容。可以是字符串、对象或其他可以序列化的对象。
  • targetOrigin : 目标窗口的源(协议+域名+端口号),用于控制消息发送的安全性。值可以是一个具体的域名(例如 https://example.com)或 “*” (表示不限制域名)。
  • [transfer] : 可选的 Transferable 对象数组,通常用于转移 ArrayBuffer 或 MessagePort 等。

接收消息的窗口(例如 iframe 内部的脚本)可以通过监听 message 事件来获取消息:

window.addEventListener('message',function(event){// 安全检查:确保消息来源是预期的if (event.origin !== "https://xxx.com"){return;}//处理消息console.log("Received message:",event.data);
});

百度网址测试:

window.postMessage('1234','https://www.baidu.com')
window.addEventListener('message',function (event){console.log(event)
})
 1.逆向目标

网址:https://www.jianyu360.cn/jylab/supsearch/index.html

接口:https://www.jianyu360.cn/jyapi/jybx/core/fType/searchList

加密参数:

2.逆向分析

hook定位:

var my_parse = JSON.parse;
JSON.parse = function (params) {//这里可以添加其他逻辑比如 debuggerdebugger;console.log("json_parse params:",params);return my_parse(params);
};

进入解密函数我们发现我们进入了异步中,流程类似于:https://blog.csdn.net/ningmengjing_/article/details/150483877

下图的代码就是核心代码

3.代码实现

javascript代码:

在扣代码的时候碰到了这个错误解决方法:

混淆格式检测    压缩代码方法  把没格式化代码复制到本地    找到开头    删除前面的代码     再找到结尾  删除后面的代码

这里这个库导入比较特殊

    window=global;
var JSEncrypt=require('jsencrypt')
const crypto = require('crypto').webcrypto;J = {rsaDecrypt: function(n, x) {const W = l;var e = new JSEncrypt;e[W(540, "U%DW") + W(836, "l1sA")](x);var o = e[W(830, "XK#8")](n);return o},async AESDecrypt(n, x) {const W = l, e = {RBiGj: function(f, d) {return f === d},qcqef: W(441, "DTyb"),eFzvS: W(471, "opxz"),ninbp: W(646, "l1sA"),daehd: W(680, "![lZ"),tTRoe: W(934, "vkxl"),TljzP: function(f) {return f()}}, o = new TextEncoder()[W(910, "PAdF")](x), c = n, t = Uint8Array[W(944, "x]Q)")](window[W(617, "m38C")](c), f => f[W(581, "g2ho")](0)), u = async () => {const f = W;if (e[f(478, "qAuV")](e[f(829, "mGjC")], e[f(495, "jZkF")])) {const d = t[f(520, "Z&&L")](0, 16), a = t[f(520, "Z&&L")](16), s = await crypto[f(747, "Z5zh")][f(738, "qiv)")](e[f(483, "WV)0")], o, {name: e[f(580, "U%DW")]}, ![], [e[f(501, "vIPk")], e[f(839, "gz2i")]]), i = {};i[f(746, "Z&&L")] = e[f(930, "vIPk")],i[f(767, "qAuV")] = d,i[f(873, "DTyb")] = 128;const b = await crypto[f(725, "iN4Y")][f(686, "qAuV")](i, s, a), h = new TextDecoder()[f(642, "![lZ")](b), m = {};return m[f(563, "Cy7p")] = h,m} else {const d = _0x281caf ? function() {const a = f;if (_0x54acb5) {const s = _0x1fdcf1[a(726, "MOy0")](_0x3d8099, arguments);return _0x15f2c7 = null,s}}: function() {};return _0x36a51b = ![],d}};return await e[W(604, "Kn0I")](u)}
}// 自执行方法
!(function(n, x) {const W = l, e = n();for (; []; )try {if (-parseInt(W(954, "m38C")) / 1 + -parseInt(W(696, "1G]f")) / 2 * (parseInt(W(877, "(eXE")) / 3) + -parseInt(W(859, "PAdF")) / 4 + -parseInt(W(885, "^[dc")) / 5 + -parseInt(W(476, "vkxl")) / 6 * (parseInt(W(534, "d1Xt")) / 7) + -parseInt(W(544, "Z5zh")) / 8 * (parseInt(W(803, "i[Q*")) / 9) + parseInt(W(898, "PAdF")) / 10 === x)break;e.push(e.shift())} catch (o) {e.push(e.shift())}
}
)(C, 862971);// 大数组
function C() {const n = ["WR9zWO3cNSow", "WOamW4dcV8kq", "W77cMdKBW4S", "d3BcMNtdGW", "tCkkc8kaWR7cKmkLWOnosCkxmeS", "WOOiW4xcJSky", "wSouWOddKYi", "WPhdUfFcGa", "puVcPHLq", "WQWSW7zFoW", "W6aGECkuWOa", "vGldUeW", "WOjtW59HyW", "pHyUW6Gx", "WPpcVu5gtCog", "WRFcOSoxW6xcHSoaEa7dIG", "W5tcG8kTWR3cSW", "W5pcGmo/FSoP", "WPuhW5ruceS", "W5RdTcHRfW", "W6NcRJuSW7C", "WONdU8orW6JdIa", "c1JcPHzCsgBcV8o/kdG", "W78TWOBcKgW", "W7BdImoVW5rH", "W5RcOSkbWPRcKa", "WOrKW6XCEa", "kZldRY8M", "y8oHWPRdKYi", "BCk7W6PQWRq", "WQ/cICkCWRqoz8kaW60HBMtcPxS", "uxTHWQm", "DbOiCxG", "WQmGWPDZCa", "gsKbxmoc", "WP4MWRXPAW", "WQpdMCoyW7/dKNT+", "WOf7WPDPW4VcJeZdVG", "W5W0WONcQW", "FJKMzgO", "WOeSWR5Bsq", "WRO7W6tcNmkX", "W5hcRYGYWRu", "tmkhbCknWRVcKCkMW7XAr8kOmvFcSq", "WO9ncJv8k8o7W5emWQW", "tXWqvwjj", "WOLbWOnJW4G", "WQTcW45Fwq", "WRFdL8oeW6i", "rmoZWOtdSta", "WPdcVLPDqmo3W5XDeG", "mgD2WPrH", "kglcVIO", "WQldQmoRAmkR", "exRcThhdHXC", "hmoqx8oxW6/dGa", "WRSKW7H5bq", "W7hcNIijW6G", "zL5Kqxu", "xYrOWRq", "W7y1B8kRWOCFW7XliCkw", "W4RdL8oiW6jp", "W7NcJmkKWR7cIW", "sWpdJvCxEfNcNq", "mCkIqCkb", "WOS6WRnJBsZdQG", "v8kBFx/cPSoYWPhcTGVdTq", "da84W7Wx", "W4e1WRpcQ3ubW4pdJW", "WP/dNHaYkq", "aftcN2lcQa", "pwPRWOnxW7RcPCkH", "WOldPKlcLW", "WRRdTs7cOdu", "gGKYW7eg", "traqugy", "fGNcO2GG", "aZlcR0lcIsxcMSoLW7W6", "gG/dGqK8", "bNRcTNhdNq/cSq", "WQBdUWlcRaq", "WQ8VW7FcP8kd", "jX8Tq8o9", "W6RdPZ5wgW", "xYaozq", "WPyEW5lcV8kNW4JcTCkBFW", "lMRcPc8", "WPpdSKRcLCom", "W4hdOYr2lG", "WQVdSstcOW", "aeHvWQ9G", "gNJcKKxdQW", "ENLlWQBdNG", "WQFdQKdcG8oV", "WP88gmoQW5m", "WQBdH2lcHCoE", "W6qviSkfx3/cUmorW6xdGq", "CCoLWO/dKt7dIG", "WPGgW552cKzXtZXa", "W6pdQSkgWRxdJ8knEXldPJ4YEW", "WRxcVCoHW7NcJG", "hLbIW6yc", "ssyZDx/cJ8k5W7C", "WOm8amo5W74", "WRFcT8oHW5a", "ogZcMt9wW4NdRmoV", "id0TwmoX", "jwX6WPfd", "cZy4W5W6", "EWGJEgm", "W74YA8k0WR4", "WRTgWRdcP8oE", "vCoWWRNdTse", "k8oKtCoFW6W", "W5iPW6ZcUZe", "dZSIzCoH", "aba0AmoJ", "WOD8W7rEyW", "fx7cP20", "wI4fCW", "kSkuWQWF", "WPOAdmosW48", "amoRD8o5W6K", "WPtcG3nDDG", "hfhdKCkfeG", "WRWLW7fgoW", "W5FdKcHTjG", "WR/cV8ohW7pcL8otDa", "h23dL8k/kG", "WR81W6bXna", "WPKxW57cLmkS", "WRdcS8oAW6q", "WQPvW55f", "WPRcQePazW", "gSoku8okWQpcH8oLWQL3sa", "jJNcIKFcIq", "WO81W6lcSCkT", "WQtdRtVcUWO", "fwfilYBdJ8o8WRKXWQK", "W7ddRCo8W7Dm", "WReRW6FcGSknWOBdLSo3bM0", "W4ekW5VcRdO", "WR90F8k2ka", "bSkArmkleq", "WPX/WP7dL8oU", "rJroyMlcImkKW6rOW7u", "W7qNDmk8W50qW6PlnSkr", "W7yJA8kIWOW", "g0ddL8kBha", "WRuoi8o9W6a", "deVcL1FdNa", "pgZcUt9PW4xdSCo7W7hdJq", "owTBWPjX", "h3hcGf3cKa", "WOldSghcHSoOW4/dLmoi", "xqxdSeC", "bcebFSoG", "bJ8LECof", "u8oBb3JcSa", "n8k6rG", "q8oNWQVdMIW", "WRpdK8oxW77dNN8", "WQddJmo5ASkB", "WOtcINShBSkNDCo6WPhcJq", "uYNdPdFdJXdcGCkwW6ik", "W7FcMSkbWOVcVa", "WQnvWP9hW48", "W4pcTCoDySoW", "WOrRWPdcPSoD", "eYNdIaWWW6ZdV8k3WOi", "xmkfkq", "WOldOJ0xpW", "E8oig0JcLW", "vmo/WRJdPG8", "W4ZcJZ0BW70", "tqZcMmkirSoTnmooWRS7", "WODEAmk3jq", "W4FcHCkZWQ7cLa", "vmoUWQZdPCox", "W7tdMSoGtCkZi8o/W691W54", "WOZdJHpcTXS", "W6lcH8kPWPlcOG", "vGldRLyr", "cHOZW7Gz", "ecWTwSoa", "bSkaWROwW5m", "WR1xCmk9bq", "W5lcGqCmBSkTFCoLWOVdUW", "WPX5WObVW40", "rXGBwNi", "nxZcO0ddIG", "pcRcQ1NcVW", "Auz+A3e", "sSo5WOZdNSow", "urDErN5ivIuOjW", "A8oDmN0", "WPCbW45Ae003eLa", "WOBdRvVcHmo7W5ldN8oKW6ek", "W6LYW4ddTvTb", "W4dcQWuqW70", "cJxdLW0R", "ofJcIMFcJSoPqCkS", "W7FcVHqtW6i", "W6OfWPdcTeqhW4pdNa/dMq", "WQ5zWRZcNmo5", "aSofW7XqW4HB", "WPvHWO/cOSoi", "ahBcU2C", "W6BcM8oZB8o7", "rSocmKpcJa", "W5ynWOJcJxe", "WO0hW4Lh", "W4ddRdzwjW", "uIhdIxej", "W77dMdjrl8oZmmkrW5tdMq", "W5OFWPlcIMS", "W7dcHCkLWORcKLhdGa1csa", "WOldHG8eoa", "sMbRWO/dIq", "qH8kv2qmqwjIFq", "kCkfWRuwW7fsfYdcLN4", "h0JdJ8kn", "W6ColmoCr2FcTCkYW73dJSok", "WRviA8kicW", "Evzzy3W", "WPpcT1PgtCol", "Ax5+A2e", "WOhdLIGmi8kpacdcOGO", "WPSWWQLaCcNdUCoUWOlcKW", "WRVdHb/cIJC", "WPRdSfu", "WPWWWQ5K", "EZ0iWPXTW53cVSkhnq", "WO1jdcvGmq", "jaJdQHCq", "a1LEeJyb", "W6hcKmoqxCo8", "WRtdMCoLW7JdJ351ka", "WOKLWQ18EW", "e3xdO8k9eW", "BColWRldNs8", "AGeny0i", "d8kJEmkZeG", "rLfYrh0", "rSkAm3JcOCo3WOC", "dNRcU2tdKbC", "WPa6WOXbWOJcNxBcO8ovWOK", "W7VcRb4GWQ0", "BSkHW6LK", "WOvgWR5PW70", "W6xcH8oBySoi", "WOuniCogW64", "WQ1FW5jdx8kBjCk6xdi", "zSoDiKJcGa", "WRPiWONcKW", "ASozW6rpWQ0RBHhcGvhdUG", "W7NdNmoiW7DciSoe", "W63cMrOuWOS", "W58UWOJcKwO", "lwxdSCkgaG", "y8knW7vvWPO", "WQ1+vmkMmq", "WRP9WRZcMmo3", "WO5YD8kipa", "dLxdGmkDdSoyf8kjWOqh", "W5dcOI49W7u", "WPLjcIe", "WRf9WRBcH8o6", "WOy8WRnYCG", "nrRcU3hcMHldSCkummoH", "vSkdW6zLWRu", "iHtcKu/cKq", "lXhcLgad", "B8osWOBdVmoj", "W6VcJSkhWRVcIa", "h2/cKGjg", "pHiXEmo9", "WPNcGSoNW7pcSG", "W6tdNmoiW4rF", "stSbyMG", "hK7dJ8kAh8oLamkaWPul", "WO3cShfwyW", "hMTBWPbr", "W6ZdIYHcEmkZhSk/W4G", "WQediMSUB8oZW4zqWOi", "ed7dHGO8W7a", "W6yak8kpoKVcJmk9W54", "WQFdH8kTpCkRtmkqWR9MW7lcOZJcQG", "A8kVW6jY", "WPb8ktj5", "W4FcSCoYwmow", "W5VcPIOyWOe", "WPPCW5zkEW", "WQKyWOvPzW", "W4BdJb10oG", "W6VdISokW7Xs", "WOtdPI4yiW", "WQDdWRVdV8op", "cMBdK8kEmW", "WPtdOmoECmk6", "WOKwW6pcHCkU", "cK3cV2RdKa", "WRhcSSovW6NcMa", "WQlcQSo1W67cOa", "WPjJWPLYWO3dPvVdOSo8WQC", "WRpcRSoBW6i", "W6iEWQ3cTvu", "W60iW6VcLZi", "WP0pW5tcUCk6", "pgxcS2tcQG", "WRddVCoMW4JdRq", "x8kBd2FcIG", "wGpdK3yu", "gby3W7mlWQtdGG", "WP0oW6XMnG", "WRPknaL/", "AW3dTKGD", "oK/dKmknhW", "WPRcOvDevW", "lMFdUmkNbW", "W73dNJPtk8oin8kWW5tdGW", "WQlcThD6nsVdHh1b", "W6lcHmkBWRJcJa", "mLVcHwZdJq", "W74/WPK", "W7dcRSkSpmoNwa49EM7cRG", "WQldUSoaW5RdVa", "uSo0muxcVa", "W5xcQmkOWRhcIa", "W5RdLa5qgG", "wsWdBMNcGW", "WQhdPIxcQqRdTa", "W63cLsymWRC", "BCkaW4X5WOW", "q8ouWRNcKHJdRha", "WQpdL8oAW6a", "WPNdImoiDmkH", "WRJcS35Dsa", "DdaUv3G", "W6aYW7lcMXXMsN9IW7C", "WRldK8ocW7NdJ3K7z8oMxG", "et7dKW0TW7BcPSoVWOfa", "mXxcSuVcIW", "gtyZrSozWOLUW7ajW40", "kftcJhtdRG", "WOJdHrpcQcC", "nSkOumkdia", "WOJdSWlcNrS", "WPX4WQRdTSo1", "hehcJN3cHa", "WOhdHW7cVd0", "W5dcQ8k+WPBcSG", "o2VcOYDbWOdcQSo8W6ldNW", "wsWcDa", "W5vqWOVdU8knW6JdMCksdXi", "zmkNW5DbWPS", "W6yyWPqEamoaE8oWa3q", "W67dNmofW6fRpCodW60IFa", "W7VdRWXIba", "W6pcOI08W4a", "sgvjWRNdJW", "c8kHW5FcH8kdW77cKh/cT8oAW5HOWPWy", "WRBcV8owW7u", "xmkylLlcGq", "WO5CdcLGiG", "WRWHo8o/W4q", "W6pcMmkKWO3cIvFdJb5t", "kstcOKW", "wcCdC3tcLSkJ", "WOpcVvvhwSorW4XgeIW", "W6ldT8knW6hdM8ooueZdVG4", "ttSpDwlcKSkUW6b/", "zhzgxG", "WPiCpCoFW7i", "WPvYWPvYW5ZcT10", "WO9HpdnG", "orJcR3hcJW", "W7BcMmo0F8oQc8ovWQHCW6O", "WRhcRmoqW7FcMa", "WPJcQgXNAW", "r8k5W551WR4", "WPZdMwKca8ktgJpcUre", "W5FdTa1/ja", "s8oxov7cLG", "WOrQW5lcLM8RW7xdGdW", "WRPcW51ttG", "WQeEpSoIW5O", "xHZdRK8C", "gmkcWPiRW6e", "W6u6uCk7WRq", "W4ieqSkbWR4", "WRhcS8oeW6JcK8ogrqtdNcu", "WR4zW4RcVmkY", "W6pdImojtCkeEXy2ghu", "uY/dPZBcNuBcR8kYW6mopmkY", "W7SKCmk8WPa", "W6xcQZGjW4a", "qCo/WQxdMI4", "WRWnW5zgfa", "WQiTWQX0AW", "WQtdRuhcO8ol", "qmknpM7cVSoVWOVdU0W", "WRbzB8kf", "WRFdT8oiCmkGuYWu", "j0BdUc7cIvldQmolWOfb", "WOaeW6VcNCkR", "emo7ESoSW6C", "tSk5W5fdWQ4", "pCklu8kxja", "WRpdQmoAASke", "FSk7W6zeWPpcPCkHB8o2bW", "W5hdTsTviCoZoSkfW64", "WP9SWQ7cTSokCSkBoCkzra", "gIWIrSo4WOK", "W7lcMSk7WPxcNW", "WQpdRSodW7VdNG", "iHFcQxC", "W63cSmo2Emo0", "WRK1c8ofW4e", "W4/dVmoHW4z/", "WOzIASkdfq", "WP9becq", "WQTglbLA", "WPFdR0lcNSoJ", "cSorsCokW6JdGa", "vLDntey", "jvRcQxZcJSo0zmkUkq", "W6a1W7pcLsD9thyRWRm", "W5afu20", "pYJcV1W", "pfVcUhRcKSolsSkY", "bZhcG0RcQW", "WOvaWPbyW5W", "WO/dPCozW7ZdSa", "W7VcLSo3Aq", "oNbAWOnjW7y", "Fcisueu", "WR3dQdivoq", "W5NdOHLqpG", "W5tdPGWmg8kwWOTQkZFdKvSo", "WRfOWP7cPCom", "W4ZcIJKwWQS", "eePhacmuqN9lqNFcGa", "WPadi8oaW79mpdxcRSku", "s8o1WOFdLt4", "WROJcCoxW60", "WRCkWQ1IBttdOmoqWQK", "uxTUWRG", "eNVdLSkkdq", "WQO3WP5juq", "WRjUWOZcSmoP", "zdm4Ah8", "vXWbCgq", "W4aeW6xcKay", "BJaWCwa", "WPj4WOnUW5hcOLS", "WOGNW5rQlW", "wSo7WPNdMSo2", "WOHcWR1bW4C", "lIK2Dmox", "W5KTWOVcRwi", "w8kXW47dICoo", "kSkTsmkohW", "WORcUmo3W5RcNq", "WOOxWRXFDq", "WQBdIZ3cRX8", "fh7cUxBdGq", "nWlcQM/cOa", "WP1KWQ5SW50", "W7ZcMCoZEa", "ax7cUw8", "xcOuAglcIa", "WPNdVCoDW6tdRW", "a39SWQnJ", "WQnDt8kReq", "W5GPF8kSWRG", "WPddRL7cS8od", "WOHNWOi", "dw7dM8kOlG", "g3bkWObI", "W7yWB8kNWPPC", "lvlcO0/dQW", "pCkcWRijW6aasJFcKgq", "WO4GWRnZDINdOmoHW5BdNa", "hXWHW68gWRhdHa", "W64hFCk/WPy", "WRHuW6Lbta", "WRRdVCo4rCk2", "frO2W7qqWQ/cMdVcSW", "WPuzi8oqW79xjJJdUSor", "kLbOWPPX", "cYyXW6xcRaz9bSkhWPNdNmo8", "CsOdueu", "bMrmWRvS", "W4FcQqpdHSoXW4NdVSo4W4Cy", "owrkWPjlW6C", "W4FcHIymWQu", "xIyvB3NcG8kL", "WQ/dId/cUrG", "WOldH8oGW4/dPq", "eGeKW6qp", "bKPqWQn1", "WOe4W4HLlW", "bdSkumoz", "W7/cLYiqW4S", "W7yQWQBcUMa", "l8o2AmoFW7G", "ed7dKYGTW7hdSmkMWPnq", "W7RdGqnNmq", "vde6vxm", "WQJdR8oFu8kJ", "WPOyWPFcUmkwo0VdOW3dUa", "msJcK14H", "W4RcQmoQFSoXdCopWPr3", "W57dO8ojW6TQ", "hcSLzmoC", "W7BcN8o7zCoW", "WRldU8oQyCk0", "qCkqpNNcT8oRWPy", "W63dHtvuoSo1imk5W4xdJW", "hK7dJ8kAbmo7ea", "WQFdLcpcJZi", "WO55y8kDgG", "W5aCWRJcT0m", "sCo0WPm", "W50/WPaA", "WQHuWONdNCoa", "A8oSe2BcGq", "oMPnWOvgW7y", "FmkdW7rQWPW", "C8oxjG", "nulcThVcQa", "qtW6qfa", "W7meW5ddN8kcu8kSb8kGFG", "y0tcVGK5oa", "pg/cQYjkW6VdP8oX", "atxdOrOq", "W6xdMcnZpa", "WPCBW4pcNCkz", "sJKUt34", "WOeAWQ17uG", "othcI3K0", "pvJcR1NcUq"];return C = function() {return n},C()
}// 解密函数
function l(n,x){const W=C();return l=function(e,o){e=e-418;let c=W[e];if(l.WtxbIi===void 0){var t=function(a){const s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=";let i="",b="",h=i+t;for(let m=0,k,O,G=0;O=a.charAt(G++);~O&&(k=m%4?k*64+O:O,m++%4)?i+=h.charCodeAt(G+10)-10!==0?String.fromCharCode(255&k>>(-2*m&6)):m:0)O=s.indexOf(O);for(let m=0,k=i.length;m<k;m++)b+="%"+("00"+i.charCodeAt(m).toString(16)).slice(-2);return decodeURIComponent(b)};const d=function(a,s){let i=[],b=0,h,m="";a=t(a);let k;for(k=0;k<256;k++)i[k]=k;for(k=0;k<256;k++)b=(b+i[k]+s.charCodeAt(k%s.length))%256,h=i[k],i[k]=i[b],i[b]=h;k=0,b=0;for(let O=0;O<a.length;O++)k=(k+1)%256,b=(b+i[k])%256,h=i[k],i[k]=i[b],i[b]=h,m+=String.fromCharCode(a.charCodeAt(O)^i[(i[k]+i[b])%256]);return m};l.MDoBrh=d,n=arguments,l.WtxbIi=!![]}const u=W[0],r=e+u,f=n[r];if(f)c=f;else{if(l.wyyAta===void 0){const d=function(a){this.MulPhG=a,this.HzuiZQ=[1,0,0],this.wqugmh=function(){return"newState"},this.xWHfrC="\\w+ *\\(\\) *{\\w+ *",this.rbcktE=`['|"].+['|"];? *}`};d.prototype.NGjtmC=function(){const a=new RegExp(this.xWHfrC+this.rbcktE),s=a.test(this.wqugmh.toString())?--this.HzuiZQ[1]:--this.HzuiZQ[0];return this.HTvSes(s)},d.prototype.HTvSes=function(a){return~a?this.SoJXui(this.MulPhG):a},d.prototype.SoJXui=function(a){for(let s=0,i=this.HzuiZQ.length;s<i;s++)this.HzuiZQ.push(Math.round(Math.random())),i=this.HzuiZQ.length;return a(this.HzuiZQ[0])},new d(l).NGjtmC(),l.wyyAta=!![]}c=l.MDoBrh(c,o),n[r]=c}return c},l(n,x)}async function get_data(key,data){const x=lvar  t = J[x(722, "w#C%")](key, '-----BEGIN PRIVATE KEY-----\n' +'        MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOhM0pNOfGeiBr+t\n' +'    nunphCHReY3RiS4Fuc2nD3cbjKNdLezeViGmsZwHsb2SVUb6rpPHyX0+3xjXYn//\n' +'    n39/Q8uPjWRA332TtN8MDEkSR2HMbn8ufRRt2TnlfsFDFTgBywSP7cwd0CiEdvBX\n' +'    5w8Jifc9VbedwbeplBWyDeLLqjRjAgMBAAECgYB4es+EAuLWxNwHMb8Hxkr3VzNZ\n' +'    8GDbc7DIDmsg9TLdz4fwH+hAD7pyGDOBBJIh/AXrM2U3BhKjSaIWjLdmYtT/kzg8\n' +'    BxQDr9YoO7u2jvTcEE+/6p2YugYX/ngpinawFJqyM+N7Or8yRABaw6Aq8VuKtv6p980Y2BBVVYn+/KorYQJBAP+9lu8iolzKRzJrFt/rosdWkOpNg5ujcSCwbxhYnYC0\n' +'    UY85sPLsMvnLgegkpO8jocSAt586BmcsA+Q9o97qVCkCQQDoiSVegtOvG3U0mNlN\n' +'    rCVpPEL22s9Kkwps3ZCdTl3VtUtNiyfhE8rbw/qOGti3VxMCRhpKi9hTIgeq13UG\n' +'    67WrAkEA/WQ1c5XGd9f4eU1AKffInmf4SB8rgn+L7I7EVMQgstB3a0kHOXqs+3IX\n' +'    shL01PliJFhBF+QfSgSDipdEke9uGQJBAOcw46xxmhDw1bizdulYi+Fy/oj7xzi3\n' +'    tJfEObGMZpLBKtsvzThkOz4APS3n1yuBMO8Dz8PqAeu1W7YpfLqiwv0CQF68N244\n' +'    dFebDSoZLl1hbCExpbtC7SDBpYxlIVNVqwN7ymr+Z0rIcAMVv5Ldp/bJEWaXJs9C\n' +'    0sPCBpjDnyK9Z04=\n' +'        -----END PRIVATE KEY-----')var u = await J[x(724, "(0wh")](data, t)console.log(u.value)
}
key='aaaaa'
data='bbbbb'// key='XnQvC8xtVGmv7UeLrf3rN/yRlYuMEV/b8QIBhblw3YF1Htx4d37l0AIGWpfaeR+wLv6PtCYsBfta0z0vlzq2bSEVXHnE00oKaHCRSeQ0p9q3VRrfJv1U+uL+/ekfco+NgiuO0XeEd3ROTFneZDnglBD7YJ+XMrv/wJhvwe0fT6E='
// data="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"// get_data(key,data)
get_data(key,data)

python代码:

import requests
import json
import subprocessclass JianYu():def __init__(self):self.headers = {"accept": "application/json, text/plain, */*","accept-language": "zh-CN,zh;q=0.9","content-type": "application/json","origin": "https://www.jianyu360.cn","priority": "u=1, i","referer": "https://www.jianyu360.cn/jylab/supsearch/index.html","sec-ch-ua": "\"Google Chrome\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "\"Windows\"","sec-fetch-dest": "empty","sec-fetch-mode": "cors","sec-fetch-site": "same-origin","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"}self.url = "https://www.jianyu360.cn/jyapi/jybx/core/fType/searchList"def get_info(self, page):data = {"searchGroup": 1,"reqType": "lastNews","pageNum": page,"pageSize": 50,"searchMode": 0,"publishTime": "1727423038-1758959038","selectType": "title,content",}data = json.dumps(data, separators=(',', ':'))res_data = requests.post(self.url, headers=self.headers, data=data).json()js_code = open('剑鱼.js', encoding='utf-8').read().replace('aaaaa', res_data["secretKey"]).replace('bbbbb',res_data['data'])open('剑鱼_替换.js', 'w', encoding='utf-8').write(js_code)result_data = subprocess.run(['node', '剑鱼_替换.js'], capture_output=True, text=True).stdoutprint(json.loads(result_data))def main(self):for page in range(1, 5):print(f'正在爬取第{page}页')self.get_info(page)if __name__ == '__main__':jy = JianYu()jy.main()

http://www.dtcms.com/a/427551.html

相关文章:

  • 4.0 Labview中算法实例1-迟滞曲线上两段的平均差(拐点计算)
  • 网站建设数据库搭建西安广告设计制作公司
  • 作一手房用什么做网站有关学校网站建设策划书
  • 企业网站建设方案详细方案厦门网站建设2
  • 微服务服务治理
  • 网站定制费用银川建设网站
  • [陇剑杯 2021]简单日志分析(问3)
  • 微信的网站徐州网站设计师
  • CC工具箱使用指南:【整库修复几何】
  • 【完整源码+数据集+部署教程】工厂工人操作机械工作图像分割系统: yolov8-seg-RepHGNetV2
  • 网站设计与制作简单吗可以用来注册网站域名的入口是
  • 怎样做内网网站seo企业网络推广培训
  • C 语言各种指针详解
  • 【个人随想】我们是否缺乏从头再来的勇气
  • 自监督学习在医疗AI中的技术实现路径分析(上)
  • 麻涌手机网站设计建设的网站服务器
  • 五维论-解释万物法则
  • 国际海运业务全流程操作解析:易境通海运系统如何赋能各环节?
  • 【代码随想录day 29】 力扣 406.根据身高重建队列
  • 上海网站建设报价单网站设计平台及开发工具
  • 2006 年真题配套词汇单词笔记(考研真相)
  • Ubuntu 24.04 安装搜狗输入法完整教程
  • 淘宝买cdk自己做网站游戏编程软件
  • 试用网站如何做免费自动交易软件app
  • Linux rsyslog 日志服务及日志转发实践
  • 静态网站flash怎么看网站的访问量
  • 体育如何做原创视频网站潮州seo网站推广
  • d40: vue杂项问题
  • WordPress 安全检查指南:让你的网站更稳定、更安全
  • 类似于wordpress的网站开放平台供稿人计划