From 7754e1f9bef731f79d853351c5f0114de946999e Mon Sep 17 00:00:00 2001 From: liyf Date: Wed, 21 Dec 2022 15:01:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BA=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=8E:=202023-03-28=20=E5=BD=93=E4=B9=90?= =?UTF-8?q?=E7=BD=91=EF=BC=8C=E7=99=BB=E5=BD=95=E5=AF=86=E7=A0=81=E7=A0=B4?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oauth/__init__.py | 4 + oauth/demo.js | 552 ++++++++++++++++++++++++++++++++++++++++++++++ readme.MD | 1 + 3 files changed, 557 insertions(+) create mode 100644 oauth/__init__.py create mode 100644 oauth/demo.js diff --git a/oauth/__init__.py b/oauth/__init__.py new file mode 100644 index 0000000..20cffeb --- /dev/null +++ b/oauth/__init__.py @@ -0,0 +1,4 @@ +# _*_ coding: utf-8 _*_ +# @Date: 2:58 下午 +# @File: __init__.py.py +# @Author: liyf diff --git a/oauth/demo.js b/oauth/demo.js new file mode 100644 index 0000000..859579c --- /dev/null +++ b/oauth/demo.js @@ -0,0 +1,552 @@ +/* + +todo + 网址: https://oauth.d.cn/auth/goLogin.html + 接口: https://oauth.d.cn/auth/login + - get请求 + - 参数如下: + { + display: web, + name: 账号, + pwd: 加密后的密码, + to: https://www.d.cn/ + } +todo + 没啥难度,通过搜索关键字 `pwd:` 可直接定位到关键代码 + `pwd:rsaPwd, to:to,` + 而 ` rsaPwd = rsa(passwordVal)` + 接下来就是扣代码环节,缺啥补啥,把需要的函数都给扣下来,最终会生成加密后的密码值 + +*/ + +var biRadixBits = 16; +var bitsPerDigit = biRadixBits; +var biRadix = 1 << 16; // = 2^16 = 65536 +var biHalfRadix = biRadix >>> 1; +var biRadixSquared = biRadix * biRadix; +var maxDigitVal = biRadix - 1; +var highBitMasks = new Array(0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, + 0xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0, + 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF); +var lowBitMasks = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, + 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, + 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF); +var hexToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f'); + +function reverseStr(s) { + var result = ""; + for (var i = s.length - 1; i > -1; --i) { + result += s.charAt(i); + } + return result; +} + +function biMultiplyByRadixPower(x, n) { + var result = new BigInt(); + arrayCopy(x.digits, 0, result.digits, n, result.digits.length - n); + return result; +} + +function biCompare(x, y) { + if (x.isNeg != y.isNeg) { + return 1 - 2 * Number(x.isNeg); + } + for (var i = x.digits.length - 1; i >= 0; --i) { + if (x.digits[i] != y.digits[i]) { + if (x.isNeg) { + return 1 - 2 * Number(x.digits[i] > y.digits[i]); + } else { + return 1 - 2 * Number(x.digits[i] < y.digits[i]); + } + } + } + return 0; +} + +function biMultiplyDigit(x, y) { + var n, c, uv; + + result = new BigInt(); + n = biHighIndex(x); + c = 0; + for (var j = 0; j <= n; ++j) { + uv = result.digits[j] + x.digits[j] * y + c; + result.digits[j] = uv & maxDigitVal; + c = uv >>> biRadixBits; + } + result.digits[1 + n] = c; + return result; +} + +function biSubtract(x, y) { + var result; + if (x.isNeg != y.isNeg) { + y.isNeg = !y.isNeg; + result = biAdd(x, y); + y.isNeg = !y.isNeg; + } else { + result = new BigInt(); + var n, c; + c = 0; + for (var i = 0; i < x.digits.length; ++i) { + n = x.digits[i] - y.digits[i] + c; + result.digits[i] = n & 0xffff; + if (result.digits[i] < 0) result.digits[i] += biRadix; + c = 0 - Number(n < 0); + } + if (c == -1) { + c = 0; + for (var i = 0; i < x.digits.length; ++i) { + n = 0 - result.digits[i] + c; + result.digits[i] = n & 0xffff; + if (result.digits[i] < 0) result.digits[i] += biRadix; + c = 0 - Number(n < 0); + } + result.isNeg = !x.isNeg; + } else { + result.isNeg = x.isNeg; + } + } + return result; +} + +function setMaxDigits(value) { + maxDigits = value; + ZERO_ARRAY = new Array(maxDigits); + for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0; + bigZero = new BigInt(); + bigOne = new BigInt(); + bigOne.digits[0] = 1; +} + +function BigInt(flag) { + if (typeof flag == "boolean" && flag == true) { + this.digits = null; + } else { + this.digits = ZERO_ARRAY.slice(0); + } + this.isNeg = false; +} + +function RSAKeyPair(encryptionExponent, decryptionExponent, modulus, keylen) { + /* + * Convert from hexadecimal and save the encryption/decryption exponents and + * modulus as big integers in the key object. + */ + this.e = biFromHex(encryptionExponent); + this.d = biFromHex(decryptionExponent); + this.m = biFromHex(modulus); + if (typeof (keylen) != 'number') { + this.chunkSize = 2 * biHighIndex(this.m); + } else { + this.chunkSize = keylen / 8; + } + this.radix = 16; + this.barrett = new BarrettMu(this.m); +} + +function biHighIndex(x) { + var result = x.digits.length - 1; + while (result > 0 && x.digits[result] == 0) --result; + return result; +} + +function BarrettMu(m) { + this.modulus = biCopy(m); + this.k = biHighIndex(this.modulus) + 1; + var b2k = new BigInt(); + b2k.digits[2 * this.k] = 1; // b2k = b^(2k) + this.mu = biDivide(b2k, this.modulus); + this.bkplus1 = new BigInt(); + this.bkplus1.digits[this.k + 1] = 1; // bkplus1 = b^(k+1) + this.modulo = BarrettMu_modulo; + this.multiplyMod = BarrettMu_multiplyMod; + this.powMod = BarrettMu_powMod; +} + +function BarrettMu_modulo(x) { + var q1 = biDivideByRadixPower(x, this.k - 1); + var q2 = biMultiply(q1, this.mu); + var q3 = biDivideByRadixPower(q2, this.k + 1); + var r1 = biModuloByRadixPower(x, this.k + 1); + var r2term = biMultiply(q3, this.modulus); + var r2 = biModuloByRadixPower(r2term, this.k + 1); + var r = biSubtract(r1, r2); + if (r.isNeg) { + r = biAdd(r, this.bkplus1); + } + var rgtem = biCompare(r, this.modulus) >= 0; + while (rgtem) { + r = biSubtract(r, this.modulus); + rgtem = biCompare(r, this.modulus) >= 0; + } + return r; +} + +function BarrettMu_powMod(x, y) { + var result = new BigInt(); + result.digits[0] = 1; + var a = x; + var k = y; + while (true) { + if ((k.digits[0] & 1) != 0) result = this.multiplyMod(result, a); + k = biShiftRight(k, 1); + if (k.digits[0] == 0 && biHighIndex(k) == 0) break; + a = this.multiplyMod(a, a); + } + return result; +} + +function biToHex(x) { + var result = ""; + var n = biHighIndex(x); + for (var i = biHighIndex(x); i > -1; --i) { + result += digitToHex(x.digits[i]); + } + return result; +} + +function digitToHex(n) { + var mask = 0xf; + var result = ""; + for (i = 0; i < 4; ++i) { + result += hexToChar[n & mask]; + n >>>= 4; + } + return reverseStr(result); +} + +function biModuloByRadixPower(x, n) { + var result = new BigInt(); + arrayCopy(x.digits, 0, result.digits, 0, n); + return result; +} + +function biDivideByRadixPower(x, n) { + var result = new BigInt(); + arrayCopy(x.digits, n, result.digits, 0, result.digits.length - n); + return result; +} + +function biMultiply(x, y) { + var result = new BigInt(); + var c; + var n = biHighIndex(x); + var t = biHighIndex(y); + var u, uv, k; + for (var i = 0; i <= t; ++i) { + c = 0; + k = i; + for (j = 0; j <= n; ++j, ++k) { + uv = result.digits[k] + x.digits[j] * y.digits[i] + c; + result.digits[k] = uv & maxDigitVal; + c = uv >>> biRadixBits; + } + result.digits[i + n + 1] = c; + } + result.isNeg = x.isNeg != y.isNeg; + return result; +} + + +function BarrettMu_multiplyMod(x, y) { + var xy = biMultiply(x, y); + return this.modulo(xy); +} + +function biDivide(x, y) { + return biDivideModulo(x, y)[0]; +} + +function biShiftRight(x, n) { + var digitCount = Math.floor(n / bitsPerDigit); + var result = new BigInt(); + arrayCopy(x.digits, digitCount, result.digits, 0, + x.digits.length - digitCount); + var bits = n % bitsPerDigit; + var leftBits = bitsPerDigit - bits; + for (var i = 0, i1 = i + 1; i < result.digits.length - 1; ++i, ++i1) { + result.digits[i] = (result.digits[i] >>> bits) | + ((result.digits[i1] & lowBitMasks[bits]) << leftBits); + } + result.digits[result.digits.length - 1] >>>= bits; + result.isNeg = x.isNeg; + return result; +} + +function biNumBits(x) { + var n = biHighIndex(x); + var d = x.digits[n]; + var m = (n + 1) * bitsPerDigit; + var result; + for (result = m; result > m - bitsPerDigit; --result) { + if ((d & 0x8000) != 0) break; + d <<= 1; + } + return result; +} + +function biDivideModulo(x, y) { + var nb = biNumBits(x); + var tb = biNumBits(y); + var origYIsNeg = y.isNeg; + var q, r; + if (nb < tb) { + if (x.isNeg) { + q = biCopy(bigOne); + q.isNeg = !y.isNeg; + x.isNeg = false; + y.isNeg = false; + r = biSubtract(y, x); + // Restore signs, 'cause they're references. + x.isNeg = true; + y.isNeg = origYIsNeg; + } else { + q = new BigInt(); + r = biCopy(x); + } + return new Array(q, r); + } + q = new BigInt(); + r = x; + var t = Math.ceil(tb / bitsPerDigit) - 1; + var lambda = 0; + while (y.digits[t] < biHalfRadix) { + y = biShiftLeft(y, 1); + ++lambda; + ++tb; + t = Math.ceil(tb / bitsPerDigit) - 1; + } + r = biShiftLeft(r, lambda); + var n = Math.ceil(nb / bitsPerDigit) - 1; + var b = biMultiplyByRadixPower(y, n - t); + while (biCompare(r, b) != -1) { + ++q.digits[n - t]; + r = biSubtract(r, b); + } + for (var i = n; i > t; --i) { + var ri = (i >= r.digits.length) ? 0 : r.digits[i]; + var ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1]; + var ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2]; + var yt = (t >= y.digits.length) ? 0 : y.digits[t]; + var yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1]; + if (ri == yt) { + q.digits[i - t - 1] = maxDigitVal; + } else { + q.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt); + } + var c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1); + var c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2); + while (c1 > c2) { + --q.digits[i - t - 1]; + c1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1); + c2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2); + } + b = biMultiplyByRadixPower(y, i - t - 1); + r = biSubtract(r, biMultiplyDigit(b, q.digits[i - t - 1])); + if (r.isNeg) { + r = biAdd(r, b); + --q.digits[i - t - 1]; + } + } + r = biShiftRight(r, lambda); + q.isNeg = x.isNeg != origYIsNeg; + if (x.isNeg) { + if (origYIsNeg) { + q = biAdd(q, bigOne); + } else { + q = biSubtract(q, bigOne); + } + y = biShiftRight(y, lambda); + r = biSubtract(y, r); + } + if (r.digits[0] == 0 && biHighIndex(r) == 0) r.isNeg = false; + + return new Array(q, r); +} + +function biCopy(bi) { + var result = new BigInt(true); + result.digits = bi.digits.slice(0); + result.isNeg = bi.isNeg; + return result; +} + +function arrayCopy(src, srcStart, dest, destStart, n) { + var m = Math.min(srcStart + n, src.length); + for (var i = srcStart, j = destStart; i < m; ++i, ++j) { + dest[j] = src[i]; + } +} + +function biShiftLeft(x, n) { + var digitCount = Math.floor(n / bitsPerDigit); + var result = new BigInt(); + arrayCopy(x.digits, 0, result.digits, digitCount, + result.digits.length - digitCount); + var bits = n % bitsPerDigit; + var rightBits = bitsPerDigit - bits; + for (var i = result.digits.length - 1, i1 = i - 1; i > 0; --i, --i1) { + result.digits[i] = ((result.digits[i] << bits) & maxDigitVal) | + ((result.digits[i1] & highBitMasks[bits]) >>> + (rightBits)); + } + result.digits[0] = ((result.digits[i] << bits) & maxDigitVal); + result.isNeg = x.isNeg; + return result; +} + +function hexToDigit(s) { + var result = 0; + var sl = Math.min(s.length, 4); + for (var i = 0; i < sl; ++i) { + result <<= 4; + result |= charToHex(s.charCodeAt(i)) + } + return result; +} + +function charToHex(c) { + var ZERO = 48; + var NINE = ZERO + 9; + var littleA = 97; + var littleZ = littleA + 25; + var bigA = 65; + var bigZ = 65 + 25; + var result; + + if (c >= ZERO && c <= NINE) { + result = c - ZERO; + } else if (c >= bigA && c <= bigZ) { + result = 10 + c - bigA; + } else if (c >= littleA && c <= littleZ) { + result = 10 + c - littleA; + } else { + result = 0; + } + return result; +} + +function biFromHex(s) { + var result = new BigInt(); + var sl = s.length; + for (var i = sl, j = 0; i > 0; i -= 4, ++j) { + result.digits[j] = hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4))); + } + return result; +} + +function encryptedString(key, s, pad, encoding) { + var a = new Array(); // The usual Alice and Bob stuff + var sl = s.length; // Plaintext string length + var i, j, k; // The usual Fortran index stuff + var padtype; // Type of padding to do + var encodingtype; // Type of output encoding + var rpad; // Random pad + var al; // Array length + var result = ""; // Cypthertext result + var block; // Big integer block to encrypt + var crypt; // Big integer result + var text; // Text result + if (typeof (pad) == 'string') { + if (pad == RSAAPP.NoPadding) { + padtype = 1; + } else if (pad == RSAAPP.PKCS1Padding) { + padtype = 2; + } else { + padtype = 0; + } + } else { + padtype = 0; + } + if (typeof (encoding) == 'string' && encoding == RSAAPP.RawEncoding) { + encodingtype = 1; + } else { + encodingtype = 0; + } + if (padtype == 1) { + if (sl > key.chunkSize) { + sl = key.chunkSize; + } + } else if (padtype == 2) { + if (sl > (key.chunkSize - 11)) { + sl = key.chunkSize - 11; + } + } + i = 0; + if (padtype == 2) { + j = sl - 1; + } else { + j = key.chunkSize - 1; + } + while (i < sl) { + if (padtype) { + a[j] = s.charCodeAt(i); + } else { + a[i] = s.charCodeAt(i); + } + i++; + j--; + } + if (padtype == 1) { + i = 0; + } + j = key.chunkSize - (sl % key.chunkSize); + while (j > 0) { + if (padtype == 2) { + rpad = Math.floor(Math.random() * 256); + + while (!rpad) { + rpad = Math.floor(Math.random() * 256); + } + + a[i] = rpad; + } else { + a[i] = 0; + } + + i++; + j--; + } + if (padtype == 2) { + a[sl] = 0; + a[key.chunkSize - 2] = 2; + a[key.chunkSize - 1] = 0; + } + al = a.length; + for (i = 0; i < al; i += key.chunkSize) { + block = new BigInt(); + j = 0; + for (k = i; k < (i + key.chunkSize); ++j) { + block.digits[j] = a[k++]; + block.digits[j] += a[k++] << 8; + } + crypt = key.barrett.powMod(block, key.e); + if (encodingtype == 1) { + text = biToBytes(crypt); + } else { + text = (key.radix == 16) ? biToHex(crypt) : biToString(crypt, key.radix); + } + result += text; + } + return result; +} + +var rsa = function (arg) { + setMaxDigits(130); + var PublicExponent = "10001"; + var modulus = "be44aec4d73408f6b60e6fe9e3dc55d0e1dc53a1e171e071b547e2e8e0b7da01c56e8c9bcf0521568eb111adccef4e40124b76e33e7ad75607c227af8f8e0b759c30ef283be8ab17a84b19a051df5f94c07e6e7be5f77866376322aac944f45f3ab532bb6efc70c1efa524d821d16cafb580c5a901f0defddea3692a4e68e6cd"; + var key = new RSAKeyPair(PublicExponent, "", modulus); + return encryptedString(key, arg); +}; + +var js_return_pwd = rsa('123456'); +var browser_return_pwd = 'b2927281520eba726728c6f5e9579228a3102f1462c52d708ba8ee622b2124a97545d0e3a6d0315bd84e457e7550ab2357e3c019fe23bf4a57ab2ead172d2e9ce8ae1e167d54a4530a200ba9be5b2fbe08b7cbfe07f914c3c09ccfa37488cc531f9452f625e0195ab41ec88546378ae304f5f774aa2de8891446ff77aae799d8' +console.log('当密码为`123456`时\n在浏览器上接口返回的值为: \n' + browser_return_pwd + '\n通过补全js代码返回的值为: \n' + js_return_pwd) +console.log('\n对比结果如下:') +if (js_return_pwd == browser_return_pwd) { + console.log('两者一致,该js代码可直接调用生成密码参数。\n') +} else { + console.log('两者不一致,观察是否缺少参数或者其他的变量。\n') +} diff --git a/readme.MD b/readme.MD index db6faab..b1cfcbd 100644 --- a/readme.MD +++ b/readme.MD @@ -105,6 +105,7 @@ MyToken | [链接](https://www.mytokencap.com/) | [点击跳转](https://blog 黑猫投诉 | [链接](https://tousu.sina.com.cn/company/view/?couid=6384912431) | | [tousu_sign](tousu_sign) 猎聘 | [链接](https://www.liepin.com/zhaopin/?inputFrom=www_index&workYearCode=0&key=&scene=input&ckId=cei1lxwcgvjwp0v613z0tdqvn0ziea1b&dq=) | [点击跳转](liepin/demo.js) | [liepin](liepin) 阿里文学 | [链接](https://www.aliwx.com.cn/reader?bid=6813923&cid=674174) | | [aliwx](aliwx) +当乐网 | [链接](https://oauth.d.cn/auth/goLogin.html) | [点击跳转](oauth/demo.js) | [oauth](oauth) ***