9

【Python3爬虫】破解时光网登录加密参数并实现模拟登录

 4 years ago
source link: http://www.cnblogs.com/TM0831/p/13246939.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、站点分析

MTime 时光网是一个电影媒体与电商服务平台,而这次做的模拟登录则是依靠其手机端站点,站点地址为: https://m.mtime.cn/# 。切换到登录页面,再分别输入账号和错误的密码,点击登录,登录失败,截图如下:

BvaYZrR.png!web

打开开发者工具, 选择“Network”,切换到“XHR”选项,找到一条名为 login.api 的请求,打开后可以发现就是登录所发送的请求,再查看该请求的参数部分,截图如下:

BNfqUfI.png!web

二、参数破解

1.参数分析

经过前面的分析可知有五个参数需要获取,分别是 t、name、password、code 和 codeId,其中 code 和 codeId 目前看来是空的,无须处理,而 name 就是输入的手机号,password 应该是输入的密码加密后的结果,剩下一个 t 还不知道是什么含义。

2.参数获取

在开发者工具中,Ctrl + F 全局搜索“password”,找到如下的 JavaScript 文件:

https://static3.mtime.cn/html5/20200116143308/js/views/member/signin.js

打开该文件后搜索“password”,首先是获取 name 属性为“password”的输入框,在下文中还发现了 vcode 和 vcodeId,这两个就是后面请求所需的 code 和 vcode 参数的值,截图如下:

2myEZ37.png!web

继续搜索“password”,可以找到一个 getPassword() 方法,用于获取输入的密码内容,截图如下:

2M3qqib.png!web

接着搜索“password”,找到如下内容:

7JvyM3Z.png!web

这就是登录请求时的参数部分,其中密码 password 是将输入的密码进行加密后的结果,使用的是 f.desEcbPkcs7 方法,那这个方法具体是什么呢?

3.加密方法

在上面的 JS 文件中的 217 行打上断点,然后刷新页面并重新登录,页面会进入 debugger 模式,然后选中 desEcbPkcs7 部分,点击后跳转到 app.all.min.js 中的如下代码部分:

I7VRjyF.png!web

这个 af 函数就是加密方法了,其中用到了一个变量 CryptoJS,要获取这个变量的定义,就在上面代码中的1033行打上断点,再重新登录一遍,定位到 CryptoJS 的定义部分,截图如下:

IfaeAj3.png!web

对于变量 CryptoJS 的定义包含在 libs.all.min.js 中,但这个文件中的代码量比较大,若全部复制下来使用会不方便,而我们也只需要得到对变量 CryptoJS 进行定义的代码就够了,所以建议先把该 JS 文件保存到本地,再用编辑器打开,就能很快地得到我们所需要的代码了,即使如此还是有一千四百多行(汗~)。


   1 var CryptoJS = CryptoJS || function (g, w) {
   2     var m = {}
   3         , q = m.lib = {}
   4         , j = q.Base = function () {
   5         function a() {
   6         }
   7 
   8         return {
   9             extend: function (e) {
  10                 a.prototype = this;
  11                 var c = new a;
  12                 return e && c.mixIn(e),
  13                     c.$super = this,
  14                     c
  15             },
  16             create: function () {
  17                 var c = this.extend();
  18                 return c.init.apply(c, arguments),
  19                     c
  20             },
  21             init: function () {
  22             },
  23             mixIn: function (c) {
  24                 for (var f in c) {
  25                     c.hasOwnProperty(f) && (this[f] = c[f])
  26                 }
  27                 c.hasOwnProperty("toString") && (this.toString = c.toString)
  28             },
  29             clone: function () {
  30                 return this.$super.extend(this)
  31             }
  32         }
  33     }()
  34         , v = q.WordArray = j.extend({
  35         init: function (a, c) {
  36             a = this.words = a || [],
  37                 this.sigBytes = c != w ? c : 4 * a.length
  38         },
  39         toString: function (a) {
  40             return (a || x).stringify(this)
  41         },
  42         concat: function (a) {
  43             var o = this.words
  44                 , f = a.words
  45                 , l = this.sigBytes
  46                 , a = a.sigBytes;
  47             this.clamp();
  48             if (l % 4) {
  49                 for (var c = 0; c < a; c++) {
  50                     o[l + c >>> 2] |= (f[c >>> 2] >>> 24 - 8 * (c % 4) & 255) << 24 - 8 * ((l + c) % 4)
  51                 }
  52             } else {
  53                 if (65535 < f.length) {
  54                     for (c = 0; c < a; c += 4) {
  55                         o[l + c >>> 2] = f[c >>> 2]
  56                     }
  57                 } else {
  58                     o.push.apply(o, f)
  59                 }
  60             }
  61             return this.sigBytes += a,
  62                 this
  63         },
  64         clamp: function () {
  65             var c = this.words
  66                 , a = this.sigBytes;
  67             c[a >>> 2] &= 4294967295 << 32 - 8 * (a % 4),
  68                 c.length = g.ceil(a / 4)
  69         },
  70         clone: function () {
  71             var a = j.clone.call(this);
  72             return a.words = this.words.slice(0),
  73                 a
  74         },
  75         random: function (e) {
  76             for (var a = [], c = 0; c < e; c += 4) {
  77                 a.push(4294967296 * g.random() | 0)
  78             }
  79             return v.create(a, e)
  80         }
  81     })
  82         , p = m.enc = {}
  83         , x = p.Hex = {
  84         stringify: function (a) {
  85             for (var o = a.words, a = a.sigBytes, f = [], l = 0; l < a; l++) {
  86                 var c = o[l >>> 2] >>> 24 - 8 * (l % 4) & 255;
  87                 f.push((c >>> 4).toString(16)),
  88                     f.push((c & 15).toString(16))
  89             }
  90             return f.join("")
  91         },
  92         parse: function (a) {
  93             for (var i = a.length, c = [], f = 0; f < i; f += 2) {
  94                 c[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f % 8)
  95             }
  96             return v.create(c, i / 2)
  97         }
  98     }
  99         , b = p.Latin1 = {
 100         stringify: function (a) {
 101             for (var i = a.words, a = a.sigBytes, c = [], f = 0; f < a; f++) {
 102                 c.push(String.fromCharCode(i[f >>> 2] >>> 24 - 8 * (f % 4) & 255))
 103             }
 104             return c.join("")
 105         },
 106         parse: function (a) {
 107             for (var i = a.length, c = [], f = 0; f < i; f++) {
 108                 c[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4)
 109             }
 110             return v.create(c, i)
 111         }
 112     }
 113         , h = p.Utf8 = {
 114         stringify: function (a) {
 115             try {
 116                 return decodeURIComponent(escape(b.stringify(a)))
 117             } catch (c) {
 118                 throw Error("Malformed UTF-8 data")
 119             }
 120         },
 121         parse: function (a) {
 122             return b.parse(unescape(encodeURIComponent(a)))
 123         }
 124     }
 125         , k = q.BufferedBlockAlgorithm = j.extend({
 126         reset: function () {
 127             this._data = v.create(),
 128                 this._nDataBytes = 0
 129         },
 130         _append: function (a) {
 131             "string" == typeof a && (a = h.parse(a)),
 132                 this._data.concat(a),
 133                 this._nDataBytes += a.sigBytes
 134         },
 135         _process: function (y) {
 136             var f = this._data
 137                 , s = f.words
 138                 , e = f.sigBytes
 139                 , l = this.blockSize
 140                 , z = e / (4 * l)
 141                 , z = y ? g.ceil(z) : g.max((z | 0) - this._minBufferSize, 0)
 142                 , y = z * l
 143                 , e = g.min(4 * y, e);
 144             if (y) {
 145                 for (var c = 0; c < y; c += l) {
 146                     this._doProcessBlock(s, c)
 147                 }
 148                 c = s.splice(0, y),
 149                     f.sigBytes -= e
 150             }
 151             return v.create(c, e)
 152         },
 153         clone: function () {
 154             var a = j.clone.call(this);
 155             return a._data = this._data.clone(),
 156                 a
 157         },
 158         _minBufferSize: 0
 159     });
 160     q.Hasher = k.extend({
 161         init: function () {
 162             this.reset()
 163         },
 164         reset: function () {
 165             k.reset.call(this),
 166                 this._doReset()
 167         },
 168         update: function (a) {
 169             return this._append(a),
 170                 this._process(),
 171                 this
 172         },
 173         finalize: function (a) {
 174             return a && this._append(a),
 175                 this._doFinalize(),
 176                 this._hash
 177         },
 178         clone: function () {
 179             var a = k.clone.call(this);
 180             return a._hash = this._hash.clone(),
 181                 a
 182         },
 183         blockSize: 16,
 184         _createHelper: function (a) {
 185             return function (e, c) {
 186                 return a.create(c).finalize(e)
 187             }
 188         },
 189         _createHmacHelper: function (a) {
 190             return function (e, c) {
 191                 return d.HMAC.create(a, c).finalize(e)
 192             }
 193         }
 194     });
 195     var d = m.algo = {};
 196     return m
 197 }(Math)
 198     , CryptoJS = CryptoJS || function (g, w) {
 199     var m = {}
 200         , q = m.lib = {}
 201         , j = q.Base = function () {
 202         function a() {
 203         }
 204 
 205         return {
 206             extend: function (e) {
 207                 a.prototype = this;
 208                 var c = new a;
 209                 return e && c.mixIn(e),
 210                     c.$super = this,
 211                     c
 212             },
 213             create: function () {
 214                 var c = this.extend();
 215                 return c.init.apply(c, arguments),
 216                     c
 217             },
 218             init: function () {
 219             },
 220             mixIn: function (c) {
 221                 for (var f in c) {
 222                     c.hasOwnProperty(f) && (this[f] = c[f])
 223                 }
 224                 c.hasOwnProperty("toString") && (this.toString = c.toString)
 225             },
 226             clone: function () {
 227                 return this.$super.extend(this)
 228             }
 229         }
 230     }()
 231         , v = q.WordArray = j.extend({
 232         init: function (a, c) {
 233             a = this.words = a || [],
 234                 this.sigBytes = c != w ? c : 4 * a.length
 235         },
 236         toString: function (a) {
 237             return (a || x).stringify(this)
 238         },
 239         concat: function (a) {
 240             var o = this.words
 241                 , f = a.words
 242                 , l = this.sigBytes
 243                 , a = a.sigBytes;
 244             this.clamp();
 245             if (l % 4) {
 246                 for (var c = 0; c < a; c++) {
 247                     o[l + c >>> 2] |= (f[c >>> 2] >>> 24 - 8 * (c % 4) & 255) << 24 - 8 * ((l + c) % 4)
 248                 }
 249             } else {
 250                 if (65535 < f.length) {
 251                     for (c = 0; c < a; c += 4) {
 252                         o[l + c >>> 2] = f[c >>> 2]
 253                     }
 254                 } else {
 255                     o.push.apply(o, f)
 256                 }
 257             }
 258             return this.sigBytes += a,
 259                 this
 260         },
 261         clamp: function () {
 262             var c = this.words
 263                 , a = this.sigBytes;
 264             c[a >>> 2] &= 4294967295 << 32 - 8 * (a % 4),
 265                 c.length = g.ceil(a / 4)
 266         },
 267         clone: function () {
 268             var a = j.clone.call(this);
 269             return a.words = this.words.slice(0),
 270                 a
 271         },
 272         random: function (e) {
 273             for (var a = [], c = 0; c < e; c += 4) {
 274                 a.push(4294967296 * g.random() | 0)
 275             }
 276             return v.create(a, e)
 277         }
 278     })
 279         , p = m.enc = {}
 280         , x = p.Hex = {
 281         stringify: function (a) {
 282             for (var o = a.words, a = a.sigBytes, f = [], l = 0; l < a; l++) {
 283                 var c = o[l >>> 2] >>> 24 - 8 * (l % 4) & 255;
 284                 f.push((c >>> 4).toString(16)),
 285                     f.push((c & 15).toString(16))
 286             }
 287             return f.join("")
 288         },
 289         parse: function (a) {
 290             for (var i = a.length, c = [], f = 0; f < i; f += 2) {
 291                 c[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f % 8)
 292             }
 293             return v.create(c, i / 2)
 294         }
 295     }
 296         , b = p.Latin1 = {
 297         stringify: function (a) {
 298             for (var i = a.words, a = a.sigBytes, c = [], f = 0; f < a; f++) {
 299                 c.push(String.fromCharCode(i[f >>> 2] >>> 24 - 8 * (f % 4) & 255))
 300             }
 301             return c.join("")
 302         },
 303         parse: function (a) {
 304             for (var i = a.length, c = [], f = 0; f < i; f++) {
 305                 c[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4)
 306             }
 307             return v.create(c, i)
 308         }
 309     }
 310         , h = p.Utf8 = {
 311         stringify: function (a) {
 312             try {
 313                 return decodeURIComponent(escape(b.stringify(a)))
 314             } catch (c) {
 315                 throw Error("Malformed UTF-8 data")
 316             }
 317         },
 318         parse: function (a) {
 319             return b.parse(unescape(encodeURIComponent(a)))
 320         }
 321     }
 322         , k = q.BufferedBlockAlgorithm = j.extend({
 323         reset: function () {
 324             this._data = v.create(),
 325                 this._nDataBytes = 0
 326         },
 327         _append: function (a) {
 328             "string" == typeof a && (a = h.parse(a)),
 329                 this._data.concat(a),
 330                 this._nDataBytes += a.sigBytes
 331         },
 332         _process: function (y) {
 333             var f = this._data
 334                 , s = f.words
 335                 , e = f.sigBytes
 336                 , l = this.blockSize
 337                 , z = e / (4 * l)
 338                 , z = y ? g.ceil(z) : g.max((z | 0) - this._minBufferSize, 0)
 339                 , y = z * l
 340                 , e = g.min(4 * y, e);
 341             if (y) {
 342                 for (var c = 0; c < y; c += l) {
 343                     this._doProcessBlock(s, c)
 344                 }
 345                 c = s.splice(0, y),
 346                     f.sigBytes -= e
 347             }
 348             return v.create(c, e)
 349         },
 350         clone: function () {
 351             var a = j.clone.call(this);
 352             return a._data = this._data.clone(),
 353                 a
 354         },
 355         _minBufferSize: 0
 356     });
 357     q.Hasher = k.extend({
 358         init: function () {
 359             this.reset()
 360         },
 361         reset: function () {
 362             k.reset.call(this),
 363                 this._doReset()
 364         },
 365         update: function (a) {
 366             return this._append(a),
 367                 this._process(),
 368                 this
 369         },
 370         finalize: function (a) {
 371             return a && this._append(a),
 372                 this._doFinalize(),
 373                 this._hash
 374         },
 375         clone: function () {
 376             var a = k.clone.call(this);
 377             return a._hash = this._hash.clone(),
 378                 a
 379         },
 380         blockSize: 16,
 381         _createHelper: function (a) {
 382             return function (e, c) {
 383                 return a.create(c).finalize(e)
 384             }
 385         },
 386         _createHmacHelper: function (a) {
 387             return function (e, c) {
 388                 return d.HMAC.create(a, c).finalize(e)
 389             }
 390         }
 391     });
 392     var d = m.algo = {};
 393     return m
 394 }(Math);
 395 (function () {
 396         var a = CryptoJS
 397             , b = a.lib.WordArray;
 398         a.enc.Base64 = {
 399             stringify: function (c) {
 400                 var k = c.words
 401                     , f = c.sigBytes
 402                     , h = this._map;
 403                 c.clamp();
 404                 for (var c = [], d = 0; d < f; d += 3) {
 405                     for (var j = (k[d >>> 2] >>> 24 - 8 * (d % 4) & 255) << 16 | (k[d + 1 >>> 2] >>> 24 - 8 * ((d + 1) % 4) & 255) << 8 | k[d + 2 >>> 2] >>> 24 - 8 * ((d + 2) % 4) & 255, g = 0; 4 > g && d + 0.75 * g < f; g++) {
 406                         c.push(h.charAt(j >>> 6 * (3 - g) & 63))
 407                     }
 408                 }
 409                 if (k = h.charAt(64)) {
 410                     for (; c.length % 4;) {
 411                         c.push(k)
 412                     }
 413                 }
 414                 return c.join("")
 415             },
 416             parse: function (d) {
 417                 var d = d.replace(/\s/g, "")
 418                     , h = d.length
 419                     , j = this._map
 420                     , k = j.charAt(64);
 421                 k && (k = d.indexOf(k),
 422                 -1 != k && (h = k));
 423                 for (var k = [], i = 0, l = 0; l < h; l++) {
 424                     if (l % 4) {
 425                         var c = j.indexOf(d.charAt(l - 1)) << 2 * (l % 4)
 426                             , g = j.indexOf(d.charAt(l)) >>> 6 - 2 * (l % 4);
 427                         k[i >>> 2] |= (c | g) << 24 - 8 * (i % 4),
 428                             i++
 429                     }
 430                 }
 431                 return b.create(k, i)
 432             },
 433             _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
 434         }
 435     }
 436 )(),
 437     function (c) {
 438         function m(a, x, q, v, f, w, u) {
 439             return a = a + (x & q | ~x & v) + f + u,
 440             (a << w | a >>> 32 - w) + x
 441         }
 442 
 443         function h(a, x, q, v, f, w, u) {
 444             return a = a + (x & v | q & ~v) + f + u,
 445             (a << w | a >>> 32 - w) + x
 446         }
 447 
 448         function k(a, x, q, v, f, w, u) {
 449             return a = a + (x ^ q ^ v) + f + u,
 450             (a << w | a >>> 32 - w) + x
 451         }
 452 
 453         function g(a, x, q, v, f, w, u) {
 454             return a = a + (q ^ (x | ~v)) + f + u,
 455             (a << w | a >>> 32 - w) + x
 456         }
 457 
 458         var l = CryptoJS
 459             , j = l.lib
 460             , p = j.WordArray
 461             , j = j.Hasher
 462             , b = l.algo
 463             , d = [];
 464         (function () {
 465                 for (var a = 0; 64 > a; a++) {
 466                     d[a] = 4294967296 * c.abs(c.sin(a + 1)) | 0
 467                 }
 468             }
 469         )(),
 470             b = b.MD5 = j.extend({
 471                 _doReset: function () {
 472                     this._hash = p.create([1732584193, 4023233417, 2562383102, 271733878])
 473                 },
 474                 _doProcessBlock: function (q, v) {
 475                     for (var t = 0; 16 > t; t++) {
 476                         var w = v + t
 477                             , f = q[w];
 478                         q[w] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360
 479                     }
 480                     for (var w = this._hash.words, f = w[0], r = w[1], i = w[2], n = w[3], t = 0; 64 > t; t += 4) {
 481                         16 > t ? (f = m(f, r, i, n, q[v + t], 7, d[t]),
 482                             n = m(n, f, r, i, q[v + t + 1], 12, d[t + 1]),
 483                             i = m(i, n, f, r, q[v + t + 2], 17, d[t + 2]),
 484                             r = m(r, i, n, f, q[v + t + 3], 22, d[t + 3])) : 32 > t ? (f = h(f, r, i, n, q[v + (t + 1) % 16], 5, d[t]),
 485                             n = h(n, f, r, i, q[v + (t + 6) % 16], 9, d[t + 1]),
 486                             i = h(i, n, f, r, q[v + (t + 11) % 16], 14, d[t + 2]),
 487                             r = h(r, i, n, f, q[v + t % 16], 20, d[t + 3])) : 48 > t ? (f = k(f, r, i, n, q[v + (3 * t + 5) % 16], 4, d[t]),
 488                             n = k(n, f, r, i, q[v + (3 * t + 8) % 16], 11, d[t + 1]),
 489                             i = k(i, n, f, r, q[v + (3 * t + 11) % 16], 16, d[t + 2]),
 490                             r = k(r, i, n, f, q[v + (3 * t + 14) % 16], 23, d[t + 3])) : (f = g(f, r, i, n, q[v + 3 * t % 16], 6, d[t]),
 491                             n = g(n, f, r, i, q[v + (3 * t + 7) % 16], 10, d[t + 1]),
 492                             i = g(i, n, f, r, q[v + (3 * t + 14) % 16], 15, d[t + 2]),
 493                             r = g(r, i, n, f, q[v + (3 * t + 5) % 16], 21, d[t + 3]))
 494                     }
 495                     w[0] = w[0] + f | 0,
 496                         w[1] = w[1] + r | 0,
 497                         w[2] = w[2] + i | 0,
 498                         w[3] = w[3] + n | 0
 499                 },
 500                 _doFinalize: function () {
 501                     var a = this._data
 502                         , o = a.words
 503                         , f = 8 * this._nDataBytes
 504                         , i = 8 * a.sigBytes;
 505                     o[i >>> 5] |= 128 << 24 - i % 32,
 506                         o[(i + 64 >>> 9 << 4) + 14] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360,
 507                         a.sigBytes = 4 * (o.length + 1),
 508                         this._process(),
 509                         a = this._hash.words;
 510                     for (o = 0; 4 > o; o++) {
 511                         f = a[o],
 512                             a[o] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360
 513                     }
 514                 }
 515             }),
 516             l.MD5 = j._createHelper(b),
 517             l.HmacMD5 = j._createHmacHelper(b)
 518     }(Math),
 519     function () {
 520         var a = CryptoJS
 521             , f = a.lib
 522             , c = f.Base
 523             , d = f.WordArray
 524             , f = a.algo
 525             , b = f.EvpKDF = c.extend({
 526             cfg: c.extend({
 527                 keySize: 4,
 528                 hasher: f.MD5,
 529                 iterations: 1
 530             }),
 531             init: function (g) {
 532                 this.cfg = this.cfg.extend(g)
 533             },
 534             compute: function (h, q) {
 535                 for (var l = this.cfg, k = l.hasher.create(), p = d.create(), m = p.words, r = l.keySize, l = l.iterations; m.length < r;) {
 536                     g && k.update(g);
 537                     var g = k.update(h).finalize(q);
 538                     k.reset();
 539                     for (var j = 1; j < l; j++) {
 540                         g = k.finalize(g),
 541                             k.reset()
 542                     }
 543                     p.concat(g)
 544                 }
 545                 return p.sigBytes = 4 * r,
 546                     p
 547             }
 548         });
 549         a.EvpKDF = function (g, i, h) {
 550             return b.create(h).compute(g, i)
 551         }
 552     }(),
 553 CryptoJS.lib.Cipher || function (k) {
 554     var C = CryptoJS
 555         , x = C.lib
 556         , A = x.Base
 557         , v = x.WordArray
 558         , B = x.BufferedBlockAlgorithm
 559         , y = C.enc.Base64
 560         , D = C.algo.EvpKDF
 561         , b = x.Cipher = B.extend({
 562         cfg: A.extend(),
 563         createEncryptor: function (a, c) {
 564             return this.create(this._ENC_XFORM_MODE, a, c)
 565         },
 566         createDecryptor: function (a, c) {
 567             return this.create(this._DEC_XFORM_MODE, a, c)
 568         },
 569         init: function (a, d, c) {
 570             this.cfg = this.cfg.extend(c),
 571                 this._xformMode = a,
 572                 this._key = d,
 573                 this.reset()
 574         },
 575         reset: function () {
 576             B.reset.call(this),
 577                 this._doReset()
 578         },
 579         process: function (a) {
 580             return this._append(a),
 581                 this._process()
 582         },
 583         finalize: function (a) {
 584             return a && this._append(a),
 585                 this._doFinalize()
 586         },
 587         keySize: 4,
 588         ivSize: 4,
 589         _ENC_XFORM_MODE: 1,
 590         _DEC_XFORM_MODE: 2,
 591         _createHelper: function () {
 592             return function (a) {
 593                 return {
 594                     encrypt: function (e, c, d) {
 595                         return ("string" == typeof c ? j : z).encrypt(a, e, c, d)
 596                     },
 597                     decrypt: function (e, c, d) {
 598                         return ("string" == typeof c ? j : z).decrypt(a, e, c, d)
 599                     }
 600                 }
 601             }
 602         }()
 603     });
 604     x.StreamCipher = b.extend({
 605         _doFinalize: function () {
 606             return this._process(!0)
 607         },
 608         blockSize: 1
 609     });
 610     var m = C.mode = {}
 611         , w = x.BlockCipherMode = A.extend({
 612         createEncryptor: function (a, c) {
 613             return this.Encryptor.create(a, c)
 614         },
 615         createDecryptor: function (a, c) {
 616             return this.Decryptor.create(a, c)
 617         },
 618         init: function (a, c) {
 619             this._cipher = a,
 620                 this._iv = c
 621         }
 622     })
 623         , m = m.CBC = function () {
 624         function c(l, e, f) {
 625             var d = this._iv;
 626             d ? this._iv = k : d = this._prevBlock;
 627             for (var h = 0; h < f; h++) {
 628                 l[e + h] ^= d[h]
 629             }
 630         }
 631 
 632         var a = w.extend();
 633         return a.Encryptor = a.extend({
 634             processBlock: function (d, h) {
 635                 var l = this._cipher
 636                     , f = l.blockSize;
 637                 c.call(this, d, h, f),
 638                     l.encryptBlock(d, h),
 639                     this._prevBlock = d.slice(h, h + f)
 640             }
 641         }),
 642             a.Decryptor = a.extend({
 643                 processBlock: function (d, h) {
 644                     var l = this._cipher
 645                         , f = l.blockSize
 646                         , o = d.slice(h, h + f);
 647                     l.decryptBlock(d, h),
 648                         c.call(this, d, h, f),
 649                         this._prevBlock = o
 650                 }
 651             }),
 652             a
 653     }()
 654         , g = (C.pad = {}).Pkcs7 = {
 655         pad: function (a, i) {
 656             for (var c = 4 * i, c = c - a.sigBytes % c, f = c << 24 | c << 16 | c << 8 | c, h = [], d = 0; d < c; d += 4) {
 657                 h.push(f)
 658             }
 659             c = v.create(h, c),
 660                 a.concat(c)
 661         },
 662         unpad: function (a) {
 663             a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255
 664         }
 665     };
 666     x.BlockCipher = b.extend({
 667         cfg: b.cfg.extend({
 668             mode: m,
 669             padding: g
 670         }),
 671         reset: function () {
 672             b.reset.call(this);
 673             var a = this.cfg
 674                 , d = a.iv
 675                 , a = a.mode;
 676             if (this._xformMode == this._ENC_XFORM_MODE) {
 677                 var c = a.createEncryptor
 678             } else {
 679                 c = a.createDecryptor,
 680                     this._minBufferSize = 1
 681             }
 682             this._mode = c.call(a, this, d && d.words)
 683         },
 684         _doProcessBlock: function (a, c) {
 685             this._mode.processBlock(a, c)
 686         },
 687         _doFinalize: function () {
 688             var a = this.cfg.padding;
 689             if (this._xformMode == this._ENC_XFORM_MODE) {
 690                 a.pad(this._data, this.blockSize);
 691                 var c = this._process(!0)
 692             } else {
 693                 c = this._process(!0),
 694                     a.unpad(c)
 695             }
 696             return c
 697         },
 698         blockSize: 4
 699     });
 700     var q = x.CipherParams = A.extend({
 701         init: function (a) {
 702             this.mixIn(a)
 703         },
 704         toString: function (a) {
 705             return (a || this.formatter).stringify(this)
 706         }
 707     })
 708         , m = (C.format = {}).OpenSSL = {
 709         stringify: function (a) {
 710             var c = a.ciphertext
 711                 , a = a.salt
 712                 , c = (a ? v.create([1398893684, 1701076831]).concat(a).concat(c) : c).toString(y);
 713             return c = c.replace(/(.{64})/g, "$1\n")
 714         },
 715         parse: function (a) {
 716             var a = y.parse(a)
 717                 , d = a.words;
 718             if (1398893684 == d[0] && 1701076831 == d[1]) {
 719                 var c = v.create(d.slice(2, 4));
 720                 d.splice(0, 4),
 721                     a.sigBytes -= 16
 722             }
 723             return q.create({
 724                 ciphertext: a,
 725                 salt: c
 726             })
 727         }
 728     }
 729         , z = x.SerializableCipher = A.extend({
 730         cfg: A.extend({
 731             format: m
 732         }),
 733         encrypt: function (a, h, d, f) {
 734             var f = this.cfg.extend(f)
 735                 , c = a.createEncryptor(d, f)
 736                 , h = c.finalize(h)
 737                 , c = c.cfg;
 738             return q.create({
 739                 ciphertext: h,
 740                 key: d,
 741                 iv: c.iv,
 742                 algorithm: a,
 743                 mode: c.mode,
 744                 padding: c.padding,
 745                 blockSize: a.blockSize,
 746                 formatter: f.format
 747             })
 748         },
 749         decrypt: function (a, f, c, d) {
 750             return d = this.cfg.extend(d),
 751                 f = this._parse(f, d.format),
 752                 a.createDecryptor(c, d).finalize(f.ciphertext)
 753         },
 754         _parse: function (a, c) {
 755             return "string" == typeof a ? c.parse(a) : a
 756         }
 757     })
 758         , C = (C.kdf = {}).OpenSSL = {
 759         compute: function (a, f, c, d) {
 760             return d || (d = v.random(8)),
 761                 a = D.create({
 762                     keySize: f + c
 763                 }).compute(a, d),
 764                 c = v.create(a.words.slice(f), 4 * c),
 765                 a.sigBytes = 4 * f,
 766                 q.create({
 767                     key: a,
 768                     iv: c,
 769                     salt: d
 770                 })
 771         }
 772     }
 773         , j = x.PasswordBasedCipher = z.extend({
 774         cfg: z.cfg.extend({
 775             kdf: C
 776         }),
 777         encrypt: function (a, f, c, d) {
 778             return d = this.cfg.extend(d),
 779                 c = d.kdf.compute(c, a.keySize, a.ivSize),
 780                 d.iv = c.iv,
 781                 a = z.encrypt.call(this, a, f, c.key, d),
 782                 a.mixIn(c),
 783                 a
 784         },
 785         decrypt: function (a, f, c, d) {
 786             return d = this.cfg.extend(d),
 787                 f = this._parse(f, d.format),
 788                 c = d.kdf.compute(c, a.keySize, a.ivSize, f.salt),
 789                 d.iv = c.iv,
 790                 z.decrypt.call(this, a, f, c.key, d)
 791         }
 792     })
 793 }(),
 794     function () {
 795         function g(a, f) {
 796             var c = (this._lBlock >>> a ^ this._rBlock) & f;
 797             this._rBlock ^= c,
 798                 this._lBlock ^= c << a
 799         }
 800 
 801         function w(a, f) {
 802             var c = (this._rBlock >>> a ^ this._lBlock) & f;
 803             this._lBlock ^= c,
 804                 this._rBlock ^= c << a
 805         }
 806 
 807         var m = CryptoJS
 808             , q = m.lib
 809             , j = q.WordArray
 810             , q = q.BlockCipher
 811             , v = m.algo
 812             ,
 813             p = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4]
 814             ,
 815             x = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32]
 816             , b = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]
 817             , h = [{
 818                 0: 8421888,
 819                 268435456: 32768,
 820                 536870912: 8421378,
 821                 805306368: 2,
 822                 1073741824: 512,
 823                 1342177280: 8421890,
 824                 1610612736: 8389122,
 825                 1879048192: 8388608,
 826                 2147483648: 514,
 827                 2415919104: 8389120,
 828                 2684354560: 33280,
 829                 2952790016: 8421376,
 830                 3221225472: 32770,
 831                 3489660928: 8388610,
 832                 3758096384: 0,
 833                 4026531840: 33282,
 834                 134217728: 0,
 835                 402653184: 8421890,
 836                 671088640: 33282,
 837                 939524096: 32768,
 838                 1207959552: 8421888,
 839                 1476395008: 512,
 840                 1744830464: 8421378,
 841                 2013265920: 2,
 842                 2281701376: 8389120,
 843                 2550136832: 33280,
 844                 2818572288: 8421376,
 845                 3087007744: 8389122,
 846                 3355443200: 8388610,
 847                 3623878656: 32770,
 848                 3892314112: 514,
 849                 4160749568: 8388608,
 850                 1: 32768,
 851                 268435457: 2,
 852                 536870913: 8421888,
 853                 805306369: 8388608,
 854                 1073741825: 8421378,
 855                 1342177281: 33280,
 856                 1610612737: 512,
 857                 1879048193: 8389122,
 858                 2147483649: 8421890,
 859                 2415919105: 8421376,
 860                 2684354561: 8388610,
 861                 2952790017: 33282,
 862                 3221225473: 514,
 863                 3489660929: 8389120,
 864                 3758096385: 32770,
 865                 4026531841: 0,
 866                 134217729: 8421890,
 867                 402653185: 8421376,
 868                 671088641: 8388608,
 869                 939524097: 512,
 870                 1207959553: 32768,
 871                 1476395009: 8388610,
 872                 1744830465: 2,
 873                 2013265921: 33282,
 874                 2281701377: 32770,
 875                 2550136833: 8389122,
 876                 2818572289: 514,
 877                 3087007745: 8421888,
 878                 3355443201: 8389120,
 879                 3623878657: 0,
 880                 3892314113: 33280,
 881                 4160749569: 8421378
 882             }, {
 883                 0: 1074282512,
 884                 16777216: 16384,
 885                 33554432: 524288,
 886                 50331648: 1074266128,
 887                 67108864: 1073741840,
 888                 83886080: 1074282496,
 889                 100663296: 1073758208,
 890                 117440512: 16,
 891                 134217728: 540672,
 892                 150994944: 1073758224,
 893                 167772160: 1073741824,
 894                 184549376: 540688,
 895                 201326592: 524304,
 896                 218103808: 0,
 897                 234881024: 16400,
 898                 251658240: 1074266112,
 899                 8388608: 1073758208,
 900                 25165824: 540688,
 901                 41943040: 16,
 902                 58720256: 1073758224,
 903                 75497472: 1074282512,
 904                 92274688: 1073741824,
 905                 109051904: 524288,
 906                 125829120: 1074266128,
 907                 142606336: 524304,
 908                 159383552: 0,
 909                 176160768: 16384,
 910                 192937984: 1074266112,
 911                 209715200: 1073741840,
 912                 226492416: 540672,
 913                 243269632: 1074282496,
 914                 260046848: 16400,
 915                 268435456: 0,
 916                 285212672: 1074266128,
 917                 301989888: 1073758224,
 918                 318767104: 1074282496,
 919                 335544320: 1074266112,
 920                 352321536: 16,
 921                 369098752: 540688,
 922                 385875968: 16384,
 923                 402653184: 16400,
 924                 419430400: 524288,
 925                 436207616: 524304,
 926                 452984832: 1073741840,
 927                 469762048: 540672,
 928                 486539264: 1073758208,
 929                 503316480: 1073741824,
 930                 520093696: 1074282512,
 931                 276824064: 540688,
 932                 293601280: 524288,
 933                 310378496: 1074266112,
 934                 327155712: 16384,
 935                 343932928: 1073758208,
 936                 360710144: 1074282512,
 937                 377487360: 16,
 938                 394264576: 1073741824,
 939                 411041792: 1074282496,
 940                 427819008: 1073741840,
 941                 444596224: 1073758224,
 942                 461373440: 524304,
 943                 478150656: 0,
 944                 494927872: 16400,
 945                 511705088: 1074266128,
 946                 528482304: 540672
 947             }, {
 948                 0: 260,
 949                 1048576: 0,
 950                 2097152: 67109120,
 951                 3145728: 65796,
 952                 4194304: 65540,
 953                 5242880: 67108868,
 954                 6291456: 67174660,
 955                 7340032: 67174400,
 956                 8388608: 67108864,
 957                 9437184: 67174656,
 958                 10485760: 65792,
 959                 11534336: 67174404,
 960                 12582912: 67109124,
 961                 13631488: 65536,
 962                 14680064: 4,
 963                 15728640: 256,
 964                 524288: 67174656,
 965                 1572864: 67174404,
 966                 2621440: 0,
 967                 3670016: 67109120,
 968                 4718592: 67108868,
 969                 5767168: 65536,
 970                 6815744: 65540,
 971                 7864320: 260,
 972                 8912896: 4,
 973                 9961472: 256,
 974                 11010048: 67174400,
 975                 12058624: 65796,
 976                 13107200: 65792,
 977                 14155776: 67109124,
 978                 15204352: 67174660,
 979                 16252928: 67108864,
 980                 16777216: 67174656,
 981                 17825792: 65540,
 982                 18874368: 65536,
 983                 19922944: 67109120,
 984                 20971520: 256,
 985                 22020096: 67174660,
 986                 23068672: 67108868,
 987                 24117248: 0,
 988                 25165824: 67109124,
 989                 26214400: 67108864,
 990                 27262976: 4,
 991                 28311552: 65792,
 992                 29360128: 67174400,
 993                 30408704: 260,
 994                 31457280: 65796,
 995                 32505856: 67174404,
 996                 17301504: 67108864,
 997                 18350080: 260,
 998                 19398656: 67174656,
 999                 20447232: 0,
1000                 21495808: 65540,
1001                 22544384: 67109120,
1002                 23592960: 256,
1003                 24641536: 67174404,
1004                 25690112: 65536,
1005                 26738688: 67174660,
1006                 27787264: 65796,
1007                 28835840: 67108868,
1008                 29884416: 67109124,
1009                 30932992: 67174400,
1010                 31981568: 4,
1011                 33030144: 65792
1012             }, {
1013                 0: 2151682048,
1014                 65536: 2147487808,
1015                 131072: 4198464,
1016                 196608: 2151677952,
1017                 262144: 0,
1018                 327680: 4198400,
1019                 393216: 2147483712,
1020                 458752: 4194368,
1021                 524288: 2147483648,
1022                 589824: 4194304,
1023                 655360: 64,
1024                 720896: 2147487744,
1025                 786432: 2151678016,
1026                 851968: 4160,
1027                 917504: 4096,
1028                 983040: 2151682112,
1029                 32768: 2147487808,
1030                 98304: 64,
1031                 163840: 2151678016,
1032                 229376: 2147487744,
1033                 294912: 4198400,
1034                 360448: 2151682112,
1035                 425984: 0,
1036                 491520: 2151677952,
1037                 557056: 4096,
1038                 622592: 2151682048,
1039                 688128: 4194304,
1040                 753664: 4160,
1041                 819200: 2147483648,
1042                 884736: 4194368,
1043                 950272: 4198464,
1044                 1015808: 2147483712,
1045                 1048576: 4194368,
1046                 1114112: 4198400,
1047                 1179648: 2147483712,
1048                 1245184: 0,
1049                 1310720: 4160,
1050                 1376256: 2151678016,
1051                 1441792: 2151682048,
1052                 1507328: 2147487808,
1053                 1572864: 2151682112,
1054                 1638400: 2147483648,
1055                 1703936: 2151677952,
1056                 1769472: 4198464,
1057                 1835008: 2147487744,
1058                 1900544: 4194304,
1059                 1966080: 64,
1060                 2031616: 4096,
1061                 1081344: 2151677952,
1062                 1146880: 2151682112,
1063                 1212416: 0,
1064                 1277952: 4198400,
1065                 1343488: 4194368,
1066                 1409024: 2147483648,
1067                 1474560: 2147487808,
1068                 1540096: 64,
1069                 1605632: 2147483712,
1070                 1671168: 4096,
1071                 1736704: 2147487744,
1072                 1802240: 2151678016,
1073                 1867776: 4160,
1074                 1933312: 2151682048,
1075                 1998848: 4194304,
1076                 2064384: 4198464
1077             }, {
1078                 0: 128,
1079                 4096: 17039360,
1080                 8192: 262144,
1081                 12288: 536870912,
1082                 16384: 537133184,
1083                 20480: 16777344,
1084                 24576: 553648256,
1085                 28672: 262272,
1086                 32768: 16777216,
1087                 36864: 537133056,
1088                 40960: 536871040,
1089                 45056: 553910400,
1090                 49152: 553910272,
1091                 53248: 0,
1092                 57344: 17039488,
1093                 61440: 553648128,
1094                 2048: 17039488,
1095                 6144: 553648256,
1096                 10240: 128,
1097                 14336: 17039360,
1098                 18432: 262144,
1099                 22528: 537133184,
1100                 26624: 553910272,
1101                 30720: 536870912,
1102                 34816: 537133056,
1103                 38912: 0,
1104                 43008: 553910400,
1105                 47104: 16777344,
1106                 51200: 536871040,
1107                 55296: 553648128,
1108                 59392: 16777216,
1109                 63488: 262272,
1110                 65536: 262144,
1111                 69632: 128,
1112                 73728: 536870912,
1113                 77824: 553648256,
1114                 81920: 16777344,
1115                 86016: 553910272,
1116                 90112: 537133184,
1117                 94208: 16777216,
1118                 98304: 553910400,
1119                 102400: 553648128,
1120                 106496: 17039360,
1121                 110592: 537133056,
1122                 114688: 262272,
1123                 118784: 536871040,
1124                 122880: 0,
1125                 126976: 17039488,
1126                 67584: 553648256,
1127                 71680: 16777216,
1128                 75776: 17039360,
1129                 79872: 537133184,
1130                 83968: 536870912,
1131                 88064: 17039488,
1132                 92160: 128,
1133                 96256: 553910272,
1134                 100352: 262272,
1135                 104448: 553910400,
1136                 108544: 0,
1137                 112640: 553648128,
1138                 116736: 16777344,
1139                 120832: 262144,
1140                 124928: 537133056,
1141                 129024: 536871040
1142             }, {
1143                 0: 268435464,
1144                 256: 8192,
1145                 512: 270532608,
1146                 768: 270540808,
1147                 1024: 268443648,
1148                 1280: 2097152,
1149                 1536: 2097160,
1150                 1792: 268435456,
1151                 2048: 0,
1152                 2304: 268443656,
1153                 2560: 2105344,
1154                 2816: 8,
1155                 3072: 270532616,
1156                 3328: 2105352,
1157                 3584: 8200,
1158                 3840: 270540800,
1159                 128: 270532608,
1160                 384: 270540808,
1161                 640: 8,
1162                 896: 2097152,
1163                 1152: 2105352,
1164                 1408: 268435464,
1165                 1664: 268443648,
1166                 1920: 8200,
1167                 2176: 2097160,
1168                 2432: 8192,
1169                 2688: 268443656,
1170                 2944: 270532616,
1171                 3200: 0,
1172                 3456: 270540800,
1173                 3712: 2105344,
1174                 3968: 268435456,
1175                 4096: 268443648,
1176                 4352: 270532616,
1177                 4608: 270540808,
1178                 4864: 8200,
1179                 5120: 2097152,
1180                 5376: 268435456,
1181                 5632: 268435464,
1182                 5888: 2105344,
1183                 6144: 2105352,
1184                 6400: 0,
1185                 6656: 8,
1186                 6912: 270532608,
1187                 7168: 8192,
1188                 7424: 268443656,
1189                 7680: 270540800,
1190                 7936: 2097160,
1191                 4224: 8,
1192                 4480: 2105344,
1193                 4736: 2097152,
1194                 4992: 268435464,
1195                 5248: 268443648,
1196                 5504: 8200,
1197                 5760: 270540808,
1198                 6016: 270532608,
1199                 6272: 270540800,
1200                 6528: 270532616,
1201                 6784: 8192,
1202                 7040: 2105352,
1203                 7296: 2097160,
1204                 7552: 0,
1205                 7808: 268435456,
1206                 8064: 268443656
1207             }, {
1208                 0: 1048576,
1209                 16: 33555457,
1210                 32: 1024,
1211                 48: 1049601,
1212                 64: 34604033,
1213                 80: 0,
1214                 96: 1,
1215                 112: 34603009,
1216                 128: 33555456,
1217                 144: 1048577,
1218                 160: 33554433,
1219                 176: 34604032,
1220                 192: 34603008,
1221                 208: 1025,
1222                 224: 1049600,
1223                 240: 33554432,
1224                 8: 34603009,
1225                 24: 0,
1226                 40: 33555457,
1227                 56: 34604032,
1228                 72: 1048576,
1229                 88: 33554433,
1230                 104: 33554432,
1231                 120: 1025,
1232                 136: 1049601,
1233                 152: 33555456,
1234                 168: 34603008,
1235                 184: 1048577,
1236                 200: 1024,
1237                 216: 34604033,
1238                 232: 1,
1239                 248: 1049600,
1240                 256: 33554432,
1241                 272: 1048576,
1242                 288: 33555457,
1243                 304: 34603009,
1244                 320: 1048577,
1245                 336: 33555456,
1246                 352: 34604032,
1247                 368: 1049601,
1248                 384: 1025,
1249                 400: 34604033,
1250                 416: 1049600,
1251                 432: 1,
1252                 448: 0,
1253                 464: 34603008,
1254                 480: 33554433,
1255                 496: 1024,
1256                 264: 1049600,
1257                 280: 33555457,
1258                 296: 34603009,
1259                 312: 1,
1260                 328: 33554432,
1261                 344: 1048576,
1262                 360: 1025,
1263                 376: 34604032,
1264                 392: 33554433,
1265                 408: 34603008,
1266                 424: 0,
1267                 440: 34604033,
1268                 456: 1049601,
1269                 472: 1024,
1270                 488: 33555456,
1271                 504: 1048577
1272             }, {
1273                 0: 134219808,
1274                 1: 131072,
1275                 2: 134217728,
1276                 3: 32,
1277                 4: 131104,
1278                 5: 134350880,
1279                 6: 134350848,
1280                 7: 2048,
1281                 8: 134348800,
1282                 9: 134219776,
1283                 10: 133120,
1284                 11: 134348832,
1285                 12: 2080,
1286                 13: 0,
1287                 14: 134217760,
1288                 15: 133152,
1289                 2147483648: 2048,
1290                 2147483649: 134350880,
1291                 2147483650: 134219808,
1292                 2147483651: 134217728,
1293                 2147483652: 134348800,
1294                 2147483653: 133120,
1295                 2147483654: 133152,
1296                 2147483655: 32,
1297                 2147483656: 134217760,
1298                 2147483657: 2080,
1299                 2147483658: 131104,
1300                 2147483659: 134350848,
1301                 2147483660: 0,
1302                 2147483661: 134348832,
1303                 2147483662: 134219776,
1304                 2147483663: 131072,
1305                 16: 133152,
1306                 17: 134350848,
1307                 18: 32,
1308                 19: 2048,
1309                 20: 134219776,
1310                 21: 134217760,
1311                 22: 134348832,
1312                 23: 131072,
1313                 24: 0,
1314                 25: 131104,
1315                 26: 134348800,
1316                 27: 134219808,
1317                 28: 134350880,
1318                 29: 133120,
1319                 30: 2080,
1320                 31: 134217728,
1321                 2147483664: 131072,
1322                 2147483665: 2048,
1323                 2147483666: 134348832,
1324                 2147483667: 133152,
1325                 2147483668: 32,
1326                 2147483669: 134348800,
1327                 2147483670: 134217728,
1328                 2147483671: 134219808,
1329                 2147483672: 134350880,
1330                 2147483673: 134217760,
1331                 2147483674: 134219776,
1332                 2147483675: 0,
1333                 2147483676: 133120,
1334                 2147483677: 2080,
1335                 2147483678: 131104,
1336                 2147483679: 134350848
1337             }]
1338             , k = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679]
1339             , d = v.DES = q.extend({
1340                 _doReset: function () {
1341                     for (var a = this._key.words, u = [], f = 0; 56 > f; f++) {
1342                         var l = p[f] - 1;
1343                         u[f] = a[l >>> 5] >>> 31 - l % 32 & 1
1344                     }
1345                     a = this._subKeys = [];
1346                     for (l = 0; 16 > l; l++) {
1347                         for (var c = a[l] = [], o = b[l], f = 0; 24 > f; f++) {
1348                             c[f / 6 | 0] |= u[(x[f] - 1 + o) % 28] << 31 - f % 6,
1349                                 c[4 + (f / 6 | 0)] |= u[28 + (x[f + 24] - 1 + o) % 28] << 31 - f % 6
1350                         }
1351                         c[0] = c[0] << 1 | c[0] >>> 31;
1352                         for (f = 1; 7 > f; f++) {
1353                             c[f] >>>= 4 * (f - 1) + 3
1354                         }
1355                         c[7] = c[7] << 5 | c[7] >>> 27
1356                     }
1357                     u = this._invSubKeys = [];
1358                     for (f = 0; 16 > f; f++) {
1359                         u[f] = a[15 - f]
1360                     }
1361                 },
1362                 encryptBlock: function (a, c) {
1363                     this._doCryptBlock(a, c, this._subKeys)
1364                 },
1365                 decryptBlock: function (a, c) {
1366                     this._doCryptBlock(a, c, this._invSubKeys)
1367                 },
1368                 _doCryptBlock: function (y, A, t) {
1369                     this._lBlock = y[A],
1370                         this._rBlock = y[A + 1],
1371                         g.call(this, 4, 252645135),
1372                         g.call(this, 16, 65535),
1373                         w.call(this, 2, 858993459),
1374                         w.call(this, 8, 16711935),
1375                         g.call(this, 1, 1431655765);
1376                     for (var B = 0; 16 > B; B++) {
1377                         for (var z = t[B], C = this._lBlock, e = this._rBlock, f = 0, l = 0; 8 > l; l++) {
1378                             f |= h[l][((e ^ z[l]) & k[l]) >>> 0]
1379                         }
1380                         this._lBlock = e,
1381                             this._rBlock = C ^ f
1382                     }
1383                     t = this._lBlock,
1384                         this._lBlock = this._rBlock,
1385                         this._rBlock = t,
1386                         g.call(this, 1, 1431655765),
1387                         w.call(this, 8, 16711935),
1388                         w.call(this, 2, 858993459),
1389                         g.call(this, 16, 65535),
1390                         g.call(this, 4, 252645135),
1391                         y[A] = this._lBlock,
1392                         y[A + 1] = this._rBlock
1393                 },
1394                 keySize: 2,
1395                 ivSize: 2,
1396                 blockSize: 2
1397             });
1398         m.DES = q._createHelper(d),
1399             v = v.TripleDES = q.extend({
1400                 _doReset: function () {
1401                     var a = this._key.words;
1402                     this._des1 = d.createEncryptor(j.create(a.slice(0, 2))),
1403                         this._des2 = d.createEncryptor(j.create(a.slice(2, 4))),
1404                         this._des3 = d.createEncryptor(j.create(a.slice(4, 6)))
1405                 },
1406                 encryptBlock: function (a, c) {
1407                     this._des1.encryptBlock(a, c),
1408                         this._des2.decryptBlock(a, c),
1409                         this._des3.encryptBlock(a, c)
1410                 },
1411                 decryptBlock: function (a, c) {
1412                     this._des3.decryptBlock(a, c),
1413                         this._des2.encryptBlock(a, c),
1414                         this._des1.decryptBlock(a, c)
1415                 },
1416                 keySize: 6,
1417                 ivSize: 2,
1418                 blockSize: 2
1419             }),
1420             m.TripleDES = q._createHelper(v)
1421     }();
1422 CryptoJS.mode.ECB = function () {
1423     var a = CryptoJS.lib.BlockCipherMode.extend();
1424     return a.Encryptor = a.extend({
1425         processBlock: function (b, c) {
1426             this._cipher.encryptBlock(b, c)
1427         }
1428     }),
1429     a.Decryptor = a.extend({
1430         processBlock: function (b, c) {
1431             this._cipher.decryptBlock(b, c)
1432         }
1433     }),
1434     a
1435 }();

View Code

得到了加密代码之后,我们只需要使用 execjs 进行编译和调用就可以了,使用方法可以参考上一篇博客。

三、模拟登录

通过前面的步骤,我们已经能够得到登录所需要的参数了,编写好加密方法之后,可以使用 Postman 进行测试,下面是用 Postman 进行登录的 POST 请求的响应结果:

Uj2yM3y.png!web

从图中可以看到,返回的是一个 JSON 文件,其中包含了登录请求是否成功、登录的结果信息和用户信息等内容。 下面就是使用 Python 编写的模拟登录时光网的代码:

 1 """
 2 Version: Python3.7
 3 Author: OniOn
 4 Site: http://www.cnblogs.com/TM0831/
 5 Time: 2020/7/5 14:19
 6 """
 7 import execjs
 8 import requests
 9 
10 
11 class MTimeSpider:
12     def __init__(self, username, password):
13         self.username = username
14         self.password = password
15 
16     def encrypted(self):
17         """
18         use JavaScript to encrypt the password
19         :return:
20         """
21         with open("encrypt.js", "r", encoding="utf-8") as f:
22             ctx = execjs.compile(f.read())
23             self.password = ctx.call("encrypt", self.password)
24 
25     def request(self):
26         """
27         send request and get the response
28         :return:
29         """
30         self.encrypted()
31         login_api = "https://m.mtime.cn/Service/callback-comm.mi/user/login.api"
32         data = {
33             "t": "20207515574379774",
34             "name": self.username,
35             "password": self.password,
36             "code": "",
37             "codeId": ""
38         }
39         res = requests.post(url=login_api, data=data)
40         status, msg = res.json()["data"]["status"], res.json()["data"]["msg"]
41         # print(status, msg)
42         if status == 1:
43             name = res.json()["data"]["user"]["nickname"]
44             print("用户: {} 登录成功!".format(name))
45         else:
46             print("登录失败!{}".format(msg))
47 
48 
49 if __name__ == '__main__':
50     print("请输入账号:")
51     usr = input()
52     print("请输入密码:")
53     pwd = input()
54     spider = MTimeSpider(usr, pwd)
55     spider.request()

运行后的截图如下:

Q7biaaF.png!web

完整代码已上传到 GitHub


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK