JS AES CBC PKCS7 二进制数组加解密

注:参考网络文章修改
测试:

var MYAES = require('../../utils/AES.js');

var data = [255, 255, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    console.log(data);
    var aesdata = MYAES.aesCbcPkcs7Encrypt(data, [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]);
    console.log(aesdata);
    var srcdata = MYAES.aesCbcPkcs7Decrypt(aesdata, [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]);
    console.log(srcdata);

AES.js

var CryptoJS = require('./crypto.js');

function wordArrayToUint8 (array) {
   
  var bin = new Uint8Array(array.length * 4);
  for(var i = 0; i < array.length; i++) {
   
      var num = array[i];
      if (num < 0) {
   
          num = array[i] + 0x100000000;
      }
      bin[i * 4 + 0] = (num >>> 24) & 0xFF;
      bin[i * 4 + 1] = (num >>> 16) & 0xFF;
      bin[i * 4 + 2] = (num >>> 8) & 0xFF;
      bin[i * 4 + 3] = (num >>> 0) & 0xFF;
  }
  return bin;
};

var MYAES = {
   
  // 构建WordArray对象
  int8parse: function (u8arr) {
   
    var len = u8arr.length;
    var words = [];
    for (var i = 0; i < len; i++) {
   
        words[i >>> 2] |= (u8arr[i] & 0xff) << (24 - (i % 4) * 8);
    }
    return CryptoJS.lib.WordArray.create(words, len);
  },

  aesCbcPkcs7Encrypt: function (srcdata, aeskey) {
   
    var data = this.int8parse(srcdata);//加密字符串
    var key = this.int8parse(aeskey);//密钥
    var iv = this.int8parse(aeskey);//与密钥保持一致
    //加密
    //var data = JSON.stringify(data);//将数据对象转换为json字符串
    var encrypted = CryptoJS.AES.encrypt(data, key, {
    iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
    var retArray = new Int8Array(wx.base64ToArrayBuffer(encrypted));
    return retArray;
  },
  aesCbcPkcs7Decrypt: function (aesdata, aeskey) {
   
    var data = this.int8parse(aesdata);//加密字符串
    var key = this.int8parse(aeskey);//密钥
    var iv = this.int8parse(aeskey);//与密钥保持一致
    //加密
    //var data = JSON.stringify(data);//将数据对象转换为json字符串
    var base64Str = CryptoJS.enc.Base64.stringify(data);
    var decrypted = CryptoJS.AES.decrypt(base64Str, key, {
    iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
    var retArray = [];
    if (decrypted.sigBytes > 0) {
   
      retArray = wordArrayToUint8(decrypted.words);
    }
    console.log(retArray);
    return retArray;
  }
}

module.exports = MYAES

crypto.js

 /*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS = CryptoJS || function (u, p) {
   
  var d = {
   }, l = d.lib = {
   }, s = function () {
    }, t = l.Base = {
    extend: function (a) {
    s.prototype = this; var c = new s; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function () {
    c.$super.init.apply(this, arguments) }); c.init.prototype = c; c.$super = this; return c }, create: function () {
    var a = this.extend(); a.init.apply(a, arguments); return a }, init: function () {
    }, mixIn: function (a) {
    for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function () {
    return this.init.prototype.extend(this) } },
  r = l.WordArray = t.extend({
   
    init: function (a, c) {
    a = this.words = a || []; this.sigBytes = c != p ? c : 4 * a.length }, toString: function (a) {
    return (a || v).stringify(this) }, concat: function (a) {
    var c = this.words, e = a.words, j = this.sigBytes; a = a.sigBytes; this.clamp(); if (j % 4) for (var k = 0; k < a; k++)c[j + k >>> 2] |= (e[k >>> 2] >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j + k) % 4); else if (65535 < e.length) for (k = 0; k < a; k += 4)c[j + k >>> 2] = e[k >>> 2]; else c.push.apply(c, e); this.sigBytes += a; return this }, clamp: function () {
   
      var a = this.words, c = this.sigBytes; a[c >>> 2] &= 4294967295 <<
        32 - 8 * (c % 4); a.length = u.ceil(c / 4)
    }, clone: function () {
    var a = t.clone.call(this); a.words = this.words.slice(0); return a }, random: function (a) {
    for (var c = [], e = 0; e < a; e += 4)c.push(4294967296 * u.random() | 0); return new r.init(c, a) }
  }), w = d.enc = {
   }, v = w.Hex = {
   
    stringify: function (a) {
    var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++) {
    var k = c[j >>> 2] >>> 24 - 8 * (j % 4) & 255; e.push((k >>> 4).toString(16)); e.push((k & 15).toString(16)) } return e.join("") }, parse: function (a) {
   
      for (var c = a.length, e = [], j = 0; j < c; j += 2)e[j >>> 3] |= parseInt(a.substr(j,
        2), 16) << 24 - 4 * (j % 8); return new r.init(e, c / 2)
    }
  }, b = w.Latin1 = {
    stringify: function (a) {
    var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++)e.push(String.fromCharCode(c[j >>> 2] >>> 24 - 8 * (j % 4) & 255)); return e.join("") }, parse: function (a) {
    for (var c = a.length, e = [], j = 0; j < c; j++)e[j >>> 2] |= (
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值