Created
January 29, 2018 15:18
-
-
Save xl7dev/2823fd724942baa2447ad7f18385a002 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python | |
| # encoding: utf-8 | |
| import sys | |
| import execjs | |
| def runjs(password): | |
| js = execjs.compile(""" | |
| var k = RSAUtils = {} | |
| var o = 2; | |
| var e = 16; | |
| var c = e; | |
| var b = 1 << 16; | |
| var z = b >>> 1; | |
| var l = b * b; | |
| var h = b - 1; | |
| var A = 9999999999999998; | |
| var m; | |
| var g; | |
| var t, a; | |
| var v = BigInt = function (B) { | |
| if (typeof B == "boolean" && B == true) { | |
| this.digits = null | |
| } else { | |
| this.digits = g.slice(0) | |
| } | |
| this.isNeg = false | |
| }; | |
| k.setMaxDigits = function (C) { | |
| m = C; | |
| g = new Array(m); | |
| for (var B = 0; B < g.length; B++) { | |
| g[B] = 0 | |
| } | |
| t = new v(); | |
| a = new v(); | |
| a.digits[0] = 1 | |
| }; | |
| k.setMaxDigits(20); | |
| var q = 15; | |
| k.biFromNumber = function (D) { | |
| var B = new v(); | |
| B.isNeg = D < 0; | |
| D = Math.abs(D); | |
| var C = 0; | |
| while (D > 0) { | |
| B.digits[C++] = D & h; | |
| D = Math.floor(D / b) | |
| } | |
| return B | |
| }; | |
| var r = k.biFromNumber(1000000000000000); | |
| k.biFromDecimal = function (F) { | |
| var E = F.charAt(0) == "-"; | |
| var D = E ? 1 : 0; | |
| var B; | |
| while (D < F.length && F.charAt(D) == "0") { | |
| ++D | |
| } | |
| if (D == F.length) { | |
| B = new v() | |
| } else { | |
| var C = F.length - D; | |
| var G = C % q; | |
| if (G == 0) { | |
| G = q | |
| } | |
| B = k.biFromNumber(Number(F.substr(D, G))); | |
| D += G; | |
| while (D < F.length) { | |
| B = k.biAdd(k.biMultiply(B, r), k.biFromNumber(Number(F.substr(D, q)))); | |
| D += q | |
| } | |
| B.isNeg = E | |
| } | |
| return B | |
| }; | |
| k.biCopy = function (C) { | |
| var B = new v(true); | |
| B.digits = C.digits.slice(0); | |
| B.isNeg = C.isNeg; | |
| return B | |
| }; | |
| k.reverseStr = function (D) { | |
| var B = ""; | |
| for (var C = D.length - 1; C > -1; --C) { | |
| B += D.charAt(C) | |
| } | |
| return B | |
| }; | |
| var x = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; | |
| k.biToString = function (D, F) { | |
| var C = new v(); | |
| C.digits[0] = F; | |
| var E = k.biDivideModulo(D, C); | |
| var B = x[E[1].digits[0]]; | |
| while (k.biCompare(E[0], t) == 1) { | |
| E = k.biDivideModulo(E[0], C); | |
| digit = E[1].digits[0]; | |
| B += x[E[1].digits[0]] | |
| } | |
| return (D.isNeg ? "-" : "") + k.reverseStr(B) | |
| }; | |
| k.biToDecimal = function (D) { | |
| var C = new v(); | |
| C.digits[0] = 10; | |
| var E = k.biDivideModulo(D, C); | |
| var B = String(E[1].digits[0]); | |
| while (k.biCompare(E[0], t) == 1) { | |
| E = k.biDivideModulo(E[0], C); | |
| B += String(E[1].digits[0]) | |
| } | |
| return (D.isNeg ? "-" : "") + k.reverseStr(B) | |
| }; | |
| var w = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; | |
| k.digitToHex = function (D) { | |
| var C = 15; | |
| var B = ""; | |
| for (i = 0; i < 4; ++i) { | |
| B += w[D & C]; | |
| D >>>= 4 | |
| } | |
| return k.reverseStr(B) | |
| }; | |
| k.biToHex = function (C) { | |
| var B = ""; | |
| var E = k.biHighIndex(C); | |
| for (var D = k.biHighIndex(C); D > -1; --D) { | |
| B += k.digitToHex(C.digits[D]) | |
| } | |
| return B | |
| }; | |
| k.charToHex = function (I) { | |
| var D = 48; | |
| var C = D + 9; | |
| var E = 97; | |
| var H = E + 25; | |
| var G = 65; | |
| var F = 65 + 25; | |
| var B; | |
| if (I >= D && I <= C) { | |
| B = I - D | |
| } else { | |
| if (I >= G && I <= F) { | |
| B = 10 + I - G | |
| } else { | |
| if (I >= E && I <= H) { | |
| B = 10 + I - E | |
| } else { | |
| B = 0 | |
| } | |
| } | |
| } | |
| return B | |
| }; | |
| k.hexToDigit = function (E) { | |
| var C = 0; | |
| var B = Math.min(E.length, 4); | |
| for (var D = 0; D < B; ++D) { | |
| C <<= 4; | |
| C |= k.charToHex(E.charCodeAt(D)) | |
| } | |
| return C | |
| }; | |
| k.biFromHex = function (F) { | |
| var C = new v(); | |
| var B = F.length; | |
| for (var E = B, D = 0; E > 0; E -= 4, ++D) { | |
| C.digits[D] = k.hexToDigit(F.substr(Math.max(E - 4, 0), Math.min(E, 4))) | |
| } | |
| return C | |
| }; | |
| k.biFromString = function (J, I) { | |
| var B = J.charAt(0) == "-"; | |
| var E = B ? 1 : 0; | |
| var K = new v(); | |
| var C = new v(); | |
| C.digits[0] = 1; | |
| for (var D = J.length - 1; D >= E; D--) { | |
| var F = J.charCodeAt(D); | |
| var G = k.charToHex(F); | |
| var H = k.biMultiplyDigit(C, G); | |
| K = k.biAdd(K, H); | |
| C = k.biMultiplyDigit(C, I) | |
| } | |
| K.isNeg = B; | |
| return K | |
| }; | |
| k.biDump = function (B) { | |
| return (B.isNeg ? "-" : "") + B.digits.join(" ") | |
| }; | |
| k.biAdd = function (C, G) { | |
| var B; | |
| if (C.isNeg != G.isNeg) { | |
| G.isNeg = !G.isNeg; | |
| B = k.biSubtract(C, G); | |
| G.isNeg = !G.isNeg | |
| } else { | |
| B = new v(); | |
| var F = 0; | |
| var E; | |
| for (var D = 0; D < C.digits.length; ++D) { | |
| E = C.digits[D] + G.digits[D] + F; | |
| B.digits[D] = E % b; | |
| F = Number(E >= b) | |
| } | |
| B.isNeg = C.isNeg | |
| } | |
| return B | |
| }; | |
| k.biSubtract = function (C, G) { | |
| var B; | |
| if (C.isNeg != G.isNeg) { | |
| G.isNeg = !G.isNeg; | |
| B = k.biAdd(C, G); | |
| G.isNeg = !G.isNeg | |
| } else { | |
| B = new v(); | |
| var F, E; | |
| E = 0; | |
| for (var D = 0; D < C.digits.length; ++D) { | |
| F = C.digits[D] - G.digits[D] + E; | |
| B.digits[D] = F % b; | |
| if (B.digits[D] < 0) { | |
| B.digits[D] += b | |
| } | |
| E = 0 - Number(F < 0) | |
| } | |
| if (E == -1) { | |
| E = 0; | |
| for (var D = 0; D < C.digits.length; ++D) { | |
| F = 0 - B.digits[D] + E; | |
| B.digits[D] = F % b; | |
| if (B.digits[D] < 0) { | |
| B.digits[D] += b | |
| } | |
| E = 0 - Number(F < 0) | |
| } | |
| B.isNeg = !C.isNeg | |
| } else { | |
| B.isNeg = C.isNeg | |
| } | |
| } | |
| return B | |
| }; | |
| k.biHighIndex = function (C) { | |
| var B = C.digits.length - 1; | |
| while (B > 0 && C.digits[B] == 0) { | |
| --B | |
| } | |
| return B | |
| }; | |
| k.biNumBits = function (D) { | |
| var F = k.biHighIndex(D); | |
| var E = D.digits[F]; | |
| var C = (F + 1) * c; | |
| var B; | |
| for (B = C; B > C - c; --B) { | |
| if ((E & 32768) != 0) { | |
| break | |
| } | |
| E <<= 1 | |
| } | |
| return B | |
| }; | |
| k.biMultiply = function (H, G) { | |
| var K = new v(); | |
| var F; | |
| var C = k.biHighIndex(H); | |
| var J = k.biHighIndex(G); | |
| var I, B, D; | |
| for (var E = 0; E <= J; ++E) { | |
| F = 0; | |
| D = E; | |
| for (j = 0; j <= C; ++j, ++D) { | |
| B = K.digits[D] + H.digits[j] * G.digits[E] + F; | |
| K.digits[D] = B & h; | |
| F = B >>> e | |
| } | |
| K.digits[E + C + 1] = F | |
| } | |
| K.isNeg = H.isNeg != G.isNeg; | |
| return K | |
| }; | |
| k.biMultiplyDigit = function (B, G) { | |
| var F, E, D; | |
| result = new v(); | |
| F = k.biHighIndex(B); | |
| E = 0; | |
| for (var C = 0; C <= F; ++C) { | |
| D = result.digits[C] + B.digits[C] * G + E; | |
| result.digits[C] = D & h; | |
| E = D >>> e | |
| } | |
| result.digits[1 + F] = E; | |
| return result | |
| }; | |
| k.arrayCopy = function (F, I, D, H, G) { | |
| var B = Math.min(I + G, F.length); | |
| for (var E = I, C = H; E < B; ++E, ++C) { | |
| D[C] = F[E] | |
| } | |
| }; | |
| var f = [0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535]; | |
| k.biShiftLeft = function (C, I) { | |
| var E = Math.floor(I / c); | |
| var B = new v(); | |
| k.arrayCopy(C.digits, 0, B.digits, E, B.digits.length - E); | |
| var H = I % c; | |
| var D = c - H; | |
| for (var F = B.digits.length - 1, G = F - 1; F > 0; --F, --G) { | |
| B.digits[F] = ((B.digits[F] << H) & h) | ((B.digits[G] & f[H]) >>> (D)) | |
| } | |
| B.digits[0] = ((B.digits[F] << H) & h); | |
| B.isNeg = C.isNeg; | |
| return B | |
| }; | |
| var u = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535]; | |
| k.biShiftRight = function (C, I) { | |
| var D = Math.floor(I / c); | |
| var B = new v(); | |
| k.arrayCopy(C.digits, D, B.digits, 0, C.digits.length - D); | |
| var G = I % c; | |
| var H = c - G; | |
| for (var E = 0, F = E + 1; E < B.digits.length - 1; ++E, ++F) { | |
| B.digits[E] = (B.digits[E] >>> G) | ((B.digits[F] & u[G]) << H) | |
| } | |
| B.digits[B.digits.length - 1] >>>= G; | |
| B.isNeg = C.isNeg; | |
| return B | |
| }; | |
| k.biMultiplyByRadixPower = function (C, D) { | |
| var B = new v(); | |
| k.arrayCopy(C.digits, 0, B.digits, D, B.digits.length - D); | |
| return B | |
| }; | |
| k.biDivideByRadixPower = function (C, D) { | |
| var B = new v(); | |
| k.arrayCopy(C.digits, D, B.digits, 0, B.digits.length - D); | |
| return B | |
| }; | |
| k.biModuloByRadixPower = function (C, D) { | |
| var B = new v(); | |
| k.arrayCopy(C.digits, 0, B.digits, 0, D); | |
| return B | |
| }; | |
| k.biCompare = function (B, D) { | |
| if (B.isNeg != D.isNeg) { | |
| return 1 - 2 * Number(B.isNeg) | |
| } | |
| for (var C = B.digits.length - 1; C >= 0; --C) { | |
| if (B.digits[C] != D.digits[C]) { | |
| if (B.isNeg) { | |
| return 1 - 2 * Number(B.digits[C] > D.digits[C]) | |
| } else { | |
| return 1 - 2 * Number(B.digits[C] < D.digits[C]) | |
| } | |
| } | |
| } | |
| return 0 | |
| }; | |
| k.biDivideModulo = function (G, F) { | |
| var B = k.biNumBits(G); | |
| var E = k.biNumBits(F); | |
| var D = F.isNeg; | |
| var L, K; | |
| if (B < E) { | |
| if (G.isNeg) { | |
| L = k.biCopy(a); | |
| L.isNeg = !F.isNeg; | |
| G.isNeg = false; | |
| F.isNeg = false; | |
| K = biSubtract(F, G); | |
| G.isNeg = true; | |
| F.isNeg = D | |
| } else { | |
| L = new v(); | |
| K = k.biCopy(G) | |
| } | |
| return [L, K] | |
| } | |
| L = new v(); | |
| K = G; | |
| var I = Math.ceil(E / c) - 1; | |
| var H = 0; | |
| while (F.digits[I] < z) { | |
| F = k.biShiftLeft(F, 1); | |
| ++H; | |
| ++E; | |
| I = Math.ceil(E / c) - 1 | |
| } | |
| K = k.biShiftLeft(K, H); | |
| B += H; | |
| var O = Math.ceil(B / c) - 1; | |
| var T = k.biMultiplyByRadixPower(F, O - I); | |
| while (k.biCompare(K, T) != -1) { | |
| ++L.digits[O - I]; | |
| K = k.biSubtract(K, T) | |
| } | |
| for (var R = O; R > I; --R) { | |
| var J = (R >= K.digits.length) ? 0 : K.digits[R]; | |
| var S = (R - 1 >= K.digits.length) ? 0 : K.digits[R - 1]; | |
| var Q = (R - 2 >= K.digits.length) ? 0 : K.digits[R - 2]; | |
| var P = (I >= F.digits.length) ? 0 : F.digits[I]; | |
| var C = (I - 1 >= F.digits.length) ? 0 : F.digits[I - 1]; | |
| if (J == P) { | |
| L.digits[R - I - 1] = h | |
| } else { | |
| L.digits[R - I - 1] = Math.floor((J * b + S) / P) | |
| } | |
| var N = L.digits[R - I - 1] * ((P * b) + C); | |
| var M = (J * l) + ((S * b) + Q); | |
| while (N > M) { | |
| --L.digits[R - I - 1]; | |
| N = L.digits[R - I - 1] * ((P * b) | C); | |
| M = (J * b * b) + ((S * b) + Q) | |
| } | |
| T = k.biMultiplyByRadixPower(F, R - I - 1); | |
| K = k.biSubtract(K, k.biMultiplyDigit(T, L.digits[R - I - 1])); | |
| if (K.isNeg) { | |
| K = k.biAdd(K, T); | |
| --L.digits[R - I - 1] | |
| } | |
| } | |
| K = k.biShiftRight(K, H); | |
| L.isNeg = G.isNeg != D; | |
| if (G.isNeg) { | |
| if (D) { | |
| L = k.biAdd(L, a) | |
| } else { | |
| L = k.biSubtract(L, a) | |
| } | |
| F = k.biShiftRight(F, H); | |
| K = k.biSubtract(F, K) | |
| } | |
| if (K.digits[0] == 0 && k.biHighIndex(K) == 0) { | |
| K.isNeg = false | |
| } | |
| return [L, K] | |
| }; | |
| k.biDivide = function (B, C) { | |
| return k.biDivideModulo(B, C)[0] | |
| }; | |
| k.biModulo = function (B, C) { | |
| return k.biDivideModulo(B, C)[1] | |
| }; | |
| k.biMultiplyMod = function (C, D, B) { | |
| return k.biModulo(k.biMultiply(C, D), B) | |
| }; | |
| k.biPow = function (C, E) { | |
| var B = a; | |
| var D = C; | |
| while (true) { | |
| if ((E & 1) != 0) { | |
| B = k.biMultiply(B, D) | |
| } | |
| E >>= 1; | |
| if (E == 0) { | |
| break | |
| } | |
| D = k.biMultiply(D, D) | |
| } | |
| return B | |
| }; | |
| k.biPowMod = function (D, G, C) { | |
| var B = a; | |
| var E = D; | |
| var F = G; | |
| while (true) { | |
| if ((F.digits[0] & 1) != 0) { | |
| B = k.biMultiplyMod(B, E, C) | |
| } | |
| F = k.biShiftRight(F, 1); | |
| if (F.digits[0] == 0 && k.biHighIndex(F) == 0) { | |
| break | |
| } | |
| E = k.biMultiplyMod(E, E, C) | |
| } | |
| return B | |
| }; | |
| BarrettMu = function (B) { | |
| this.modulus = k.biCopy(B); | |
| this.k = k.biHighIndex(this.modulus) + 1; | |
| var C = new v(); | |
| C.digits[2 * this.k] = 1; | |
| this.mu = k.biDivide(C, this.modulus); | |
| this.bkplus1 = new v(); | |
| this.bkplus1.digits[this.k + 1] = 1; | |
| this.modulo = s; | |
| this.multiplyMod = n; | |
| this.powMod = d | |
| }; | |
| function s(J) { | |
| var C = k; | |
| var I = C.biDivideByRadixPower(J, this.k - 1); | |
| var G = C.biMultiply(I, this.mu); | |
| var F = C.biDivideByRadixPower(G, this.k + 1); | |
| var E = C.biModuloByRadixPower(J, this.k + 1); | |
| var K = C.biMultiply(F, this.modulus); | |
| var D = C.biModuloByRadixPower(K, this.k + 1); | |
| var B = C.biSubtract(E, D); | |
| if (B.isNeg) { | |
| B = C.biAdd(B, this.bkplus1) | |
| } | |
| var H = C.biCompare(B, this.modulus) >= 0; | |
| while (H) { | |
| B = C.biSubtract(B, this.modulus); | |
| H = C.biCompare(B, this.modulus) >= 0 | |
| } | |
| return B | |
| } | |
| function n(B, D) { | |
| var C = k.biMultiply(B, D); | |
| return this.modulo(C) | |
| } | |
| function d(C, F) { | |
| var B = new v(); | |
| B.digits[0] = 1; | |
| var D = C; | |
| var E = F; | |
| while (true) { | |
| if ((E.digits[0] & 1) != 0) { | |
| B = this.multiplyMod(B, D) | |
| } | |
| E = k.biShiftRight(E, 1); | |
| if (E.digits[0] == 0 && k.biHighIndex(E) == 0) { | |
| break | |
| } | |
| D = this.multiplyMod(D, D) | |
| } | |
| return B | |
| } | |
| var y = function (C, E, B) { | |
| var D = k; | |
| this.e = D.biFromHex(C); | |
| this.d = D.biFromHex(E); | |
| this.m = D.biFromHex(B); | |
| this.chunkSize = 2 * D.biHighIndex(this.m); | |
| this.radix = 16; | |
| this.barrett = new BarrettMu(this.m) | |
| }; | |
| k.getKeyPair = function (C, D, B) { | |
| return new y(C, D, B) | |
| }; | |
| if (typeof twoDigit === "undefined") { | |
| twoDigit = function (B) { | |
| return (B < 10 ? "0" : "") + String(B) | |
| } | |
| } | |
| k.encryptedString = function (I, L) { | |
| var H = []; | |
| var B = L.length; | |
| var F = 0; | |
| while (F < B) { | |
| H[F] = L.charCodeAt(F); | |
| F++ | |
| } | |
| while (H.length % I.chunkSize != 0) { | |
| H[F++] = 0 | |
| } | |
| var G = H.length; | |
| var M = ""; | |
| var E, D, C; | |
| for (F = 0; F < G; F += I.chunkSize) { | |
| C = new v(); | |
| E = 0; | |
| for (D = F; D < F + I.chunkSize; ++E) { | |
| C.digits[E] = H[D++]; | |
| C.digits[E] += H[D++] << 8 | |
| } | |
| var K = I.barrett.powMod(C, I.e); | |
| var J = I.radix == 16 ? k.biToHex(K) : k.biToString(K, I.radix); | |
| M += J + " " | |
| } | |
| return M.substring(0, M.length - 1) | |
| }; | |
| k.decryptedString = function (F, G) { | |
| var I = G.split(" "); | |
| var B = ""; | |
| var E, D, H; | |
| for (E = 0; E < I.length; ++E) { | |
| var C; | |
| if (F.radix == 16) { | |
| C = k.biFromHex(I[E]) | |
| } else { | |
| C = k.biFromString(I[E], F.radix) | |
| } | |
| H = F.barrett.powMod(C, F.d); | |
| for (D = 0; D <= k.biHighIndex(H); ++D) { | |
| B += String.fromCharCode(H.digits[D] & 255, H.digits[D] >> 8) | |
| } | |
| } | |
| if (B.charCodeAt(B.length - 1) == 0) { | |
| B = B.substring(0, B.length - 1) | |
| } | |
| return B | |
| }; | |
| k.setMaxDigits(130); | |
| function login(password) { | |
| var a = "00b6fe800bd103ea7d4b8a4f61bc96e7ad6fd8a8a70329458b594bf85d9bf349d4670e61928cd31a604dc2feb2b29fc1ae65fba24170c9e51f50f3429195c70c0036dc2c981e1af9fe9a728779a2c13ed498c9183f3ae29360e8e38f3998846045853a06398694e746ff59159b7a7d215519ef197ac314b7bc74aa5e4643bdf3cb"; | |
| var d = "010001"; | |
| var c = k.getKeyPair(d, "", a); | |
| var b = k.encryptedString(c, password); | |
| return b | |
| }; | |
| """) | |
| return js.call("login", password) | |
| if __name__ == "__main__": | |
| password = sys.argv[1] | |
| print runjs(password) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment