百度登录密码加密算法

原创
2016/03/25 14:50
阅读数 420

闲来无事做了款百度贴吧批量发帖的软件 海獭贴吧助手

其实就是post的操作啦,比较麻烦的是百度的登录密码的算法,直接google,发现竟然没有答案,好不容易找到一个自称知道算法的,竟然还收费。tnnd的不就是一个js算法,老汉花20分钟自己跟踪了一下,发现一个很奇妙的问题,虽然算法一直,但是不同的接口所代入的参数还是略有不同,比较变态的一个接口竟然还放了个特殊的空字符。而且js代码风格和水平也不一致。可以看出百度内部的代码管理也是欠缺的,大公司重复劳动,不可以避免。

先放一个比较清楚的:

function BarrettMu(i) {
    this.modulus = biCopy(i),
    this.k = biHighIndex(this.modulus) + 1;
    var t = new BigInt;
    t.digits[2 * this.k] = 1,
    this.mu = biDivide(t, this.modulus),
    this.bkplus1 = new BigInt,
    this.bkplus1.digits[this.k + 1] = 1,
    this.modulo = BarrettMu_modulo,
    this.multiplyMod = BarrettMu_multiplyMod,
    this.powMod = BarrettMu_powMod
}
function BarrettMu_modulo(i) {
    var t = biDivideByRadixPower(i, this.k - 1)
      , r = biMultiply(t, this.mu)
      , e = biDivideByRadixPower(r, this.k + 1)
      , g = biModuloByRadixPower(i, this.k + 1)
      , s = biMultiply(e, this.modulus)
      , n = biModuloByRadixPower(s, this.k + 1)
      , d = biSubtract(g, n);
    d.isNeg && (d = biAdd(d, this.bkplus1));
    for (var a = biCompare(d, this.modulus) >= 0; a; )
        d = biSubtract(d, this.modulus),
        a = biCompare(d, this.modulus) >= 0;
    return d
}
function BarrettMu_multiplyMod(i, t) {
    var r = biMultiply(i, t);
    return this.modulo(r)
}
function BarrettMu_powMod(i, t) {
    var r = new BigInt;
    r.digits[0] = 1;
    for (var e = i, g = t; ; ) {
        if (0 != (1 & g.digits[0]) && (r = this.multiplyMod(r, e)),
        g = biShiftRight(g, 1),
        0 == g.digits[0] && 0 == biHighIndex(g))
            break;
        e = this.multiplyMod(e, e)
    }
    return r
}
function setMaxDigits(i) {
    maxDigits = i,
    ZERO_ARRAY = new Array(maxDigits);
    for (var t = 0; t < ZERO_ARRAY.length; t++)
        ZERO_ARRAY[t] = 0;
    bigZero = new BigInt,
    bigOne = new BigInt,
    bigOne.digits[0] = 1
}
function BigInt(i) {
    this.digits = "boolean" == typeof i && 1 == i ? null  : ZERO_ARRAY.slice(0),
    this.isNeg = !1
}
function biFromDecimal(i) {
    for (var t, r = "-" == i.charAt(0), e = r ? 1 : 0; e < i.length && "0" == i.charAt(e); )
        ++e;
    if (e == i.length)
        t = new BigInt;
    else {
        var g = i.length - e
          , s = g % dpl10;
        for (0 == s && (s = dpl10),
        t = biFromNumber(Number(i.substr(e, s))),
        e += s; e < i.length; )
            t = biAdd(biMultiply(t, lr10), biFromNumber(Number(i.substr(e, dpl10)))),
            e += dpl10;
        t.isNeg = r
    }
    return t
}
function biCopy(i) {
    var t = new BigInt(!0);
    return t.digits = i.digits.slice(0),
    t.isNeg = i.isNeg,
    t
}
function biFromNumber(i) {
    var t = new BigInt;
    t.isNeg = 0 > i,
    i = Math.abs(i);
    for (var r = 0; i > 0; )
        t.digits[r++] = i & maxDigitVal,
        i >>= biRadixBits;
    return t
}
function reverseStr(i) {
    for (var t = "", r = i.length - 1; r > -1; --r)
        t += i.charAt(r);
    return t
}
function biToString(i, t) {
    var r = new BigInt;
    r.digits[0] = t;
    for (var e = biDivideModulo(i, r), g = hexatrigesimalToChar[e[1].digits[0]]; 1 == biCompare(e[0], bigZero); ){
        var e = biDivideModulo(e[0], r);
        var digit = e[1].digits[0];
        g += hexatrigesimalToChar[e[1].digits[0]];
    }
    return (i.isNeg ? "-" : "") + reverseStr(g)
}
function biToDecimal(i) {
    var t = new BigInt;
    t.digits[0] = 10;
    for (var r = biDivideModulo(i, t), e = String(r[1].digits[0]); 1 == biCompare(r[0], bigZero); )
        r = biDivideModulo(r[0], t),
        e += String(r[1].digits[0]);
    return (i.isNeg ? "-" : "") + reverseStr(e)
}
function digitToHex(t) {
    var r = 15
      , e = "";
    for (var i = 0; 4 > i; ++i)
        e += hexToChar[t & r],
        t >>>= 4;
    return reverseStr(e)
}
function biToHex(i) {
    for (var t = "", r = (biHighIndex(i),
    biHighIndex(i)); r > -1; --r)
        t += digitToHex(i.digits[r]);
    return t
}
function charToHex(i) {
    var t, r = 48, e = r + 9, g = 97, s = g + 25, n = 65, d = 90;
    return t = i >= r && e >= i ? i - r : i >= n && d >= i ? 10 + i - n : i >= g && s >= i ? 10 + i - g : 0
}
function hexToDigit(i) {
    for (var t = 0, r = Math.min(i.length, 4), e = 0; r > e; ++e)
        t <<= 4,
        t |= charToHex(i.charCodeAt(e));
    return t
}
function biFromHex(i) {
    for (var t = new BigInt, r = i.length, e = r, g = 0; e > 0; e -= 4,
    ++g)
        t.digits[g] = hexToDigit(i.substr(Math.max(e - 4, 0), Math.min(e, 4)));
    return t
}
function biFromString(i, t) {
    var r = "-" == i.charAt(0)
      , e = r ? 1 : 0
      , g = new BigInt
      , s = new BigInt;
    s.digits[0] = 1;
    for (var n = i.length - 1; n >= e; n--) {
        var d = i.charCodeAt(n)
          , a = charToHex(d)
          , o = biMultiplyDigit(s, a);
        g = biAdd(g, o),
        s = biMultiplyDigit(s, t)
    }
    return g.isNeg = r,
    g
}
function biDump(i) {
    return (i.isNeg ? "-" : "") + i.digits.join(" ")
}
function biAdd(i, t) {
    var r;
    if (i.isNeg != t.isNeg)
        t.isNeg = !t.isNeg,
        r = biSubtract(i, t),
        t.isNeg = !t.isNeg;
    else {
        r = new BigInt;
        for (var e, g = 0, s = 0; s < i.digits.length; ++s)
            e = i.digits[s] + t.digits[s] + g,
            r.digits[s] = 65535 & e,
            g = Number(e >= biRadix);
        r.isNeg = i.isNeg
    }
    return r
}
function biSubtract(i, t) {
    var r;
    if (i.isNeg != t.isNeg)
        t.isNeg = !t.isNeg,
        r = biAdd(i, t),
        t.isNeg = !t.isNeg;
    else {
        r = new BigInt;
        var e, g;
        g = 0;
        for (var s = 0; s < i.digits.length; ++s)
            e = i.digits[s] - t.digits[s] + g,
            r.digits[s] = 65535 & e,
            r.digits[s] < 0 && (r.digits[s] += biRadix),
            g = 0 - Number(0 > e);
        if (-1 == g) {
            g = 0;
            for (var s = 0; s < i.digits.length; ++s)
                e = 0 - r.digits[s] + g,
                r.digits[s] = 65535 & e,
                r.digits[s] < 0 && (r.digits[s] += biRadix),
                g = 0 - Number(0 > e);
            r.isNeg = !i.isNeg
        } else
            r.isNeg = i.isNeg
    }
    return r
}
function biHighIndex(i) {
    for (var t = i.digits.length - 1; t > 0 && 0 == i.digits[t]; )
        --t;
    return t
}
function biNumBits(i) {
    var t, r = biHighIndex(i), e = i.digits[r], g = (r + 1) * bitsPerDigit;
    for (t = g; t > g - bitsPerDigit && 0 == (32768 & e); --t)
        e <<= 1;
    return t
}
function biMultiply(i, t) {
    for (var r, e, g, s = new BigInt, n = biHighIndex(i), d = biHighIndex(t), a = 0; d >= a; ++a) {
        for (var r = 0,g = a,j = 0; n >= j; ++j,++g)
            e = s.digits[g] + i.digits[j] * t.digits[a] + r,
            s.digits[g] = e & maxDigitVal,
            r = e >>> biRadixBits;
        s.digits[a + n + 1] = r
    }
    return s.isNeg = i.isNeg != t.isNeg,
    s
}
function biMultiplyDigit(i, t) {
    var r, e, g;
    var result = new BigInt,r = biHighIndex(i),e = 0;
    for (var s = 0; r >= s; ++s)
        g = result.digits[s] + i.digits[s] * t + e,
        result.digits[s] = g & maxDigitVal,
        e = g >>> biRadixBits;
    return result.digits[1 + r] = e,
    result
}
function arrayCopy(i, t, r, e, g) {
    for (var s = Math.min(t + g, i.length), n = t, d = e; s > n; ++n,
    ++d)
        r[d] = i[n]
}
function biShiftLeft(i, t) {
    var r = Math.floor(t / bitsPerDigit)
      , e = new BigInt;
    arrayCopy(i.digits, 0, e.digits, r, e.digits.length - r);
    for (var g = t % bitsPerDigit, s = bitsPerDigit - g, n = e.digits.length - 1, d = n - 1; n > 0; --n,
    --d)
        e.digits[n] = e.digits[n] << g & maxDigitVal | (e.digits[d] & highBitMasks[g]) >>> s;
    return e.digits[0] = e.digits[n] << g & maxDigitVal,
    e.isNeg = i.isNeg,
    e
}
function biShiftRight(i, t) {
    var r = Math.floor(t / bitsPerDigit)
      , e = new BigInt;
    arrayCopy(i.digits, r, e.digits, 0, i.digits.length - r);
    for (var g = t % bitsPerDigit, s = bitsPerDigit - g, n = 0, d = n + 1; n < e.digits.length - 1; ++n,
    ++d)
        e.digits[n] = e.digits[n] >>> g | (e.digits[d] & lowBitMasks[g]) << s;
    return e.digits[e.digits.length - 1] >>>= g,
    e.isNeg = i.isNeg,
    e
}
function biMultiplyByRadixPower(i, t) {
    var r = new BigInt;
    return arrayCopy(i.digits, 0, r.digits, t, r.digits.length - t),
    r
}
function biDivideByRadixPower(i, t) {
    var r = new BigInt;
    return arrayCopy(i.digits, t, r.digits, 0, r.digits.length - t),
    r
}
function biModuloByRadixPower(i, t) {
    var r = new BigInt;
    return arrayCopy(i.digits, 0, r.digits, 0, t),
    r
}
function biCompare(i, t) {
    if (i.isNeg != t.isNeg)
        return 1 - 2 * Number(i.isNeg);
    for (var r = i.digits.length - 1; r >= 0; --r)
        if (i.digits[r] != t.digits[r])
            return i.isNeg ? 1 - 2 * Number(i.digits[r] > t.digits[r]) : 1 - 2 * Number(i.digits[r] < t.digits[r]);
    return 0
}
function biDivideModulo(i, t) {
    var r, e, g = biNumBits(i), s = biNumBits(t), n = t.isNeg;
    if (s > g)
        return i.isNeg ? (r = biCopy(bigOne),
        r.isNeg = !t.isNeg,
        i.isNeg = !1,
        t.isNeg = !1,
        e = biSubtract(t, i),
        i.isNeg = !0,
        t.isNeg = n) : (r = new BigInt,
        e = biCopy(i)),
        new Array(r,e);
    r = new BigInt,
    e = i;
    for (var d = Math.ceil(s / bitsPerDigit) - 1, a = 0; t.digits[d] < biHalfRadix; )
        t = biShiftLeft(t, 1),
        ++a,
        ++s,
        d = Math.ceil(s / bitsPerDigit) - 1;
    e = biShiftLeft(e, a),
    g += a;
    for (var o = Math.ceil(g / bitsPerDigit) - 1, b = biMultiplyByRadixPower(t, o - d); -1 != biCompare(e, b); )
        ++r.digits[o - d],
        e = biSubtract(e, b);
    for (var u = o; u > d; --u) {
        var l = u >= e.digits.length ? 0 : e.digits[u]
          , h = u - 1 >= e.digits.length ? 0 : e.digits[u - 1]
          , f = u - 2 >= e.digits.length ? 0 : e.digits[u - 2]
          , x = d >= t.digits.length ? 0 : t.digits[d]
          , c = d - 1 >= t.digits.length ? 0 : t.digits[d - 1];
        r.digits[u - d - 1] = l == x ? maxDigitVal : Math.floor((l * biRadix + h) / x);
        for (var m = r.digits[u - d - 1] * (x * biRadix + c), v = l * biRadixSquared + (h * biRadix + f); m > v; )
            --r.digits[u - d - 1],
            m = r.digits[u - d - 1] * (x * biRadix | c),
            v = l * biRadix * biRadix + (h * biRadix + f);
        b = biMultiplyByRadixPower(t, u - d - 1),
        e = biSubtract(e, biMultiplyDigit(b, r.digits[u - d - 1])),
        e.isNeg && (e = biAdd(e, b),
        --r.digits[u - d - 1])
    }
    return e = biShiftRight(e, a),
    r.isNeg = i.isNeg != n,
    i.isNeg && (r = n ? biAdd(r, bigOne) : biSubtract(r, bigOne),
    t = biShiftRight(t, a),
    e = biSubtract(t, e)),
    0 == e.digits[0] && 0 == biHighIndex(e) && (e.isNeg = !1),
    new Array(r,e)
}
function biDivide(i, t) {
    return biDivideModulo(i, t)[0]
}
function biModulo(i, t) {
    return biDivideModulo(i, t)[1]
}
function biMultiplyMod(i, t, r) {
    return biModulo(biMultiply(i, t), r)
}
function biPow(i, t) {
    for (var r = bigOne, e = i; ; ) {
        if (0 != (1 & t) && (r = biMultiply(r, e)),
        t >>= 1,
        0 == t)
            break;
        e = biMultiply(e, e)
    }
    return r
}
function biPowMod(i, t, r) {
    for (var e = bigOne, g = i, s = t; ; ) {
        if (0 != (1 & s.digits[0]) && (e = biMultiplyMod(e, g, r)),
        s = biShiftRight(s, 1),
        0 == s.digits[0] && 0 == biHighIndex(s))
            break;
        g = biMultiplyMod(g, g, r)
    }
    return e
}
function RSAKeyPair(i, t, r) {
    this.e = biFromHex(i),
    this.d = biFromHex(t),
    this.m = biFromHex(r),
    this.chunkSize = 2 * biHighIndex(this.m),
    this.radix = 16,
    this.barrett = new BarrettMu(this.m)
}
function twoDigit(i) {
    return (10 > i ? "0" : "") + String(i)
}
function encryptedString(i, t) {
    for (var r = new Array, e = t.length, g = 0; e > g; )
        r[g] = t.charCodeAt(g),
        g++;
    for (; r.length % i.chunkSize != 0; )
        r[g++] = 0;
    var s, n, d, a = r.length, o = "";
    for (g = 0; a > g; g += i.chunkSize) {
        for (d = new BigInt,
        s = 0,
        n = g; n < g + i.chunkSize; ++s)
            d.digits[s] = r[n++],
            d.digits[s] += r[n++] << 8;
        var b = i.barrett.powMod(d, i.e)
          , u = 16 == i.radix ? biToHex(b) : biToString(b, i.radix);
        o += u + " "
    }
    return o.substring(0, o.length - 1)
}
function decryptedString(i, t) {
    var r, e, g, s = t.split(" "), n = "";
    for (r = 0; r < s.length; ++r) {
        var d;
        for (d = 16 == i.radix ? biFromHex(s[r]) : biFromString(s[r], i.radix),
        g = i.barrett.powMod(d, i.d),
        e = 0; e <= biHighIndex(g); ++e)
            n += String.fromCharCode(255 & g.digits[e], g.digits[e] >> 8)
    }
    return 0 == n.charCodeAt(n.length - 1) && (n = n.substring(0, n.length - 1)),
    n
}
var biRadixBase = 2, biRadixBits = 16, bitsPerDigit = biRadixBits, biRadix = 65536, biHalfRadix = biRadix >>> 1, biRadixSquared = biRadix * biRadix, maxDigitVal = biRadix - 1, maxInteger = 9999999999999998, maxDigits, ZERO_ARRAY, bigZero, bigOne;
setMaxDigits(20);
var dpl10 = 15
  , lr10 = biFromNumber(1e15)
  , hexatrigesimalToChar = new Array("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")
  , hexToChar = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f")
  , highBitMasks = new Array(0,32768,49152,57344,61440,63488,64512,65024,65280,65408,65472,65504,65520,65528,65532,65534,65535)
  , lowBitMasks = new Array(0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535);
展开阅读全文
打赏
1
5 收藏
分享
加载中
更多评论
打赏
0 评论
5 收藏
1
分享
返回顶部
顶部