爬虫逆向实战(十九)--某号站登录
一、数据接口分析
主页地址:某号站
1、抓包
通过抓包可以发现登录接口
2、判断是否有加密参数
- 请求参数是否加密?
通过查看“载荷”模块可以发现有一个jsondata_rsa
的加密参数
- 请求头是否加密?
无 - 响应是否加密?
无 - cookie是否加密?
无
二、加密位置定位
1、看启动器
查看启动器发现里面有一个LoginNow
的调用,点进去查看
点进去后发现,此处就是发送ajax请求的位置,并且jsondata_rsa
参数的加密就在上方
三、扣js代码
将定位到加密位置的代码抠出,缺啥补啥即可
但是,其中还有一个vvccookie
参数和一个blackbox
参数,他们分别取的是html中#vvccookie
与#ioBB
两个input元素的值。其中#vvccookie
直接请求html,返回的html中就包含了,但是#ioBB
在返回的html中却没有值。通过搜索关键字的方式,找到了#ioBB
值的生成位置。
但是我没有看懂他是怎么生成的,刷新了几次页面,发现这个值是一样的,我就写死了。如果有大佬知道是怎么生成的,可以私信或者评论教我一下。
JavaScript源码:
var navigator = {}
navigator.appName = 'Netscape'function Arcfour() {this.i = 0;this.j = 0;this.S = new Array();
}// Initialize arcfour context from key, an array of ints, each from [0..255]
function ARC4init(key) {var i, j, t;for (i = 0; i < 256; ++i)this.S[i] = i;j = 0;for (i = 0; i < 256; ++i) {j = (j + this.S[i] + key[i % key.length]) & 255;t = this.S[i];this.S[i] = this.S[j];this.S[j] = t;}this.i = 0;this.j = 0;
}function ARC4next() {var t;this.i = (this.i + 1) & 255;this.j = (this.j + this.S[this.i]) & 255;t = this.S[this.i];this.S[this.i] = this.S[this.j];this.S[this.j] = t;return this.S[(t + this.S[this.i]) & 255];
}Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;// Plug in your RNG constructor here
function prng_newstate() {return new Arcfour();
}// Pool size must be a multiple of 4 and greater than 32.
// An array of bytes the size of the pool will be passed to init()
var rng_psize = 256;var rng_state;
var rng_pool;
var rng_pptr;// Mix in a 32-bit integer into the pool
function rng_seed_int(x) {rng_pool[rng_pptr++] ^= x & 255;rng_pool[rng_pptr++] ^= (x >> 8) & 255;rng_pool[rng_pptr++] ^= (x >> 16) & 255;rng_pool[rng_pptr++] ^= (x >> 24) & 255;if (rng_pptr >= rng_psize) rng_pptr -= rng_psize;
}// Mix in the current time (w/milliseconds) into the pool
function rng_seed_time() {rng_seed_int(new Date().getTime());
}// Initialize the pool with junk if needed.
if (rng_pool == null) {rng_pool = new Array();rng_pptr = 0;var t;if (navigator.appName == "Netscape" && navigator.appVersion < "5" && window.crypto) {// Extract entropy (256 bits) from NS4 RNG if availablevar 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) { // extract some randomness from Math.random()t = Math.floor(65536 * Math.random());rng_pool[rng_pptr++] = t >>> 8;rng_pool[rng_pptr++] = t & 255;}rng_pptr = 0;rng_seed_time();//rng_seed_int(window.screenX);//rng_seed_int(window.screenY);
}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;//rng_pool = null;}// TODO: allow reseeding after first requestreturn rng_state.next();
}function rng_get_bytes(ba) {var i;for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();
}function SecureRandom() {
}SecureRandom.prototype.nextBytes = rng_get_bytes;// Bits per digit
var dbits;// JavaScript engine analysis
var canary = 0xdeadbeefcafe;
var j_lm = ((canary & 0xffffff) == 0xefcafe);// (public) Constructor
function BigInteger(a, b, c) {if (a != null)if ("number" == typeof a) this.fromNumber(a, b, c);else if (b == null && "string" != typeof a) this.fromString(a, 256);else this.fromString(a, b);
}// return new, unset BigInteger
function nbi() {return new BigInteger(null);
}// am: Compute w_j += (x*this_i), propagate carries,
// c is initial carry, returns final carry.
// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
// We need to select the fastest one that works in this environment.// am1: use a single mult and divide to get the high bits,
// max digit bits should be 26 because
// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
function am1(i, x, w, j, c, n) {while (--n >= 0) {var v = x * this[i++] + w[j] + c;c = Math.floor(v / 0x4000000);w[j++] = v & 0x3ffffff;}return c;
}// am2 avoids a big mult-and-extract completely.
// Max digit bits should be <= 30 because we do bitwise ops
// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
function am2(i, x, w, j, c, n) {var xl = x & 0x7fff, xh = x >> 15;while (--n >= 0) {var l = this[i] & 0x7fff;var h = this[i++] >> 15;var m = xh * l + h * xl;l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);w[j++] = l & 0x3fffffff;}return c;
}// Alternately, set max digit bits to 28 since some
// browsers slow down when dealing with 32-bit numbers.
function am3(i, x, w, j, c, n) {var xl = x & 0x3fff, xh = x >> 14;while (--n >= 0) {var l = this[i] & 0x3fff;var h = this[i++] >> 14;var m = xh * l + h * xl;l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;c = (l >> 28) + (m >> 14) + xh * h;w[j++] = l & 0xfffffff;}return c;
}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 { // Mozilla/Netscape seems to prefer am3BigInteger.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;// Digit conversions
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(n) {return BI_RM.charAt(n);
}function intAt(s, i) {var c = BI_RC[s.charCodeAt(i)];return (c == null) ? -1 : c;
}// (protected) copy this to r
function bnpCopyTo(r) {for (var i = this.t - 1; i >= 0; --i) r[i] = this[i];r.t = this.t;r.s = this.s;
}// (protected) set from integer value x, -DV <= x < DV
function bnpFromInt(x) {this.t = 1;this.s = (x < 0) ? -1 : 0;if (x > 0) this[0] = x;else if (x < -1) this[0] = x + DV;else this.t = 0;
}// return bigint initialized to value
function nbv(i) {var r = nbi();r.fromInt(i);return r;
}// (protected) set from string and radix
function bnpFromString(s, b) {var k;if (b == 16) k = 4;else if (b == 8) k = 3;else if (b == 256) k = 8; // byte arrayelse if (b == 2) k = 1;else if (b == 32) k = 5;else if (b == 4) k = 2;else {this.fromRadix(s, b);return;}this.t = 0;this.s = 0;var i = s.length, mi = false, sh = 0;while (--i >= 0) {var x = (k == 8) ? s[i] & 0xff : intAt(s, i);if (x < 0) {if (s.charAt(i) == "-") mi = true;continue;}mi = false;if (sh == 0)this[this.t++] = x;else if (sh + k > this.DB) {this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;this[this.t++] = (x >> (this.DB - sh));} elsethis[this.t - 1] |= x << sh;sh += k;if (sh >= this.DB) sh -= this.DB;}if (k == 8 && (s[0] & 0x80) != 0) {this.s = -1;if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;}this.clamp();if (mi) BigInteger.ZERO.subTo(this, this);
}// (protected) clamp off excess high words
function bnpClamp() {var c = this.s & this.DM;while (this.t > 0 && this[this.t - 1] == c) --this.t;
}// (public) return string representation in given radix
function bnToString(b) {if (this.s < 0) return "-" + this.negate().toString(b);var k;if (b == 16) k = 4;else if (b == 8) k = 3;else if (b == 2) k = 1;else if (b == 32) k = 5;else if (b == 4) k = 2;else return this.toRadix(b);var km = (1 << k) - 1, d, m = false, r = "", i = this.t;var p = this.DB - (i * this.DB) % k;if (i-- > 0) {if (p < this.DB && (d = this[i] >> p) > 0) {m = true;r = int2char(d);}while (i >= 0) {if (p < k) {d = (this[i] & ((1 << p) - 1)) << (k - p);d |= this[--i] >> (p += this.DB - k);} else {d = (this[i] >> (p -= k)) & km;if (p <= 0) {p += this.DB;--i;}}if (d > 0) m = true;if (m) r += int2char(d);}}return m ? r : "0";
}// (public) -this
function bnNegate() {var r = nbi();BigInteger.ZERO.subTo(this, r);return r;
}// (public) |this|
function bnAbs() {return (this.s < 0) ? this.negate() : this;
}// (public) return + if this > a, - if this < a, 0 if equal
function bnCompareTo(a) {var r = this.s - a.s;if (r != 0) return r;var i = this.t;r = i - a.t;if (r != 0) return r;while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r;return 0;
}// returns bit length of the integer x
function nbits(x) {var r = 1, t;if ((t = x >>> 16) != 0) {x = t;r += 16;}if ((t = x >> 8) != 0) {x = t;r += 8;}if ((t = x >> 4) != 0) {x = t;r += 4;}if ((t = x >> 2) != 0) {x = t;r += 2;}if ((t = x >> 1) != 0) {x = t;r += 1;}return r;
}// (public) return the number of bits in "this"
function bnBitLength() {if (this.t <= 0) return 0;return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));
}// (protected) r = this << n*DB
function bnpDLShiftTo(n, r) {var i;for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i];for (i = n - 1; i >= 0; --i) r[i] = 0;r.t = this.t + n;r.s = this.s;
}// (protected) r = this >> n*DB
function bnpDRShiftTo(n, r) {for (var i = n; i < this.t; ++i) r[i - n] = this[i];r.t = Math.max(this.t - n, 0);r.s = this.s;
}// (protected) r = this << n
function bnpLShiftTo(n, r) {var bs = n % this.DB;var cbs = this.DB - bs;var bm = (1 << cbs) - 1;var ds = Math.floor(n / this.DB), c = (this.s << bs) & this.DM, i;for (i = this.t - 1; i >= 0; --i) {r[i + ds + 1] = (this[i] >> cbs) | c;c = (this[i] & bm) << bs;}for (i = ds - 1; i >= 0; --i) r[i] = 0;r[ds] = c;r.t = this.t + ds + 1;r.s = this.s;r.clamp();
}// (protected) r = this >> n
function bnpRShiftTo(n, r) {r.s = this.s;var ds = Math.floor(n / this.DB);if (ds >= this.t) {r.t = 0;return;}var bs = n % this.DB;var cbs = this.DB - bs;var bm = (1 << bs) - 1;r[0] = this[ds] >> bs;for (var i = ds + 1; i < this.t; ++i) {r[i - ds - 1] |= (this[i] & bm) << cbs;r[i - ds] = this[i] >> bs;}if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs;r.t = this.t - ds;r.clamp();
}// (protected) r = this - a
function bnpSubTo(a, r) {var i = 0, c = 0, m = Math.min(a.t, this.t);while (i < m) {c += this[i] - a[i];r[i++] = c & this.DM;c >>= this.DB;}if (a.t < this.t) {c -= a.s;while (i < this.t) {c += this[i];r[i++] = c & this.DM;c >>= this.DB;}c += this.s;} else {c += this.s;while (i < a.t) {c -= a[i];r[i++] = c & this.DM;c >>= this.DB;}c -= a.s;}r.s = (c < 0) ? -1 : 0;if (c < -1) r[i++] = this.DV + c;else if (c > 0) r[i++] = c;r.t = i;r.clamp();
}// (protected) r = this * a, r != this,a (HAC 14.12)
// "this" should be the larger one if appropriate.
function bnpMultiplyTo(a, r) {var x = this.abs(), y = a.abs();var i = x.t;r.t = i + y.t;while (--i >= 0) r[i] = 0;for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);r.s = 0;r.clamp();if (this.s != a.s) BigInteger.ZERO.subTo(r, r);
}// (protected) r = this^2, r != this (HAC 14.16)
function bnpSquareTo(r) {var x = this.abs();var i = r.t = 2 * x.t;while (--i >= 0) r[i] = 0;for (i = 0; i < x.t - 1; ++i) {var c = x.am(i, x[i], r, 2 * i, 0, 1);if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {r[i + x.t] -= x.DV;r[i + x.t + 1] = 1;}}if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);r.s = 0;r.clamp();
}// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
// r != q, this != m. q or r may be null.
function bnpDivRemTo(m, q, r) {var pm = m.abs();if (pm.t <= 0) return;var pt = this.abs();if (pt.t < pm.t) {if (q != null) q.fromInt(0);if (r != null) this.copyTo(r);return;}if (r == null) r = nbi();var y = nbi(), ts = this.s, ms = m.s;var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulusif (nsh > 0) {pm.lShiftTo(nsh, y);pt.lShiftTo(nsh, r);} else {pm.copyTo(y);pt.copyTo(r);}var ys = y.t;var y0 = y[ys - 1];if (y0 == 0) return;var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2;var i = r.t, j = i - ys, t = (q == null) ? nbi() : q;y.dlShiftTo(j, t);if (r.compareTo(t) >= 0) {r[r.t++] = 1;r.subTo(t, r);}BigInteger.ONE.dlShiftTo(ys, t);t.subTo(y, y); // "negative" y so we can replace sub with am laterwhile (y.t < ys) y[y.t++] = 0;while (--j >= 0) {// Estimate quotient digitvar qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it outy.dlShiftTo(j, t);r.subTo(t, r);while (r[i] < --qd) r.subTo(t, r);}}if (q != null) {r.drShiftTo(ys, q);if (ts != ms) BigInteger.ZERO.subTo(q, q);}r.t = ys;r.clamp();if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainderif (ts < 0) BigInteger.ZERO.subTo(r, r);
}// (public) this mod a
function bnMod(a) {var r = nbi();this.abs().divRemTo(a, null, r);if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r);return r;
}// Modular reduction using "classic" algorithm
function Classic(m) {this.m = m;
}function cConvert(x) {if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);else return x;
}function cRevert(x) {return x;
}function cReduce(x) {x.divRemTo(this.m, null, x);
}function cMulTo(x, y, r) {x.multiplyTo(y, r);this.reduce(r);
}function cSqrTo(x, r) {x.squareTo(r);this.reduce(r);
}Classic.prototype.convert = cConvert;
Classic.prototype.revert = cRevert;
Classic.prototype.reduce = cReduce;
Classic.prototype.mulTo = cMulTo;
Classic.prototype.sqrTo = cSqrTo;// (protected) return "-1/this % 2^DB"; useful for Mont. reduction
// justification:
// xy == 1 (mod m)
// xy = 1+km
// xy(2-xy) = (1+km)(1-km)
// x[y(2-xy)] = 1-k^2m^2
// x[y(2-xy)] == 1 (mod m^2)
// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
// JS multiply "overflows" differently from C/C++, so care is needed here.
function bnpInvDigit() {if (this.t < 1) return 0;var x = this[0];if ((x & 1) == 0) return 0;var y = x & 3; // y == 1/x mod 2^2y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16// last step - calculate inverse mod DV directly;// assumes 16 < DB <= 32 and assumes ability to handle 48-bit intsy = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits// we really want the negative inverse, and -DV < y < DVreturn (y > 0) ? this.DV - y : -y;
}// Montgomery reduction
function Montgomery(m) {this.m = m;this.mp = m.invDigit();this.mpl = this.mp & 0x7fff;this.mph = this.mp >> 15;this.um = (1 << (m.DB - 15)) - 1;this.mt2 = 2 * m.t;
}// xR mod m
function montConvert(x) {var r = nbi();x.abs().dlShiftTo(this.m.t, r);r.divRemTo(this.m, null, r);if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r);return r;
}// x/R mod m
function montRevert(x) {var r = nbi();x.copyTo(r);this.reduce(r);return r;
}// x = x/R mod m (HAC 14.32)
function montReduce(x) {while (x.t <= this.mt2) // pad x so am has enough room laterx[x.t++] = 0;for (var i = 0; i < this.m.t; ++i) {// faster way of calculating u0 = x[i]*mp mod DVvar j = x[i] & 0x7fff;var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;// use am to combine the multiply-shift-add into one callj = i + this.m.t;x[j] += this.m.am(0, u0, x, i, 0, this.m.t);// propagate carrywhile (x[j] >= x.DV) {x[j] -= x.DV;x[++j]++;}}x.clamp();x.drShiftTo(this.m.t, x);if (x.compareTo(this.m) >= 0) x.subTo(this.m, x);
}// r = "x^2/R mod m"; x != r
function montSqrTo(x, r) {x.squareTo(r);this.reduce(r);
}// r = "xy/R mod m"; x,y != r
function montMulTo(x, y, r) {x.multiplyTo(y, r);this.reduce(r);
}Montgomery.prototype.convert = montConvert;
Montgomery.prototype.revert = montRevert;
Montgomery.prototype.reduce = montReduce;
Montgomery.prototype.mulTo = montMulTo;
Montgomery.prototype.sqrTo = montSqrTo;// (protected) true iff this is even
function bnpIsEven() {return ((this.t > 0) ? (this[0] & 1) : this.s) == 0;
}// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
function bnpExp(e, z) {if (e > 0xffffffff || e < 1) return BigInteger.ONE;var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e) - 1;g.copyTo(r);while (--i >= 0) {z.sqrTo(r, r2);if ((e & (1 << i)) > 0) z.mulTo(r2, g, r);else {var t = r;r = r2;r2 = t;}}return z.revert(r);
}// (public) this^e % m, 0 <= e < 2^32
function bnModPowInt(e, m) {var z;if (e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);return this.exp(e, z);
}// protected
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;// public
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;// "constants"
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64pad = "=";function hex2b64(h) {var i;var c;var ret = "";for (i = 0; i + 3 <= h.length; i += 3) {c = parseInt(h.substring(i, i + 3), 16);ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);}if (i + 1 == h.length) {c = parseInt(h.substring(i, i + 1), 16);ret += b64map.charAt(c << 2);} else if (i + 2 == h.length) {c = parseInt(h.substring(i, i + 2), 16);ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);}while ((ret.length & 3) > 0) ret += b64pad;return ret;
}// convert a base64 string to hex
function b64tohex(s) {var ret = ""var i;var k = 0; // b64 state, 0-3var slop;for (i = 0; i < s.length; ++i) {if (s.charAt(i) == b64pad) break;v = b64map.indexOf(s.charAt(i));if (v < 0) continue;if (k == 0) {ret += int2char(v >> 2);slop = v & 3;k = 1;} else if (k == 1) {ret += int2char((slop << 2) | (v >> 4));slop = v & 0xf;k = 2;} else if (k == 2) {ret += int2char(slop);ret += int2char(v >> 2);slop = v & 3;k = 3;} else {ret += int2char((slop << 2) | (v >> 4));ret += int2char(v & 0xf);k = 0;}}if (k == 1)ret += int2char(slop << 2);return ret;
}// convert a base64 string to a byte/number array
function b64toBA(s) {//piggyback on b64tohex for now, optimize latervar h = b64tohex(s);var i;var a = new Array();for (i = 0; 2 * i < h.length; ++i) {a[i] = parseInt(h.substring(2 * i, 2 * i + 2), 16);}return a;
}// Depends on jsbn.js and rng.js// Version 1.1: support utf-8 encoding in pkcs1pad2// convert a (hex) string to a bignum object
function parseBigInt(str, r) {return new BigInteger(str, r);
}function linebrk(s, n) {var ret = "";var i = 0;while (i + n < s.length) {ret += s.substring(i, i + n) + "\n";i += n;}return ret + s.substring(i, s.length);
}function byte2Hex(b) {if (b < 0x10)return "0" + b.toString(16);elsereturn b.toString(16);
}// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
function pkcs1pad2(s, n) {if (n < s.length + 11) { // TODO: fix for utf-8alert("Message too long for RSA");return null;}var ba = new Array();var i = s.length - 1;while (i >= 0 && n > 0) {var c = s.charCodeAt(i--);if (c < 128) { // encode using utf-8ba[--n] = c;} else if ((c > 127) && (c < 2048)) {ba[--n] = (c & 63) | 128;ba[--n] = (c >> 6) | 192;} else {ba[--n] = (c & 63) | 128;ba[--n] = ((c >> 6) & 63) | 128;ba[--n] = (c >> 12) | 224;}}ba[--n] = 0;var rng = new SecureRandom();var x = new Array();while (n > 2) { // random non-zero padx[0] = 0;while (x[0] == 0) rng.nextBytes(x);ba[--n] = x[0];}ba[--n] = 2;ba[--n] = 0;return new BigInteger(ba);
}// "empty" RSA key constructor
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;
}// Set the public key fields N and e from hex strings
function RSASetPublic(N, E) {if (N != null && E != null && N.length > 0 && E.length > 0) {this.n = parseBigInt(N, 16);this.e = parseInt(E, 16);} elsealert("Invalid RSA public key");
}// Perform raw public operation on "x": return x^e (mod n)
function RSADoPublic(x) {return x.modPowInt(this.e, this.n);
}// Return the PKCS#1 RSA encryption of "text" as an even-length hex string
function RSAEncrypt(text) {var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3);if (m == null) return null;var c = this.doPublic(m);if (c == null) return null;var h = c.toString(16);if ((h.length & 1) == 0) return h; else return "0" + h;
}// Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string
//function RSAEncryptB64(text) {
// var h = this.encrypt(text);
// if(h) return hex2b64(h); else return null;
//}// protected
RSAKey.prototype.doPublic = RSADoPublic;// public
RSAKey.prototype.setPublic = RSASetPublic;
RSAKey.prototype.encrypt = RSAEncrypt;
//RSAKey.prototype.encrypt_b64 = RSAEncryptB64;var public_key = "B0AAFA4C9D388208E9F55B14DF04C8603D0CD81B7B65BBD669FA893096C985E33682FE7DEEE6500E1C4C6722C9855B6DD2E130F3672BEBA446B72D8DFFF2DD1F4E23D6BD728E267A9DC2C544C6680712884926D67AF74B74E5AD8298034D8C16FE8E5A37706EF5E447E423E69CA7FD3E47BBF7A9B137EF9B0310E2560E13D3C1";
var public_length = "10001";function rsa_encrypt(str) {var BLOCK_SIZE = public_key.length / 2 - 11;var ret = '';while (str.length > 0) {var i = BLOCK_SIZE;if (str.length < i) i = str.length;str_1 = str.substr(0, i);str = str.substr(i, str.length - i);ret += rsa_encrypt1(str_1) + ' ';}return (ret);
}function rsa_encrypt1(str) {var rsa = new RSAKey();rsa.setPublic(public_key, public_length);var res = rsa.encrypt(str);res = hex2b64(res);return (res);
}var CryptoJS = require('crypto-js')function get_param(username, password, code, vvccookie, blackbox) {jsondata_rsa = {"username": username,"loginpass": password,"code": CryptoJS.MD5(code).toString(),"vvccookie": vvccookie,"blackbox": blackbox}return rsa_encrypt(JSON.stringify(jsondata_rsa));
}
相关文章:
爬虫逆向实战(十九)--某号站登录
一、数据接口分析 主页地址:某号站 1、抓包 通过抓包可以发现登录接口 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现有一个jsondata_rsa的加密参数 请求头是否加密? 无响应是否加密? 无cookie是否…...
linux环境docker安装mysql
1:docker拉取mysql镜像(可有自己选择mysql版本) [rootlocalhost ~]# docker pull mysql:8.02: Docker 中启动 MySQL 容器,可以使用以下命令: docker run -d --name mysql_container -v ./sql:/docker-…...
taro h5 formData上传图片的坑-Required request part ‘file‘ is not present
描述:用formData上传图片 1、生成formData const formData new FormData() formData.append(file, data) // data是file formData.append(xxx, xxx) // 添加其他参数2、用taro.request请求 Taro.request({url: xxxx,data: formData,header: {Content-Type: mult…...
GNU GRUB version 2.06 Minimal Bash-lke line editing is supported 问题修复
一、问题背景 博主喜欢折腾系统,电脑原来有一个windows系统,想整一个Linux双系统,结果开机时出现以下画面: GNU GRUB version 2.06 Minimal Bash-lke line editing is supported. TAB lists possible comand completions, Anywh…...
Embedding 向量生成GPT数据使用相关
如果使用python3.6的版本,使用pycharm创建工程,那么默认会使用 docx包,这样运行程序会爆异常,突然想起以前请教的一个大神,想当 初,这个问题困扰了我 两天时间,在此记录一下: pytho…...
Jenkins工具系列 —— 配置邮箱 每个job下动态设置临时发送人
文章目录 安装插件添加邮箱认证邮箱申请(以QQ邮箱网页为例)jenkins添加邮箱认证 jenkins设置邮箱相关信息配置全局邮件单个JOB邮箱配置 安装插件 点击 左侧的 Manage Jenkins —> Plugins ——> 左侧的 Available plugins 添加邮箱认证 邮箱申请…...
华纳云:ubuntu中怎么查看进程占用的端口
在Ubuntu中,你可以使用以下命令来查看进程占用的端口: 打开终端(Terminal)。 使用 netstat 命令来查看进程占用的端口。以下是几个常用的命令示例: 查看所有进程占用的端口和地址: netstat -tuln 查看TCP端…...
【学会动态规划】 最长递增子序列(26)
目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…...
Azure虚拟网络对等互连
什么是Azure虚拟网络对等互联 Azure虚拟网络对等互联(Azure Virtual Network peering)是一种连接两个虚拟网络的方法,使得这两个虚拟网络能够在同一地理区域内进行通信。它通过私有IP地址在虚拟网络之间建立网络连接,不论是在同一…...
CTFhub-sql-整数注入
判断存在 sqli 注入 1 1 and 11 1 and 12 因为 11 为真,12 为假,且 11 与 1 显示的数据一样,那么就存在 sqli 注入 查询该数据表的字段数量 一、 2 3 1,2成功带出数据,3没有数据,所以有两个字段 二、 1 order by …...
管理类联考——逻辑——真题篇——按知识分类——汇总篇——二、论证逻辑——归纳——第三节 归纳论证有效性
文章目录 第三节 归纳论证有效性真题(2007-37)——归纳——归纳论证有效性——两面验证法真题(2000-60)——归纳——归纳论证有效性——构造对照组实验真题(2001-44)——归纳——归纳论证有效性——寻找针对该缺陷的选项第三节 归纳论证有效性 真题(2007-37)——归纳—…...
PaddleRS 1.0.0版本安装
PaddleRS 1.0.0版本安装 PaddleRS是百度飞桨、遥感科研院所及相关高校共同开发的基于飞桨的遥感影像智能解译开发套件, 支持图像分割、目标检测、场景分类、变化检测、图像复原等常见遥感任务。 PaddleRS致力于帮助遥感领域科研从业者快速完成算法的研发、验证和调…...
三维重建 PyQt Python MRP 四视图(横断面,冠状面,矢状面,3D)
本文实现了 Python MPR 的 四视图,横断面,冠状面,矢状面,3D MPR(multi-planner reformation)也称多平面重建,多重面重建是将扫描范围内所有的轴位图像叠加起来再对某些标线标定的重组线所指定的组织进行冠状、矢状位、…...
使用vscode编写插件-php语言
https://blog.csdn.net/qq_45701130/article/details/125206645 一、环境搭建 1、安装 Visual Studio Code 2、安装 Node.js 3、安装 Git 4、安装生产插件代码的工具:npm install -g yo generator-code 二、创建工程 yo code 选择项解释: 选择编写扩…...
【笔记】Spark3 AQE(Adaptive Query Execution)
提效 7 倍,Apache Spark 自适应查询优化在网易的深度实践及改进 Performance Tuning 配置Spark SQL开启Adaptive Execution特性 How To Use Spark Adaptive Query Execution (AQE) in Kyuubi 【spark系列3】spark 3.0.1 AQE(Adaptive Query Exection)分析 玩转Spark…...
【雷达】接收和去噪L波段雷达接收到的信号研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
【云原生】Docker Cgroups资源控制管理
目录 一、cgroups简介 cgroups有四大功能: 二、cpu时间片的概念 三、对CPU使用的限制 3.1 设置CPU使用率上限 (1)查看容器的默认CPU使用限制 (2)进行压力测试 (3)创建容器时设置CPU使用时…...
k8s部署prometheus
1、prometheus部署yml文件地址 github地址 2、下载yml文件 rootiZj6cd9joygowsf7am5hryZ:~# git clone https://github.com/redhatxl/k8s-prometheus-grafana.git Cloning into k8s-prometheus-grafana... remote: Enumerating objects: 21, done. remote: Total 21 (delta 0)…...
飞书小程序开发
1.tt.showModal后跳转页面 跳转路径要为绝对路径,相对路径跳转无响应。 2.手机息屏后将不再进入onload()生命周期,直接进入onshow()生命周期。 onLoad()在页面初始化的时候触发,一个页面只调用一次。 onShow()在切入前台时就会触发&#x…...
Revit 3D高效处理:cad exchanger sdk 3.21 Crack
3D 格式概述:Revit Revit 已成为寻求高效、准确的建筑信息建模的专业人士的首选解决方案。在这篇引人入胜的功能概述中了解 Revit 的特性和影响。 什么是Revit? Autodesk Revit 是一款流行的 CAD 软件,重点关注 BIM,被建筑师、工…...
【已解决】Linux中启动docker 出现 ‘ Failed to start docker.service: Unit not found. ’ 错误
启动docker 出现 ‘ Failed to start docker.service: Unit not found. ’ 错误 这是因为缺少 rhel-push-plugin.socket 单元,该单元是rhel-push-plugin软件包的一部分。所以我们执行以下指令就可以成功解决: curl -sSL https://get.docker.com/ | sh 执…...
【学习日记】【FreeRTOS】时间片的实现
前言 本文以野火的教程和代码为基础,对 FreeRTOS 中时间片的概念作了解释,并且给出了实现方式,同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中,我们已经知道任务根据不同的优先级被放入就绪列表中不…...
CentOS Docker仓库和代理配置
无法直接访问外部网络时,除了Host自己的全局代理设置之外,需要单独给Docker Client和Instance设置代理。 如执行docker run时遇到下面的错误 docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 3.216.…...
Lnton羚通算法算力云平台在环境配置中Windows10终端和VSCode下如何打开Anaconda-Prompt
在Windows 10的终端和VSCode中,可以直接打开Anaconda Prompt。下面是两种方法: Windows 10终端:在开始菜单中搜索"Anaconda Prompt",然后点击打开。这将启动Anaconda Prompt终端,你可以在其中执行conda相关命…...
Python web实战之细说Django的集成测试
关键词: Python Web开发、Django、集成测试、实战、测试驱动开发、自动化测试、Selenium、测试框架、测试用例、代码覆盖率、持续集成 今天给大家分享一下Python Web开发——Django的集成测试,如何利用集成测试来提高代码质量、减少bug。 1. 什么是集成…...
Laravel 模型的作用域 模型的访问器和修改器 ⑨
作者 : SYFStrive 博客首页 : HomePage 📜: THINK PHP 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 ὄ…...
每日一学——交换机
交换机是一种网络设备,用于连接多台计算机和其他网络设备,以实现数据的交换和传输。它通过将数据包在不同端口之间转发,将数据从一个设备发送到目标设备。交换机可以提供高速、可靠和安全的局域网连接。 交换机的工作原理是根据目标MAC地址来…...
数学建模大全及优缺点解读
分类模型 1、距离聚类(系统聚类)(常用,需掌握) 优点: ①将一批样本数据按照他们在性质上的亲密程度在没有先验知识的情况下自动进行分类 ②是一种探索性的分析方法,分类结果不一定相同 例如&am…...
C++简介
文章目录 C简介C版本C11例子 C14例子 C17C20例子 C简介 C是一种高级编程语言,它是对C语言的扩展和增强。C由Bjarne Stroustrup于1980年发明,主要用于系统级编程、游戏开发、嵌入式系统等领域。 C具有许多特性,其中最重要的是面向对象编程&a…...
【广州华锐互动】3D空间编辑器:一款简洁易用的VR/3D在线编辑工具
随着虚拟现实技术的不断发展,数字孪生技术的应用已经被广泛应用于产品设计和制作中,能充分发挥企业应用3D建模的优势,凸显了三维设计的价值,在生产阶段也能够充分发挥3D模型的作用。 如今,广州华锐互动开发的3D空间编辑…...
江门网站推广技巧付费/深圳知名seo公司
2019独角兽企业重金招聘Python工程师标准>>> 实现步骤: 1.自定义转换器,实现Convert接口 package jv.springmvc.requestmapping;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;import org.spr…...
交易网站开发/2024年3月新冠肺炎
1、从网站可以正常使用的时间上来说如果用不备案的国外空间,申请域名购买空间后网站是直接可以打开访问的,如果备案,工信部公布的审核时间是20个工作日,也就是说除去周六周日要进一个月备案才能审批下来,之后才能正常访…...
网站开发建设是否需要经营许可/营销咨询公司排名前十
作者:Lindsay Smith 翻译:王雨桐 校对:丁楠雅本文约2500字,建议阅读5分钟。本文对比2018第四季度和2019第一季度中DZone上不同技术话题的热门程度,分析哪些是当前的流行话题,哪些话题的热度减退,…...
中文图片转wordpress/营销型网站建设易网拓
2.1.2 定义“onRadionButtonClicked”方法 需要在主活动(MainActivity)中定义“onRadionButtonClicked”方法,如图4所示。 图4 “onRadionButtonClicked”方法 “onRadionButtonClicked”方法的访问权限public,返回值必须是void…...
广州地铁2号线/seo短视频网页入口
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt205 利用Java反射机制你可以在运行期动态的创建接口的实现。java.lang.reflect.Proxy类就可以实现这一功能。这个类的名字(译者注:Proxy意思为代理)就是为什么把…...
网站建设公司应该怎么转型/哪个公司做网站推广最好
-- Start 我们都知道数字可以进行加、减、乘、除等运算。那么,日期可不可以呢?答案是,日期只能进行加、减运算。 在开始操作日期之前,我们先了解一下 Oracle 支持哪些日期数据类型,如下所示: DATE TIM…...