Js逆向爬虫
学习目标:
- 了解 混淆的作用
- 了解 ob混淆的方式
- 了解 如何将代码进行混淆
- 熟悉 解析混淆网站的过程
一、混淆简介
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 code
-
-
function 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.核心数据混淆
-
变量/函数名混淆
将有意义标识符(变量、函数、常量)替换为无意义的短名称(如_0x1a2b、a、b),大幅降低代码可读性。 -
字符串加密与阵列化
将明文字符串进行编码(Base64、Hex、MD5 等)或拆分为数组元素,使用时动态解密,防止通过字符串搜索快速定位关键逻辑。 -
属性名加密
对对象属性名进行转换或哈希处理,隐藏属性访问关系,增加代码跟踪难度。
2.结构与逻辑混淆
-
控制流平坦化
将原有线性或分支代码逻辑拆分为多个基本块,并通过中央调度器(如switch-case结构)控制执行流程,使代码执行顺序混乱无序。 -
僵尸代码注入
插入无效代码、冗余逻辑或永不执行的条件分支,干扰分析人员阅读与自动化分析工具。 -
多态变异技术
每次代码执行时自动重构自身(如更改变量名、调整语句顺序),实现功能不变而形态变化,避免被动态调试捕捉固定模式。
3.执行环境检测与防护
-
反调试机制
检测开发者工具环境,触发debugger语句或异常逻辑,阻碍调试过程。可能结合定时器、控制台检查等方式增强对抗。 -
域名锁定
验证当前运行域名,若非指定域名则阻止执行,防止代码被非法迁移或滥用。 -
反格式化对抗
检测代码是否被格式化(如通过函数名或栈特征),触发异常执行流程(如死循环),导致浏览器假死或逻辑失效。
4.高级编码与动态保护
-
特殊编码转换
将代码转换为非常规形式(如 Unicode 转义序列、表情符号、自定义编码),使得人工阅读几乎不可行。 -
动态解密与实时执行
关键代码段在运行时动态解密并执行(如通过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) {
-
-
//这里可以添加其他逻辑比如 debugger
-
debugger;
-
-
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);
-
-
// sign
-
var _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 execjs
-
-
class 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,timestamp
-
html_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) {
-
//这里可以添加其他逻辑比如 debugger
-
debugger;
-
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, "
-
, 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, "
-
, 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=l
-
var 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 subprocess
-
-
-
class 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).stdout
-
print(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()
逆向爬虫——JavaScript混淆技术_javascript 代码混淆-CSDN博客

浙公网安备 33010602011771号