爬虫逆向实战(十九)--某号站登录

一、数据接口分析

主页地址:某号站

1、抓包

通过抓包可以发现登录接口
在这里插入图片描述

2、判断是否有加密参数

  1. 请求参数是否加密?
    通过查看“载荷”模块可以发现有一个jsondata_rsa的加密参数
    在这里插入图片描述
  2. 请求头是否加密?
  3. 响应是否加密?
  4. 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));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/100897.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#和Java的大端位和小端位的问题

C#代码里就是小端序,Java代码里就是大端序&#xff0c; 大端位:big endian,是指数据的高字节保存在内存的低地址中&#xff0c;而数据的低字节保存在内存的高地址中&#xff0c;也叫高尾端 小端位:little endian,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存…

【数字实验室】时钟切换

大部分开发者使用 BUFGCTRL 或 BUFGMUX进行时钟切换&#xff0c;它们在时钟切换上可以提供无毛刺输出。然而&#xff0c;了解所涉及的原理是有好处的。 当然&#xff0c;无论我们在同步逻辑中使用哪种技术&#xff0c;重要的是要确保在进行时钟切换时输出上没有毛刺。任何故障都…

【报错】yarn --version Unrecognized option: --version Error...

文章目录 问题分析解决问题 在使用 npm install -g yarn 全局安装 yarn 后,查看yarn 的版本号,报错如下 PS D:\global-data-display> yarn --version Unrecognized option: --version Error: Could

C++信息学奥赛2046:【例5.15】替换字母

这段代码的功能是对输入的字符串进行处理&#xff0c;将字符串中的字符 a 替换为字符 b 后输出结果。 #include<bits/stdc.h> using namespace std; int main() {string s; // 定义字符串变量s&#xff0c;用来存储输入的字符串char a, b; // 定义字符变量a和b&#xff…

pytest结合Excel实现接口自动化

前言 我们先来回顾下之前篇章“pytest通过parametrize方法实现数据驱动实战”&#xff0c;主要是通过yaml文件来读取测试用例。而我们用Excel文件存放测试用例又有什么区别呢&#xff1f; 毫无疑问&#xff0c;Pytest自动化测试框架也能读取Excel文件实现数据驱动。 还记得之…

innodb事务实现

事务的特性 ACID 事务的类别 事务实现 redo redoLog buffer 的格式 undo 更新主键 purge group commit 因为上层的binlog和底层的redolog要保持一致&#xff0c;所以 事务控制语句 事务隔离级别 分布式事务 事务习惯

酷开系统 | 酷开科技大数据,更好的与目标消费人群建立联系

众所周知&#xff0c;OTT的一大优势在于强曝光&#xff0c;能够给消费者带来强烈的视觉冲击&#xff0c;强化品牌认知。但是&#xff0c;要想达到提升品牌认知&#xff0c;首先要保证OTT的流量规模&#xff0c;实现对目标人群的有效覆盖。得年轻消费者得“天下”&#xff0c;年…

解决方案:fatal error: openssl/bio.h: 没有那个文件或目录

出现报错如下&#xff1a; 出现该错误的原因有两个&#xff1a; 没有安装openssl或者libssl-dev库Libssl-dev版本过高&#xff0c;需要降级 一. 没有安装openssl或者libssl-dev库 使用指令安装openssl&#xff1a; 我的是已经安装完成了&#xff0c;所以再把libssl-dev的库也…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第二天)Mybatis的深入学习

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第二天&#xff09;Mybatis的深入学习&#xff08;增删改查的操作&#xff09; 上一篇我们的项目搭建好了&#xff0c;也写了简答的Junit测试类进行测试&#xff0c;可以正确映射…

STM32--TIM定时器(2)

文章目录 输出比较PWM输出比较通道参数计算舵机简介直流电机简介TB6612 PWM基本结构PWM驱动呼吸灯PWM驱动舵机PWM控制电机 输出比较 输出比较&#xff0c;简称OC&#xff08;Output Compare&#xff09;。 输出比较的原理是&#xff0c;当定时器计数值与比较值相等或者满足某种…

C++学习系列之DLL动态库使用

C学习系列之DLL动态库使用 啰嗦动态库的创建动态库的调用函数生成1.需要头文件函数定义&#xff08;头文件&#xff09;2.需要函数定义&#xff08;函数文件&#xff09;3.动态库中的头文件4.动态库中的主文件5.运行查看是否存在C#的调用的入口点6.C#调用 总结 啰嗦 项目需要&…

数据结构,二叉树,前中后序遍历

二叉树的种类 最优二叉树 最优二叉树画法 排序取最小两个值和&#xff0c;得到新值加入排序重复1&#xff0c;2 前序、中序和后序遍历是树形数据结构&#xff08;如二叉树&#xff09;中常用的遍历方式&#xff0c;用于按照特定顺序遍历树的节点。这些遍历方式在不同应用中有不…

二、9.硬盘驱动程序

文件系统是运行在操作系统中的软件模块&#xff0c;是操作系统提供的一套管理磁盘文件读写的方法和数据组织、存储形式&#xff0c;因此&#xff0c;文件系统&#xff1d;数据结构&#xff0b;算法&#xff0c;哈哈&#xff0c;所以它是程序。它的管理对象是文件&#xff0c;管…

信号处理--基于EEG脑电信号的眼睛状态的分析

本实验为生物信息学专题设计小项目。项目目的是通过提供的14导联EEG 脑电信号&#xff0c;实现对于人体睁眼和闭眼两个状态的数据分类分析。每个脑电信号的时长大约为117秒。 目录 加载相关的库函数 读取脑电信号数据并查看数据的属性 绘制脑电多通道连接矩阵 绘制两类数据…

校企合作谋发展 合作共赢谱新篇|云畅科技与湖南民族职业学院签订校企合作协议

产业是经济发展的重要引擎&#xff0c;人才是产业发展的重要资源。为积极探索软件人才培育新路径&#xff0c;共商政产学研协同新机制&#xff0c;8月8日&#xff0c;云畅科技与湖南省民族职业学院教育技术学院软件技术专业签订校企合作协议。 会上&#xff0c;学院副校长王志平…

vue3组件多个根节点报错

打开扩展商店搜索下载 vetur 打开设置命令面板 搜索eslint 将下面的勾选取消

EasyExcel工具 Java导出Excel表数据

EasyExcel 优点坐标依赖读Excel最简单的读的对象写Excel最简单的写的对象最简单的读的监听器填充Excel简单填充(对象)复杂填充(对象和列表)官网:https://easyexcel.opensource.alibaba.com/ EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。…

查看所有数据库各表容量大小

查看所有数据库各表容量大小 1. 查看所有数据库各表容量大小2.查看指定数据库容量大小3. 查看所有数据库容量大小 1. 查看所有数据库各表容量大小 select table_schema as 数据库, table_name as 表名, table_rows as 记录数, truncate(data_length/1024/1024, 2) as 数据容量…

MyBatis plus 多数据源实现

1. 项目背景 最近写文章发布到【笑小枫】小程序和我的个人网站上&#xff0c;因为个人网站用的是halo框架搭建&#xff0c;两边数据结构不一致&#xff0c;导致我每次维护文章都需要两边维护&#xff0c;这就很烦~ 于是&#xff0c;本文就诞生了。通过项目连接这两个数据库&a…

VM部署CentOS并且设置网络

最近在准备学习k8s&#xff0c;需要部署服务器&#xff0c;所以需要在虚拟机中部署centOS服务&#xff0c;接下来我们将一步一步到操作来&#xff0c;如何在VM中不是CentOS系统。 一&#xff1a;环境 VMware Workstation Pro 链接&#xff1a;https://pan.baidu.com/s/1hSKr…