AES加密/解密-简版

发布时间 2023-11-17 16:33:15作者: 忙着可爱呀~

1、使用

WECHAT.wxEncrypt('str', 'key', 'appID').toString()

2、aes.js文件

var WECHAT = {};
(function() {
    WECHAT.wxEncrypt = function(p, f, d) {
        var c = w.enc.Base64.parse(f + '=');
        f = w.lib.WordArray.create(w.enc.Latin1.parse(f).words, 16);
        var s = w.enc.Latin1.parse(function() {
            for (var c = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'.split(''), d = '', f = 0; 16 > f; f++) d += c[Math.floor(Math.random() * c.length)];
            return d
        }());
        p = w.enc.Utf8.parse(p);
        var v = w.enc.Hex.parse(('00000000' + Math.ceil(p.sigBytes).toString(16)).slice(-8));
        s.concat(v).concat(p).concat(w.enc.Latin1.parse(d));
        return w.AES.encrypt(s, c, {
            iv: f
        })
    };
    WECHAT.wxDecrypt = function(p, f, d) {
        var c = w.enc.Base64.parse(f + '=');
        f = w.lib.WordArray.create(w.enc.Latin1.parse(f).words, 16);
        p = w.AES.decrypt(p, c, {
            iv: f
        }).toString({
            stringify: function(c) {
                for (var d = c.words, f = c.sigBytes, e = [], q = 16; 20 > q; q++) {
                    var a = d[q >>> 2] >>> 24 - q % 4 * 8 & 255;
                    e.push((a >>> 4).toString(16));
                    e.push((a & 15).toString(16))
                }
                for (var p = parseInt(e.join(''), 16) + 20, e = [], q = 20; q < p; q++) a = d[q >>> 2] >>> 24 - q % 4 * 8 & 255, e.push(String.fromCharCode(a));
                c = decodeURIComponent(escape(e.join('')));
                e = [];
                for (q = p; q < f; q++) a = d[q >>> 2] >>> 24 - q % 4 * 8 & 255, e.push(String.fromCharCode(a));
                d = e.join('');
                return [c, d]
            }
        });
        return p[1] == d ? p[0] : ''
    };
    WECHAT.wxSignature = function(p, f, d, c) {
        p = [p, f, d, c].sort().join('');
        return w.SHA1(p)
    };
    WECHAT.SHA1 = function(p) {
        return w.SHA1(p)
    };
    var w = w || function(p, f) {
        var d = {},
            c = d.lib = {},
            s = function() {},
            v = c.Base = {
                extend: function(b) {
                    s.prototype = this;
                    var a = new s;
                    b && a.mixIn(b);
                    a.hasOwnProperty('init') || (a.init = function() {
                        a.$super.init.apply(this, arguments)
                    });
                    a.init.prototype = a;
                    a.$super = this;
                    return a
                },
                create: function() {
                    var b = this.extend();
                    b.init.apply(b, arguments);
                    return b
                },
                init: function() {},
                mixIn: function(b) {
                    for (var a in b) b.hasOwnProperty(a) && (this[a] = b[a]);
                    b.hasOwnProperty('toString') && (this.toString = b.toString)
                },
                clone: function() {
                    return this.init.prototype.extend(this)
                }
            },
            u = c.WordArray = v.extend({
                init: function(b, a) {
                    b = this.words = b || [];
                    this.sigBytes = a != f ? a : 4 * b.length
                },
                toString: function(b) {
                    return (b || q).stringify(this)
                },
                concat: function(b) {
                    var a = this.words,
                        h = b.words,
                        m = this.sigBytes;
                    b = b.sigBytes;
                    this.clamp();
                    if (m % 4)
                        for (var t = 0; t < b; t++) a[m + t >>> 2] |= (h[t >>> 2] >>> 24 - t % 4 * 8 & 255) << 24 - (m + t) % 4 * 8;
                    else if (65535 < h.length)
                        for (t = 0; t < b; t += 4) a[m + t >>> 2] = h[t >>> 2];
                    else a.push.apply(a, h);
                    this.sigBytes += b;
                    return this
                },
                clamp: function() {
                    var b = this.words,
                        a = this.sigBytes;
                    b[a >>> 2] &= 4294967295 << 32 - a % 4 * 8;
                    b.length = p.ceil(a / 4)
                },
                clone: function() {
                    var b = v.clone.call(this);
                    b.words = this.words.slice(0);
                    return b
                },
                random: function(b) {
                    for (var a = [], h = 0; h < b; h += 4) a.push(4294967296 * p.random() | 0);
                    return new u.init(a, b)
                }
            }),
            e = d.enc = {},
            q = e.Hex = {
                stringify: function(b) {
                    var a = b.words;
                    b = b.sigBytes;
                    for (var h = [], m = 0; m < b; m++) {
                        var t = a[m >>> 2] >>> 24 - m % 4 * 8 & 255;
                        h.push((t >>> 4).toString(16));
                        h.push((t & 15).toString(16))
                    }
                    return h.join('')
                },
                parse: function(b) {
                    for (var a = b.length, h = [], m = 0; m < a; m += 2) h[m >>> 3] |= parseInt(b.substr(m, 2), 16) << 24 - m % 8 * 4;
                    return new u.init(h, a / 2)
                }
            },
            a = e.Latin1 = {
                stringify: function(b) {
                    var a = b.words;
                    b = b.sigBytes;
                    for (var h = [], m = 0; m < b; m++) h.push(String.fromCharCode(a[m >>> 2] >>> 24 - m % 4 * 8 & 255));
                    return h.join('')
                },
                parse: function(b) {
                    for (var a = b.length, h = [], m = 0; m < a; m++) h[m >>> 2] |= (b.charCodeAt(m) & 255) << 24 - m % 4 * 8;
                    return new u.init(h, a)
                }
            },
            y = e.Utf8 = {
                stringify: function(b) {
                    try {
                        return decodeURIComponent(escape(a.stringify(b)))
                    } catch (r) {
                        throw Error('Malformed UTF-8 data');
                    }
                },
                parse: function(b) {
                    return a.parse(unescape(encodeURIComponent(b)))
                }
            },
            r = c.BufferedBlockAlgorithm = v.extend({
                reset: function() {
                    this._data = new u.init;
                    this._nDataBytes = 0
                },
                _append: function(b) {
                    'string' == typeof b && (b = y.parse(b));
                    this._data.concat(b);
                    this._nDataBytes += b.sigBytes
                },
                _process: function(b) {
                    var a = this._data,
                        h = a.words,
                        m = a.sigBytes,
                        t = this.blockSize,
                        r = m / (4 * t),
                        r = b ? p.ceil(r) : p.max((r | 0) - this._minBufferSize, 0);
                    b = r * t;
                    m = p.min(4 * b, m);
                    if (b) {
                        for (var c = 0; c < b; c += t) this._doProcessBlock(h, c);
                        c = h.splice(0, b);
                        a.sigBytes -= m
                    }
                    return new u.init(c, m)
                },
                clone: function() {
                    var b = v.clone.call(this);
                    b._data = this._data.clone();
                    return b
                },
                _minBufferSize: 0
            });
        c.Hasher = r.extend({
            cfg: v.extend(),
            init: function(b) {
                this.cfg = this.cfg.extend(b);
                this.reset()
            },
            reset: function() {
                r.reset.call(this);
                this._doReset()
            },
            update: function(b) {
                this._append(b);
                this._process();
                return this
            },
            finalize: function(b) {
                b && this._append(b);
                return this._doFinalize()
            },
            blockSize: 16,
            _createHelper: function(b) {
                return function(a, h) {
                    return (new b.init(h)).finalize(a)
                }
            },
            _createHmacHelper: function(b) {
                return function(a, h) {
                    return (new A.HMAC.init(b, h)).finalize(a)
                }
            }
        });
        var A = d.algo = {};
        return d
    }(Math);
    (function() {
        var p = w,
            f = p.lib.WordArray;
        p.enc.Base64 = {
            stringify: function(d) {
                var c = d.words,
                    f = d.sigBytes,
                    p = this._map;
                d.clamp();
                d = [];
                for (var u = 0; u < f; u += 3)
                    for (var e = (c[u >>> 2] >>> 24 - u % 4 * 8 & 255) << 16 | (c[u + 1 >>> 2] >>> 24 - (u + 1) % 4 * 8 & 255) << 8 | c[u + 2 >>> 2] >>> 24 - (u + 2) % 4 * 8 & 255, q = 0; 4 > q && u + .75 * q < f; q++) d.push(p.charAt(e >>> 6 * (3 - q) & 63));
                if (c = p.charAt(64))
                    for (; d.length % 4;) d.push(c);
                return d.join('')
            },
            parse: function(d) {
                var c = d.length,
                    p = this._map,
                    v = p.charAt(64);
                v && (v = d.indexOf(v), -1 != v && (c = v));
                for (var v = [], u = 0, e = 0; e < c; e++)
                    if (e % 4) {
                        var q = p.indexOf(d.charAt(e - 1)) << e % 4 * 2,
                            a = p.indexOf(d.charAt(e)) >>> 6 - e % 4 * 2;
                        v[u >>> 2] |= (q | a) << 24 - u % 4 * 8;
                        u++
                    }
                return f.create(v, u)
            },
            _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
        }
    })();
    (function(p) {
        function f(a, c, b, d, h, m, t) {
            a = a + (c & b | ~c & d) + h + t;
            return (a << m | a >>> 32 - m) + c
        }

        function d(a, c, b, d, h, m, t) {
            a = a + (c & d | b & ~d) + h + t;
            return (a << m | a >>> 32 - m) + c
        }

        function c(a, c, b, d, h, m, t) {
            a = a + (c ^ b ^ d) + h + t;
            return (a << m | a >>> 32 - m) + c
        }

        function s(a, c, b, d, h, m, t) {
            a = a + (b ^ (c | ~d)) + h + t;
            return (a << m | a >>> 32 - m) + c
        }
        for (var v = w, u = v.lib, e = u.WordArray, q = u.Hasher, u = v.algo, a = [], y = 0; 64 > y; y++) a[y] = 4294967296 * p.abs(p.sin(y + 1)) | 0;
        u = u.MD5 = q.extend({
            _doReset: function() {
                this._hash = new e.init([1732584193, 4023233417, 2562383102, 271733878])
            },
            _doProcessBlock: function(r, e) {
                for (var b = 0; 16 > b; b++) {
                    var q = e + b,
                        h = r[q];
                    r[q] = (h << 8 | h >>> 24) & 16711935 | (h << 24 | h >>> 8) & 4278255360
                }
                var b = this._hash.words,
                    q = r[e + 0],
                    h = r[e + 1],
                    m = r[e + 2],
                    t = r[e + 3],
                    p = r[e + 4],
                    u = r[e + 5],
                    v = r[e + 6],
                    y = r[e + 7],
                    w = r[e + 8],
                    C = r[e + 9],
                    D = r[e + 10],
                    E = r[e + 11],
                    F = r[e + 12],
                    G = r[e + 13],
                    H = r[e + 14],
                    I = r[e + 15],
                    g = b[0],
                    n = b[1],
                    k = b[2],
                    l = b[3],
                    g = f(g, n, k, l, q, 7, a[0]),
                    l = f(l, g, n, k, h, 12, a[1]),
                    k = f(k, l, g, n, m, 17, a[2]),
                    n = f(n, k, l, g, t, 22, a[3]),
                    g = f(g, n, k, l, p, 7, a[4]),
                    l = f(l, g, n, k, u, 12, a[5]),
                    k = f(k, l, g, n, v, 17, a[6]),
                    n = f(n, k, l, g, y, 22, a[7]),
                    g = f(g, n, k, l, w, 7, a[8]),
                    l = f(l, g, n, k, C, 12, a[9]),
                    k = f(k, l, g, n, D, 17, a[10]),
                    n = f(n, k, l, g, E, 22, a[11]),
                    g = f(g, n, k, l, F, 7, a[12]),
                    l = f(l, g, n, k, G, 12, a[13]),
                    k = f(k, l, g, n, H, 17, a[14]),
                    n = f(n, k, l, g, I, 22, a[15]),
                    g = d(g, n, k, l, h, 5, a[16]),
                    l = d(l, g, n, k, v, 9, a[17]),
                    k = d(k, l, g, n, E, 14, a[18]),
                    n = d(n, k, l, g, q, 20, a[19]),
                    g = d(g, n, k, l, u, 5, a[20]),
                    l = d(l, g, n, k, D, 9, a[21]),
                    k = d(k, l, g, n, I, 14, a[22]),
                    n = d(n, k, l, g, p, 20, a[23]),
                    g = d(g, n, k, l, C, 5, a[24]),
                    l = d(l, g, n, k, H, 9, a[25]),
                    k = d(k, l, g, n, t, 14, a[26]),
                    n = d(n, k, l, g, w, 20, a[27]),
                    g = d(g, n, k, l, G, 5, a[28]),
                    l = d(l, g, n, k, m, 9, a[29]),
                    k = d(k, l, g, n, y, 14, a[30]),
                    n = d(n, k, l, g, F, 20, a[31]),
                    g = c(g, n, k, l, u, 4, a[32]),
                    l = c(l, g, n, k, w, 11, a[33]),
                    k = c(k, l, g, n, E, 16, a[34]),
                    n = c(n, k, l, g, H, 23, a[35]),
                    g = c(g, n, k, l, h, 4, a[36]),
                    l = c(l, g, n, k, p, 11, a[37]),
                    k = c(k, l, g, n, y, 16, a[38]),
                    n = c(n, k, l, g, D, 23, a[39]),
                    g = c(g, n, k, l, G, 4, a[40]),
                    l = c(l, g, n, k, q, 11, a[41]),
                    k = c(k, l, g, n, t, 16, a[42]),
                    n = c(n, k, l, g, v, 23, a[43]),
                    g = c(g, n, k, l, C, 4, a[44]),
                    l = c(l, g, n, k, F, 11, a[45]),
                    k = c(k, l, g, n, I, 16, a[46]),
                    n = c(n, k, l, g, m, 23, a[47]),
                    g = s(g, n, k, l, q, 6, a[48]),
                    l = s(l, g, n, k, y, 10, a[49]),
                    k = s(k, l, g, n, H, 15, a[50]),
                    n = s(n, k, l, g, u, 21, a[51]),
                    g = s(g, n, k, l, F, 6, a[52]),
                    l = s(l, g, n, k, t, 10, a[53]),
                    k = s(k, l, g, n, D, 15, a[54]),
                    n = s(n, k, l, g, h, 21, a[55]),
                    g = s(g, n, k, l, w, 6, a[56]),
                    l = s(l, g, n, k, I, 10, a[57]),
                    k = s(k, l, g, n, v, 15, a[58]),
                    n = s(n, k, l, g, G, 21, a[59]),
                    g = s(g, n, k, l, p, 6, a[60]),
                    l = s(l, g, n, k, E, 10, a[61]),
                    k = s(k, l, g, n, m, 15, a[62]),
                    n = s(n, k, l, g, C, 21, a[63]);
                b[0] = b[0] + g | 0;
                b[1] = b[1] + n | 0;
                b[2] = b[2] + k | 0;
                b[3] = b[3] + l | 0
            },
            _doFinalize: function() {
                var a = this._data,
                    c = a.words,
                    b = 8 * this._nDataBytes,
                    d = 8 * a.sigBytes;
                c[d >>> 5] |= 128 << 24 - d % 32;
                var h = p.floor(b / 4294967296);
                c[(d + 64 >>> 9 << 4) + 15] = (h << 8 | h >>> 24) & 16711935 | (h << 24 | h >>> 8) & 4278255360;
                c[(d + 64 >>> 9 << 4) + 14] = (b << 8 | b >>> 24) & 16711935 | (b << 24 | b >>> 8) & 4278255360;
                a.sigBytes = 4 * (c.length + 1);
                this._process();
                a = this._hash;
                c = a.words;
                for (b = 0; 4 > b; b++) d = c[b], c[b] = (d << 8 | d >>> 24) & 16711935 | (d << 24 | d >>> 8) & 4278255360;
                return a
            },
            clone: function() {
                var a = q.clone.call(this);
                a._hash = this._hash.clone();
                return a
            }
        });
        v.MD5 = q._createHelper(u);
        v.HmacMD5 = q._createHmacHelper(u)
    })(Math);
    (function() {
        var p = w,
            f = p.lib,
            d = f.Base,
            c = f.WordArray,
            f = p.algo,
            s = f.EvpKDF = d.extend({
                cfg: d.extend({
                    keySize: 4,
                    hasher: f.MD5,
                    iterations: 1
                }),
                init: function(c) {
                    this.cfg = this.cfg.extend(c)
                },
                compute: function(d, f) {
                    for (var e = this.cfg, q = e.hasher.create(), a = c.create(), p = a.words, r = e.keySize, e = e.iterations; p.length < r;) {
                        s && q.update(s);
                        var s = q.update(d).finalize(f);
                        q.reset();
                        for (var b = 1; b < e; b++) s = q.finalize(s), q.reset();
                        a.concat(s)
                    }
                    a.sigBytes = 4 * r;
                    return a
                }
            });
        p.EvpKDF = function(c, d, e) {
            return s.create(e).compute(c, d)
        }
    })();
    w.lib.Cipher || function(p) {
        var f = w,
            d = f.lib,
            c = d.Base,
            s = d.WordArray,
            v = d.BufferedBlockAlgorithm,
            u = f.enc.Base64,
            e = f.algo.EvpKDF,
            q = d.Cipher = v.extend({
                cfg: c.extend(),
                createEncryptor: function(a, b) {
                    return this.create(this._ENC_XFORM_MODE, a, b)
                },
                createDecryptor: function(a, b) {
                    return this.create(this._DEC_XFORM_MODE, a, b)
                },
                init: function(a, b, c) {
                    this.cfg = this.cfg.extend(c);
                    this._xformMode = a;
                    this._key = b;
                    this.reset()
                },
                reset: function() {
                    v.reset.call(this);
                    this._doReset()
                },
                process: function(a) {
                    this._append(a);
                    return this._process()
                },
                finalize: function(a) {
                    a && this._append(a);
                    return this._doFinalize()
                },
                keySize: 4,
                ivSize: 4,
                _ENC_XFORM_MODE: 1,
                _DEC_XFORM_MODE: 2,
                _createHelper: function(a) {
                    return {
                        encrypt: function(m, c, d) {
                            return ('string' == typeof c ? x : b).encrypt(a, m, c, d)
                        },
                        decrypt: function(m, c, d) {
                            return ('string' == typeof c ? x : b).decrypt(a, m, c, d)
                        }
                    }
                }
            });
        d.StreamCipher = q.extend({
            _doFinalize: function() {
                return this._process(!0)
            },
            blockSize: 1
        });
        var a = f.mode = {},
            y = function(a, b, c) {
                var d = this._iv;
                d ? this._iv = p : d = this._prevBlock;
                for (var e = 0; e < c; e++) a[b + e] ^= d[e]
            },
            r = (d.BlockCipherMode = c.extend({
                createEncryptor: function(a, b) {
                    return this.Encryptor.create(a, b)
                },
                createDecryptor: function(a, b) {
                    return this.Decryptor.create(a, b)
                },
                init: function(a, b) {
                    this._cipher = a;
                    this._iv = b
                }
            })).extend();
        r.Encryptor = r.extend({
            processBlock: function(a, b) {
                var c = this._cipher,
                    d = c.blockSize;
                y.call(this, a, b, d);
                c.encryptBlock(a, b);
                this._prevBlock = a.slice(b, b + d)
            }
        });
        r.Decryptor = r.extend({
            processBlock: function(a, b) {
                var c = this._cipher,
                    d = c.blockSize,
                    e = a.slice(b, b + d);
                c.decryptBlock(a, b);
                y.call(this, a, b, d);
                this._prevBlock = e
            }
        });
        a = a.CBC = r;
        r = (f.pad = {}).Pkcs7 = {
            pad: function(a, b) {
                for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, e = [], f = 0; f < c; f += 4) e.push(d);
                c = s.create(e, c);
                a.concat(c)
            },
            unpad: function(a) {
                a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255
            }
        };
        d.BlockCipher = q.extend({
            cfg: q.cfg.extend({
                mode: a,
                padding: r
            }),
            reset: function() {
                q.reset.call(this);
                var a = this.cfg,
                    b = a.iv,
                    a = a.mode;
                if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor;
                else c = a.createDecryptor, this._minBufferSize = 1;
                this._mode = c.call(a, this, b && b.words)
            },
            _doProcessBlock: function(a, b) {
                this._mode.processBlock(a, b)
            },
            _doFinalize: function() {
                var a = this.cfg.padding;
                if (this._xformMode == this._ENC_XFORM_MODE) {
                    a.pad(this._data, this.blockSize);
                    var b = this._process(!0)
                } else b = this._process(!0), a.unpad(b);
                return b
            },
            blockSize: 4
        });
        var A = d.CipherParams = c.extend({
                init: function(a) {
                    this.mixIn(a)
                },
                toString: function(a) {
                    return (a || this.formatter).stringify(this)
                }
            }),
            a = (f.format = {}).OpenSSL = {
                stringify: function(a) {
                    var b = a.ciphertext;
                    a = a.salt;
                    return (a ? s.create([1398893684, 1701076831]).concat(a).concat(b) : b).toString(u)
                },
                parse: function(a) {
                    a = u.parse(a);
                    var b = a.words;
                    if (1398893684 == b[0] && 1701076831 == b[1]) {
                        var c = s.create(b.slice(2, 4));
                        b.splice(0, 4);
                        a.sigBytes -= 16
                    }
                    return A.create({
                        ciphertext: a,
                        salt: c
                    })
                }
            },
            b = d.SerializableCipher = c.extend({
                cfg: c.extend({
                    format: a
                }),
                encrypt: function(a, b, c, d) {
                    d = this.cfg.extend(d);
                    var e = a.createEncryptor(c, d);
                    b = e.finalize(b);
                    e = e.cfg;
                    return A.create({
                        ciphertext: b,
                        key: c,
                        iv: e.iv,
                        algorithm: a,
                        mode: e.mode,
                        padding: e.padding,
                        blockSize: a.blockSize,
                        formatter: d.format
                    })
                },
                decrypt: function(a, b, c, d) {
                    d = this.cfg.extend(d);
                    b = this._parse(b, d.format);
                    return a.createDecryptor(c, d).finalize(b.ciphertext)
                },
                _parse: function(a, b) {
                    return 'string' == typeof a ? b.parse(a, this) : a
                }
            }),
            f = (f.kdf = {}).OpenSSL = {
                execute: function(a, b, c, d) {
                    d || (d = s.random(8));
                    a = e.create({
                        keySize: b + c
                    }).compute(a, d);
                    c = s.create(a.words.slice(b), 4 * c);
                    a.sigBytes = 4 * b;
                    return A.create({
                        key: a,
                        iv: c,
                        salt: d
                    })
                }
            },
            x = d.PasswordBasedCipher = b.extend({
                cfg: b.cfg.extend({
                    kdf: f
                }),
                encrypt: function(a, c, d, e) {
                    e = this.cfg.extend(e);
                    d = e.kdf.execute(d, a.keySize, a.ivSize);
                    e.iv = d.iv;
                    a = b.encrypt.call(this, a, c, d.key, e);
                    a.mixIn(d);
                    return a
                },
                decrypt: function(a, c, d, e) {
                    e = this.cfg.extend(e);
                    c = this._parse(c, e.format);
                    d = e.kdf.execute(d, a.keySize, a.ivSize, c.salt);
                    e.iv = d.iv;
                    return b.decrypt.call(this, a, c, d.key, e)
                }
            })
    }();
    (function() {
        for (var p = w, f = p.lib.BlockCipher, d = p.algo, c = [], s = [], v = [], u = [], e = [], q = [], a = [], y = [], r = [], A = [], b = [], x = 0; 256 > x; x++) b[x] = 128 > x ? x << 1 : x << 1 ^ 283;
        for (var h = 0, m = 0, x = 0; 256 > x; x++) {
            var t = m ^ m << 1 ^ m << 2 ^ m << 3 ^ m << 4,
                t = t >>> 8 ^ t & 255 ^ 99;
            c[h] = t;
            s[t] = h;
            var B = b[h],
                J = b[B],
                K = b[J],
                z = 257 * b[t] ^ 16843008 * t;
            v[h] = z << 24 | z >>> 8;
            u[h] = z << 16 | z >>> 16;
            e[h] = z << 8 | z >>> 24;
            q[h] = z;
            z = 16843009 * K ^ 65537 * J ^ 257 * B ^ 16843008 * h;
            a[t] = z << 24 | z >>> 8;
            y[t] = z << 16 | z >>> 16;
            r[t] = z << 8 | z >>> 24;
            A[t] = z;
            h ? (h = B ^ b[b[b[K ^ B]]], m ^= b[b[m]]) : h = m = 1
        }
        var L = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54],
            d = d.AES = f.extend({
                _doReset: function() {
                    for (var b = this._key, d = b.words, e = b.sigBytes / 4, b = 4 * ((this._nRounds = e + 6) + 1), f = this._keySchedule = [], m = 0; m < b; m++)
                        if (m < e) f[m] = d[m];
                        else {
                            var h = f[m - 1];
                            m % e ? 6 < e && 4 == m % e && (h = c[h >>> 24] << 24 | c[h >>> 16 & 255] << 16 | c[h >>> 8 & 255] << 8 | c[h & 255]) : (h = h << 8 | h >>> 24, h = c[h >>> 24] << 24 | c[h >>> 16 & 255] << 16 | c[h >>> 8 & 255] << 8 | c[h & 255], h ^= L[m / e | 0] << 24);
                            f[m] = f[m - e] ^ h
                        }
                    d = this._invKeySchedule = [];
                    for (e = 0; e < b; e++) m = b - e, h = e % 4 ? f[m] : f[m - 4], d[e] = 4 > e || 4 >= m ? h : a[c[h >>> 24]] ^ y[c[h >>> 16 & 255]] ^ r[c[h >>> 8 & 255]] ^ A[c[h & 255]]
                },
                encryptBlock: function(a, b) {
                    this._doCryptBlock(a, b, this._keySchedule, v, u, e, q, c)
                },
                decryptBlock: function(b, c) {
                    var d = b[c + 1];
                    b[c + 1] = b[c + 3];
                    b[c + 3] = d;
                    this._doCryptBlock(b, c, this._invKeySchedule, a, y, r, A, s);
                    d = b[c + 1];
                    b[c + 1] = b[c + 3];
                    b[c + 3] = d
                },
                _doCryptBlock: function(a, b, c, d, e, h, m, g) {
                    for (var n = this._nRounds, k = a[b] ^ c[0], l = a[b + 1] ^ c[1], f = a[b + 2] ^ c[2], q = a[b + 3] ^ c[3], p = 4, r = 1; r < n; r++) var u = d[k >>> 24] ^ e[l >>> 16 & 255] ^ h[f >>> 8 & 255] ^ m[q & 255] ^ c[p++],
                        s = d[l >>> 24] ^ e[f >>> 16 & 255] ^ h[q >>> 8 & 255] ^ m[k & 255] ^ c[p++],
                        t = d[f >>> 24] ^ e[q >>> 16 & 255] ^ h[k >>> 8 & 255] ^ m[l & 255] ^ c[p++],
                        q = d[q >>> 24] ^ e[k >>> 16 & 255] ^ h[l >>> 8 & 255] ^ m[f & 255] ^ c[p++],
                        k = u,
                        l = s,
                        f = t;
                    u = (g[k >>> 24] << 24 | g[l >>> 16 & 255] << 16 | g[f >>> 8 & 255] << 8 | g[q & 255]) ^ c[p++];
                    s = (g[l >>> 24] << 24 | g[f >>> 16 & 255] << 16 | g[q >>> 8 & 255] << 8 | g[k & 255]) ^ c[p++];
                    t = (g[f >>> 24] << 24 | g[q >>> 16 & 255] << 16 | g[k >>> 8 & 255] << 8 | g[l & 255]) ^ c[p++];
                    q = (g[q >>> 24] << 24 | g[k >>> 16 & 255] << 16 | g[l >>> 8 & 255] << 8 | g[f & 255]) ^ c[p++];
                    a[b] = u;
                    a[b + 1] = s;
                    a[b + 2] = t;
                    a[b + 3] = q
                },
                keySize: 8
            });
        p.AES = f._createHelper(d)
    })();
    (function() {
        var p = w,
            f = p.lib,
            d = f.WordArray,
            c = f.Hasher,
            s = [],
            f = p.algo.SHA1 = c.extend({
                _doReset: function() {
                    this._hash = new d.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
                },
                _doProcessBlock: function(c, d) {
                    for (var e = this._hash.words, f = e[0], a = e[1], p = e[2], r = e[3], w = e[4], b = 0; 80 > b; b++) {
                        if (16 > b) s[b] = c[d + b] | 0;
                        else {
                            var x = s[b - 3] ^ s[b - 8] ^ s[b - 14] ^ s[b - 16];
                            s[b] = x << 1 | x >>> 31
                        }
                        x = (f << 5 | f >>> 27) + w + s[b];
                        x = 20 > b ? x + ((a & p | ~a & r) + 1518500249) : 40 > b ? x + ((a ^ p ^ r) + 1859775393) : 60 > b ? x + ((a & p | a & r | p & r) - 1894007588) : x + ((a ^ p ^ r) - 899497514);
                        w = r;
                        r = p;
                        p = a << 30 | a >>> 2;
                        a = f;
                        f = x
                    }
                    e[0] = e[0] + f | 0;
                    e[1] = e[1] + a | 0;
                    e[2] = e[2] + p | 0;
                    e[3] = e[3] + r | 0;
                    e[4] = e[4] + w | 0
                },
                _doFinalize: function() {
                    var c = this._data,
                        d = c.words,
                        e = 8 * this._nDataBytes,
                        f = 8 * c.sigBytes;
                    d[f >>> 5] |= 128 << 24 - f % 32;
                    d[(f + 64 >>> 9 << 4) + 14] = Math.floor(e / 4294967296);
                    d[(f + 64 >>> 9 << 4) + 15] = e;
                    c.sigBytes = 4 * d.length;
                    this._process();
                    return this._hash
                },
                clone: function() {
                    var d = c.clone.call(this);
                    d._hash = this._hash.clone();
                    return d
                }
            });
        p.SHA1 = c._createHelper(f);
        p.HmacSHA1 = c._createHmacHelper(f)
    })()
})();