AES128-CFB NoPadding (小程序端)

前言:其實(shí)做這個(gè)加密挺簡(jiǎn)單的剩岳,但是過程卻不盡如人意贞滨。首先,我要做的這個(gè)是CFB模式的加密卢肃,這基本屬于小眾的模式了疲迂,基本都是用的CBC,而且還是要找前端的js文件(大部分都是后端語言寫的),那就更加難上加難了。吗氏。。

直接開始步入正題吧腰池,首先我們需要引入適合我們的aes.js文件,網(wǎng)上找了很久一大堆但基本都是沒有包括CFB模式的忙芒,后面找到了一個(gè)(忘了在哪里找到的了示弓,太多了,就不放鏈接了呵萨,直接貼代碼)

var t = t || function (t, e) {
  var r = {}, i = r.lib = {}, n = function () { }, o = i.Base = {
    extend: function (t) {
      n.prototype = this;
      var e = new n();
      return t && e.mixIn(t), e.hasOwnProperty("init") || (e.init = function () {
        e.$super.init.apply(this, arguments);
      }), e.init.prototype = e, e.$super = this, e;
    },
    create: function () {
      var t = this.extend();
      return t.init.apply(t, arguments), t;
    },
    init: function () { },
    mixIn: function (t) {
      for (var e in t) t.hasOwnProperty(e) && (this[e] = t[e]);
      t.hasOwnProperty("toString") && (this.toString = t.toString);
    },
    clone: function () {
      return this.init.prototype.extend(this);
    }
  }, s = i.WordArray = o.extend({
    init: function (t, e) {
      t = this.words = t || [], this.sigBytes = void 0 != e ? e : 4 * t.length;
    },
    toString: function (t) {
      return (t || a).stringify(this);
    },
    concat: function (t) {
      var e = this.words, r = t.words, i = this.sigBytes;
      if (t = t.sigBytes, this.clamp(), i % 4) for (var n = 0; n < t; n++) e[i + n >>> 2] |= (r[n >>> 2] >>> 24 - n % 4 * 8 & 255) << 24 - (i + n) % 4 * 8; else if (65535 < r.length) for (n = 0; n < t; n += 4) e[i + n >>> 2] = r[n >>> 2]; else e.push.apply(e, r);
      return this.sigBytes += t, this;
    },
    clamp: function () {
      var e = this.words, r = this.sigBytes;
      e[r >>> 2] &= 4294967295 << 32 - r % 4 * 8, e.length = t.ceil(r / 4);
    },
    clone: function () {
      var t = o.clone.call(this);
      return t.words = this.words.slice(0), t;
    },
    random: function (e) {
      for (var r = [], i = 0; i < e; i += 4) r.push(4294967296 * t.random() | 0);
      return new s.init(r, e);
    }
  }), c = r.enc = {}, a = c.Hex = {
    stringify: function (t) {
      var e = t.words;
      t = t.sigBytes;
      for (var r = [], i = 0; i < t; i++) {
        var n = e[i >>> 2] >>> 24 - i % 4 * 8 & 255;
        r.push((n >>> 4).toString(16)), r.push((15 & n).toString(16));
      }
      return r.join("");
    },
    parse: function (t) {
      for (var e = t.length, r = [], i = 0; i < e; i += 2) r[i >>> 3] |= parseInt(t.substr(i, 2), 16) << 24 - i % 8 * 4;
      return new s.init(r, e / 2);
    }
  }, f = c.Latin1 = {
    stringify: function (t) {
      var e = t.words;
      t = t.sigBytes;
      for (var r = [], i = 0; i < t; i++) r.push(String.fromCharCode(e[i >>> 2] >>> 24 - i % 4 * 8 & 255));
      return r.join("");
    },
    parse: function (t) {
      for (var e = t.length, r = [], i = 0; i < e; i++) r[i >>> 2] |= (255 & t.charCodeAt(i)) << 24 - i % 4 * 8;
      return new s.init(r, e);
    }
  }, h = c.Utf8 = {
    stringify: function (t) {
      try {
        return decodeURIComponent(escape(f.stringify(t)));
      } catch (t) {
        throw Error("Malformed UTF-8 data");
      }
    },
    parse: function (t) {
      return f.parse(unescape(encodeURIComponent(t)));
    }
  }, u = i.BufferedBlockAlgorithm = o.extend({
    reset: function () {
      this._data = new s.init(), this._nDataBytes = 0;
    },
    _append: function (t) {
      "string" == typeof t && (t = h.parse(t)), this._data.concat(t), this._nDataBytes += t.sigBytes;
    },
    _process: function (e) {
      var r = this._data, i = r.words, n = r.sigBytes, o = this.blockSize, c = n / (4 * o);
      if (e = (c = e ? t.ceil(c) : t.max((0 | c) - this._minBufferSize, 0)) * o, n = t.min(4 * e, n),
        e) {
        for (var a = 0; a < e; a += o) this._doProcessBlock(i, a);
        a = i.splice(0, e), r.sigBytes -= n;
      }
      return new s.init(a, n);
    },
    clone: function () {
      var t = o.clone.call(this);
      return t._data = this._data.clone(), t;
    },
    _minBufferSize: 0
  });
  i.Hasher = u.extend({
    cfg: o.extend(),
    init: function (t) {
      this.cfg = this.cfg.extend(t), this.reset();
    },
    reset: function () {
      u.reset.call(this), this._doReset();
    },
    update: function (t) {
      return this._append(t), this._process(), this;
    },
    finalize: function (t) {
      return t && this._append(t), this._doFinalize();
    },
    blockSize: 16,
    _createHelper: function (t) {
      return function (e, r) {
        return new t.init(r).finalize(e);
      };
    },
    _createHmacHelper: function (t) {
      return function (e, r) {
        return new p.HMAC.init(t, r).finalize(e);
      };
    }
  });
  var p = r.algo = {};
  return r;
}(Math);

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

接下來就是怎么使用他們了奏属,首先,在頭部引用

 const fun_aes = require('../../../config/aes.js');

然后套用方法

onLoad:function(){
let CryptoJS = fun_aes.CryptoJS;
    // 加密
    var key = CryptoJS.enc.Utf8.parse("0123456789ABCDEF"); //密鑰 這里放你的秘鑰
    var iv = CryptoJS.enc.Utf8.parse('0000000000000000'); //偏移iv 這里放16位的偏移iv
//注:key和iv一定要使用上方的方法解析一下潮峦,不能直接引用囱皿,不然的話得出來的數(shù)據(jù)不對(duì)而且會(huì)一直變
    var r = 'X80123456789ABCDEF';  //跟其他技術(shù)人員拿來檢驗(yàn)的值,我就是他拿了個(gè)不對(duì)的數(shù)據(jù)過來忱嘹,搞得我驗(yàn)證了很久都和他的對(duì)不上嘱腥,所以一定要確認(rèn)這(key,iv,r)三個(gè)值是對(duì)的
    var n = CryptoJS.AES.encrypt(r, key, {
        iv: iv,
        mode: CryptoJS.mode.CFB,//這個(gè)CFB就是我們要選的模式,你也可以選擇其他的(aes文件有該模式的話)
        padding: CryptoJS.pad.NoPadding//我們這邊用的是NoPadding的拘悦,你也可以選擇其他的(aes文件有該偏移模式的話)
      })
    var w = n.ciphertext.toString().toUpperCase();//解析數(shù)據(jù)
    console.log('數(shù)據(jù):' + r)
    console.log('密文:'+w);

    // AES解密  這里就不做多贅述了齿兔,跟加密差不多的
    var encryptedHexStr = CryptoJS.enc.Hex.parse(w);
      var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
    var decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CFB, padding: CryptoJS.pad.NoPadding });
      var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
    console.log(decryptedStr.toString())
    return;
}

這是最后得到的結(jié)果

最后的結(jié)果

最后,貼一下我在查找過程中找到的一些覺得有用的網(wǎng)站吧

在線解密網(wǎng)站:https://the-x.cn/cryptography/Aes.aspx,
http://tool.chacuo.net/cryptaes

git資源:https://github.com/brix/crypto-js/tree/3.1.3
https://github.com/lianghl0717/AES

其他類型的解密:https://www.cnblogs.com/xianrenjia/p/10693204.html

好像是官方文檔的一個(gè)東西(挺詳細(xì)的):https://cryptojs.gitbook.io/docs/

愛心發(fā)射biu.gif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市分苇,隨后出現(xiàn)的幾起案子添诉,更是在濱河造成了極大的恐慌,老刑警劉巖组砚,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吻商,死亡現(xiàn)場(chǎng)離奇詭異掏颊,居然都是意外死亡糟红,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門乌叶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盆偿,“玉大人,你說我怎么就攤上這事准浴∈屡ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵乐横,是天一觀的道長(zhǎng)求橄。 經(jīng)常有香客問我,道長(zhǎng)葡公,這世上最難降的妖魔是什么罐农? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮催什,結(jié)果婚禮上涵亏,老公的妹妹穿的比我還像新娘。我一直安慰自己蒲凶,他們只是感情好气筋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旋圆,像睡著了一般宠默。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灵巧,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天搀矫,我揣著相機(jī)與錄音,去河邊找鬼孩等。 笑死艾君,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肄方。 我是一名探鬼主播冰垄,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了虹茶?” 一聲冷哼從身側(cè)響起逝薪,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝴罪,沒想到半個(gè)月后董济,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡要门,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年虏肾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欢搜。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡封豪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炒瘟,到底是詐尸還是另有隱情吹埠,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布疮装,位于F島的核電站缘琅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏廓推。R本人自食惡果不足惜刷袍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望受啥。 院中可真熱鬧做个,春花似錦、人聲如沸滚局。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春通惫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遵湖。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旅急,地道東北人溺拱。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓句占,卻偏偏與公主長(zhǎng)得像擂啥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子离赫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • JS和PHP交互AES加密解密數(shù)據(jù) 1.php7.0開始mcrypt_decrypt函數(shù)將不能使用,整個(gè)mcryp...
    憶明人閱讀 3,630評(píng)論 1 0
  • 本文要推薦的[ToolFk]是一款程序員經(jīng)常使用的線上免費(fèi)測(cè)試工具箱疫稿,ToolFk 特色是專注于程序員日常的開發(fā)工...
    TOOLFK閱讀 1,213評(píng)論 0 2
  • 看到志梅同學(xué)發(fā)的一篇文章,文章的名稱叫《是愛情嗎鹃两?是利益吧遗座?》文章闡明了,愛情其實(shí)是利益的一種平衡關(guān)系俊扳。其...
    黃秀霞閱讀 442評(píng)論 0 1
  • 在沒有出入社會(huì)的時(shí)候馋记,在看到旁人兩個(gè)卿卿我我的時(shí)候号坡,在沒有接觸愛情的時(shí)候,在沒有經(jīng)過大千世界的誘惑的時(shí)候梯醒,在沒有...
    小茜愛鬼閱讀 125評(píng)論 0 0
  • 今天翻開的書是《生活之鹽》,作者弗朗索瓦絲·埃里捷宽堆,法國(guó)著名的人類學(xué)家、哲學(xué)家冤馏,克洛德·列維-斯特勞斯的學(xué)生日麸。她的...
    謝意閱讀 180評(píng)論 0 0