base62的解码分析

mdecoder对于base62的解码一直都是用v8来跑的,但是因为对v8用的不好,导致大量解码的有时会崩溃。今晚上瞧了下他自身怎么解码的,打算自己写个解码的函数。

<script type="text/javascript">
//脚本经过改版,所以可能有些地方没意义。
//匹配p中的单词,以单词为下标从k中取明文替换。
//p  密文
//a  根据他进行下标的转换。最大62,所以这种加密方法有的地方称之为base62。
//c  k中所放东东的个数
//k  明文的单词表
//e  一开始放了个函数,转换为下标的。后来还是放了一个函数,直接返回用来构成正则的一段字符串。
//d  后来存放k的内容了。
eval(function(p, a, c, k, e, d) {
    e = function(c) {
        //返回的是两段相加的,如果大于a,则递归取值,小于a则用后面的取值。 0~35 -> 0~z; 35~61 -> A~Z; 62~97 -> 10~1z
        //parseInt() 函数可解析一个字符串,并返回一个整数。
        //toString() 方法可把一个 Number 对象转换为一个字符串,并返回结果。 NumberObject.toString(radix)  
        //               例如,当 radix 为 2 时,NumberObject 会被转换为二进制值表示的字符串。
        return (c < a ? '': e(parseInt(c / a)))    +   ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
    };
 
    if (!''.replace(/^/, String)) {            //似乎是必然为真的判断
        while (c--) d[e(c)] = k[c] || e(c);    //复制k数组内容到d数组,d数组的下标为经过函数处理的c。
        k = [function(e) {                     //k[0] = function(e){return d[e]}  k数组的第一个元素是一个函数,直接返回d数组的内容
            return d[e]
        }];
        e = function() {                       //返回"\\w+"
            return '\\w+'
        };
        c = 1
    };
 
    //只能循环一次,上面已经将c设置为1了。
	//生成一个正则表达式,以匹配到的东西为下标取d数组的内容来替换原来的内容。
    //js中的replace比较强大,会把匹配到的内容放到第二个参数(函数)里处理,然后替换。
    //正则就是匹配字母+数字+下划线组合的单词
    while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
 
    return p
} (
   '2w 1j(1E){l 2v="";l 1C=1D.2u()*1E;2t\'\\2s\\6\\B\\g\'+1D.2r(1C)+\'\\k\\5\\1A\\5\'}2q{l 1z="\\O\\6\\6\\g\\1w";1y="\\X\\X";1x="\\C\\u\\k\\W\\K\\u\\k\\D\\D\\D\\k\\D\\J\\M\\X\\1B\\8\\j\\i\\f\\1B\\k\\5\\1A\\5";1k=1z+1y+1x;1u="\\f\\o\\y\\5\\a\\6";1t="\\a\\b\\e\\t\\t\\8\\i";1s="\\a\\b\\t\\8\\i\\1w\\1g\\1v\\K\\C\\p\\M\\M\\C\\L\\C\\M\\x\\J\\L\\W\\W\\1v\\u\\L\\K\\2p\\J\\x\\L\\u\\u\\p\\u\\2o\\I\\p\\D\\K\\T\\J\\C";1m="\\x\\i\\f\\i\\o\\k\\n\\6\\h\\5\\e\\B";1i="\\n\\a\\h\\8\\g\\6\\8\\j\\2n\\k\\I\\8\\b\\5\\n\\1l\\t\\6\\5\\B\\z\\o\\y\\5\\a\\6";A=(2m["\\i\\f\\a\\R\\B\\5\\j\\6"]["\\a\\h\\5\\e\\6\\5\\T\\b\\5\\B\\5\\j\\6"](1u));A["\\t\\5\\6\\x\\6\\6\\h\\8\\o\\R\\6\\5"](1t,1s);1d(2l("l%2k%2j%2i%22%2h%1q%V%2g%U%V%2f%2e%2d%V%1r%U%22%2c%28%22%1o%2b%1r%1q%1p%2a%1p%27%U%26%25%22+%22%1o%22+%22%24%22+%22%23%22+%22%1n%22+%22%1n%22+%22%21%22%20%22%22%29%1Z"));l S=A["\\p\\h\\5\\e\\6\\5\\z\\o\\y\\5\\a\\6"](1m,"");S["\\6\\1l\\g\\5"]=1;P["\\z\\g\\5\\j"]("\\1h\\T\\1e",1k,0);P["\\n\\5\\j\\i"]();H=1j(1Y);l F=A["\\p\\h\\5\\e\\6\\5\\z\\o\\y\\5\\a\\6"](1i,"");l 1f=F["\\1h\\5\\6\\n\\g\\5\\a\\8\\e\\b\\I\\f\\b\\i\\5\\h"](0);H=F["\\1g\\R\\8\\b\\i\\1X\\e\\6\\O"](1f,H);S["\\f\\g\\5\\j"]();S["\\1W\\h\\8\\6\\5"](P.1V);S["\\n\\e\\1U\\5\\1e\\f\\I\\8\\b\\5"](H,2);S["\\p\\b\\f\\t\\5"]();l Q=A["\\p\\h\\5\\e\\6\\5\\z\\o\\y\\5\\a\\6"]("\\n\\O\\5\\b\\b\\k\\x\\g\\g\\b\\8\\a\\e\\6\\8\\f\\j","");1d("\\18\\17\\16\\w\\14\\9\\1T\\13\\1b\\q\\3\\4\\m\\s\\3\\4\\c\\d\\3\\4\\7\\1c\\3\\4\\7\\N\\3\\4\\7\\m\\3\\4\\d\\E\\3\\4\\7\\1S\\3\\4\\c\\m\\3\\4\\7\\G\\q\\1a\\19\\1R\\4\\w\\1Q\\10\\11\\r\\3\\3\\3\\4\\c\\9\\3\\4\\c\\1c\\3\\4\\c\\9\\3\\4\\c\\m\\3\\4\\7\\d\\3\\4\\7\\w\\3\\4\\9\\9\\3\\4\\9\\s\\r\\v\\r\\3\\4\\7\\9\\3\\4\\7\\w\\3\\4\\7\\m\\3\\4\\s\\1P\\3\\4\\7\\d\\3\\4\\c\\G\\3\\4\\7\\d\\r\\Z\\1O\\15\\12\\1N\\1b\\q\\3\\4\\d\\9\\3\\4\\7\\G\\3\\4\\7\\d\\3\\4\\7\\N\\3\\4\\7\\N\\3\\4\\m\\d\\3\\4\\c\\G\\3\\4\\7\\d\\3\\4\\7\\9\\3\\4\\c\\d\\3\\4\\c\\m\\3\\4\\7\\d\\q\\1a\\19\\18\\17\\16\\w\\14\\9\\v\\r\\3\\4\\s\\E\\3\\4\\s\\13\\3\\4\\7\\9\\3\\4\\s\\E\\r\\11\\1M\\c\\1L\\1K\\1J\\9\\v\\q\\q\\v\\1I\\1H\\10\\1G\\v\\E\\Z")}1F(Y){Y=1}', 
   62,
   157,
   '|||134|170|x65|x74|66|x69|63|x63|x6C|67|65|x61|x6F|x70|x72|x64|x6E|x2E|var|64|x53|x62|x43|42|47|62|x73|x30|54|104|x41|x6A|x4F|ZHjnh2|x6D|x36|x32|60||70|T7tRw3|x46|x33|x39|x2D|x35|103|x68|jhI5d||x75||x45|5Cx74|5Cx65|x31|x2F|SRgI5d|51|145|53||106|141||162|163|152|50|135|133|71|eval|x54|KxDLe|x42|x47|QI8Ea3|yGjnh2|fHjnh2|x79|CHjnh2|5Cx54|5Cx4D|5Cx6F|5Cx72|5Cx63|JHjnh21|IHjnh2|HHjnh2|x44|x3A|sfzLe|tfzLe|qezLe|x78|x77|oveAS3|Math|RgI5d|catch|156|160|157|167|122|164|124|121|73|105|114|113|61|75|x76|responseBody|x57|x50|10000|3B|2C|5Cx50||5Cx48|5Cx4C|5Cx58|5Cx2E|5Cx66|||5Cx73|5Cx69|5D|5Cx6A|5Cx62|5Cx4F|5Cx61|5Cx43|5B|3DZHjnh2|20jhI5d|unescape|window|x67|x34|x38|try|round|x7E|return|random|www|function'.split('|'), 
   0, 
   {}
  ))
 
</script>

4 Replies to “base62的解码分析”

  1. 兄弟,不要叫“解密”,它只是编码,所以叫“解码”比较恰当。
    安全领域里,叫“解密”的一般是指对加密后的数据,所谓加密其实包含了加密的算法及不易预见的加密密钥,与普通的字符编码是不一样的,对于字符编码你只要知道编码规则就一定可以解码,而对于加密来说,你知道算法也不能轻易的还原,你还需要知道加密密钥才可以。

  2. 这种方法完全没用吧?感觉像掩耳盗铃,直接把eval改成alert,明文就出来了.还是我理解错了什么?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

*