使用AES256对web接口的入参和返回结果进行加解密处理 今天日月教大家如何使用AES256对web接口的入参和返回结果进行加解密处理话不多说直接上代码。适用框架SpringMVC、SpringBoot、SpringCloud后台部分1、定义接口请求的拦截器DecodeRequestBodyAdvice.java作用对接口入参进行解密处理import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Type; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice; import com.chenqi.util.aes.AES256Util; /** * Author chenqi * Description 拦截controller层方法根据自定义注解CipherParam配置做入参解密处理 * Date 11:09 2019/9/1 **/ Component ControllerAdvice(basePackages { com.**.controller, com.**.controller}) public class DecodeRequestBodyAdvice implements RequestBodyAdvice { private static final Logger LOG LoggerFactory.getLogger(DecodeRequestBodyAdvice.class); Autowired private AES256Util aesUtil; Override public boolean supports(MethodParameter methodParameter, Type targetType, Class? extends HttpMessageConverter? converterType) { return true; } Override public Object handleEmptyBody(Object body, HttpInputMessage request, MethodParameter parameter, Type targetType, Class? extends HttpMessageConverter? converterType) { return body; } /** * 入参解密 */ Override public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter, Type type, Class? extends HttpMessageConverter? aClass) { CipherParam cipherParam methodParameter.getMethodAnnotation(CipherParam.class); // controller方法没配置加解密 if (cipherParam null) { return inputMessage; } if (cipherParam.inDecode()false) { return inputMessage; } // 客户端没配置加解密便于postman,swagger测试 String encodeMethod inputMessage.getHeaders().getFirst(encodeMethod); if (StringUtils.isEmpty(encodeMethod) || !AES.equalsIgnoreCase(encodeMethod)) { return inputMessage; } try { LOG.info(对方法 :【 methodParameter.getMethod().getName() 】入参进行解密); return new MyHttpInputMessage(inputMessage); } catch (Exception e) { LOG.error(接口 :【 methodParameter.getMethod().getName() 】入参解密出现异常 e.getMessage()); return inputMessage; } } Override public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class? extends HttpMessageConverter? converterType) { return body; } class MyHttpInputMessage implements HttpInputMessage { private HttpHeaders headers; private InputStream body; public MyHttpInputMessage(HttpInputMessage inputMessage) throws Exception { this.headers inputMessage.getHeaders(); String data IOUtils.toString(inputMessage.getBody(), UTF-8); this.body IOUtils.toInputStream(aesUtil.decrypt(data), UTF-8); } Override public InputStream getBody() throws IOException { return body; } Override public HttpHeaders getHeaders() { return headers; } } }EncodeResponseBodyAdvice.java作用对接口返回结果进行加密处理import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import com.chenqi.util.JsonUtils; import com.chenqi.util.aes.AES256Util; /** * Author chenqi * Description 拦截controller层方法根据自定义注解CipherParam配置对返回结果进行加密处理 * Date 11:18 2019/9/1 **/ Component ControllerAdvice(basePackages { com.**.controller, com.**.controller }) public class EncodeResponseBodyAdvice implements ResponseBodyAdvice { private final static Logger logger LoggerFactory.getLogger(EncodeResponseBodyAdvice.class); Autowired private AES256Util aesUtil; Override public boolean supports(MethodParameter methodParameter, Class aClass) { return true; } /** * 返回结果加密 */ Override public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { CipherParam cipherParam methodParameter.getMethodAnnotation(CipherParam.class); // controller方法没配置加解密 if (cipherParam null) { return body; } if (cipherParam.outEncode() false) { return body; } // 客户端没配置加解密则返回结果也不加密便于postman,swagger测试 String encodeMethod serverHttpRequest.getHeaders().getFirst(encodeMethod); if (StringUtils.isEmpty(encodeMethod) || !AES.equalsIgnoreCase(encodeMethod)) { return body; } try { logger.info(对方法 :【 methodParameter.getMethod().getName() 】返回数据加密); return aesUtil.encrypt(JsonUtils.object2Json(body)); } catch (Exception e) { logger.error(对方法 :【 methodParameter.getMethod().getName() 】返回数据加密出现异常 e.getMessage()); e.printStackTrace(); } return body; } }2、Controller层接口示例ApiOperation(value XXXX接口【接口负责人陈奇】 , notes 接口备注 ) RequestMapping(value /binding,method RequestMethod.POST, consumes MediaType.APPLICATION_JSON_UTF8_VALUE, produces MediaType.APPLICATION_JSON_UTF8_VALUE) ResponseBody CipherParam public ResponseVOString binding(RequestBody BindingDTO bindingDTO){ return null; }3、自定义加解密注解import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.annotation.ElementType; import org.springframework.web.bind.annotation.Mapping; /** * Author chenqi * Description 加解密注解,在controller层的方法上增加此注解后便可拦戴此方法执行前的入参解密执行后的出参加密 * Date 11:27 2019/9/1 **/ Target({ElementType.METHOD,ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Mapping Documented public interface CipherParam { /** * 入参是否解密默认解密 */ boolean inDecode() default true; /** * 出参是否加密默认加密 */ boolean outEncode() default true; /** * 加解密方式默认AES * return */ CipherMethod method() default CipherMethod.AES; }枚举类/** * Author chenqi * Description 加解密、签名算法枚举 * Date 11:29 2019/9/1 **/ public enum CipherMethod { NULL(NULL), AES(AES), RSA(RSA), MD5(MD5); private String method; /*构造函数*/ private CipherMethod(String method) { this.method method; } }4、加解密工具类AES256Util.javaimport java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.springframework.beans.factory.annotation.Value; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class AES256Util { Value(${cipher.keyAlgorithm}) private static String KEY_ALGORITHM AES; Value(${cipher.cipherAlgorithm}) private String CIPHER_ALGORITHM AES; Value(${cipher.charset}) private static String CHARSET UTF-8; Value(${cipher.aeskey}) private static String KEY 54B288D8F8F*******203B92F25E8B3E;//对称加密的盐前后端保持一致 private static byte[] decrypt(byte[] src, byte[] key) throws Exception { Key k toKey(key); Cipher cipher Cipher.getInstance(KEY_ALGORITHM); cipher.init(2, k); return cipher.doFinal(src); } SuppressWarnings(restriction) public static String decrypt(String data) { try { byte[] key KEY.getBytes(CHARSET); byte[] src new BASE64Decoder().decodeBuffer(data); return new String(decrypt(src, key), CHARSET); } catch (Exception e) { e.printStackTrace(); } return null; } private static Key toKey(byte[] key) throws Exception { SecretKey secretKey new SecretKeySpec(key,KEY_ALGORITHM); return secretKey; } private static byte[] encrypt(byte[] data, byte[] key) throws Exception { Key k toKey(key); Cipher cipher Cipher.getInstance(KEY_ALGORITHM); cipher.init(1, k); return cipher.doFinal(data); } public static String encrypt(String data) { return addSecureToStr(data); } SuppressWarnings(restriction) private static String addSecureToStr(String str) { byte[] data null; byte[] key new byte[0]; try { key KEY.getBytes(CHARSET); data encrypt(str.getBytes(CHARSET), key); } catch (Exception e) { e.printStackTrace(); } return new BASE64Encoder().encode(data); } public static void main(String[] args) { AES256Util aES256Util new AES256Util(); String s encrypt({\sellerUserId\:\1\}); System.out.println(s); System.out.println(decrypt(s)); } }前端部分1、AES加解密工具jsaes.js这个js是我网上下载的大家可以新建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 CryptoJSCryptoJS||function(u,p){var d{},ld.lib{},sfunction(){},tl.Base{extend:function(a){s.prototypethis;var cnew s;ac.mixIn(a);c.hasOwnProperty(init)||(c.initfunction(){c.$super.init.apply(this,arguments)});c.init.prototypec;c.$superthis;return c},create:function(){var athis.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.toStringa.toString)},clone:function(){return this.init.prototype.extend(this)}}, rl.WordArrayt.extend({init:function(a,c){athis.wordsa||[];this.sigBytesc!p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var cthis.words,ea.words,jthis.sigBytes;aa.sigBytes;this.clamp();if(j%4)for(var k0;ka;k)c[jk2]|(e[k2]24-8*(k%4)255)24-8*((jk)%4);else if(65535e.length)for(k0;ka;k4)c[jk2]e[k2];else c.push.apply(c,e);this.sigBytesa;return this},clamp:function(){var athis.words,cthis.sigBytes;a[c2]4294967295 32-8*(c%4);a.lengthu.ceil(c/4)},clone:function(){var at.clone.call(this);a.wordsthis.words.slice(0);return a},random:function(a){for(var c[],e0;ea;e4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),wd.enc{},vw.Hex{stringify:function(a){var ca.words;aa.sigBytes;for(var e[],j0;ja;j){var kc[j2]24-8*(j%4)255;e.push((k4).toString(16));e.push((k15).toString(16))}return e.join()},parse:function(a){for(var ca.length,e[],j0;jc;j2)e[j3]|parseInt(a.substr(j, 2),16)24-4*(j%8);return new r.init(e,c/2)}},bw.Latin1{stringify:function(a){var ca.words;aa.sigBytes;for(var e[],j0;ja;j)e.push(String.fromCharCode(c[j2]24-8*(j%4)255));return e.join()},parse:function(a){for(var ca.length,e[],j0;jc;j)e[j2]|(a.charCodeAt(j)255)24-8*(j%4);return new r.init(e,c)}},xw.Utf8{stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error(Malformed UTF-8 data);}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}}, ql.BufferedBlockAlgorithmt.extend({reset:function(){this._datanew r.init;this._nDataBytes0},_append:function(a){stringtypeof a(ax.parse(a));this._data.concat(a);this._nDataBytesa.sigBytes},_process:function(a){var cthis._data,ec.words,jc.sigBytes,kthis.blockSize,bj/(4*k),ba?u.ceil(b):u.max((b|0)-this._minBufferSize,0);ab*k;ju.min(4*a,j);if(a){for(var q0;qa;qk)this._doProcessBlock(e,q);qe.splice(0,a);c.sigBytes-j}return new r.init(q,j)},clone:function(){var at.clone.call(this); a._datathis._data.clone();return a},_minBufferSize:0});l.Hasherq.extend({cfg:t.extend(),init:function(a){this.cfgthis.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){athis._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a, e)).finalize(b)}}});var nd.algo{};return d}(Math); (function(){var uCryptoJS,pu.lib.WordArray;u.enc.Base64{stringify:function(d){var ld.words,pd.sigBytes,tthis._map;d.clamp();d[];for(var r0;rp;r3)for(var w(l[r2]24-8*(r%4)255)16|(l[r12]24-8*((r1)%4)255)8|l[r22]24-8*((r2)%4)255,v0;4vr0.75*vp;v)d.push(t.charAt(w6*(3-v)63));if(lt.charAt(64))for(;d.length%4;)d.push(l);return d.join()},parse:function(d){var ld.length,sthis._map,ts.charAt(64);t(td.indexOf(t),-1!t(lt));for(var t[],r0,w0;w l;w)if(w%4){var vs.indexOf(d.charAt(w-1))2*(w%4),bs.indexOf(d.charAt(w))6-2*(w%4);t[r2]|(v|b)24-8*(r%4);r}return p.create(t,r)},_map:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/}})(); (function(u){function p(b,n,a,c,e,j,k){bb(na|~nc)ek;return(bj|b32-j)n}function d(b,n,a,c,e,j,k){bb(nc|a~c)ek;return(bj|b32-j)n}function l(b,n,a,c,e,j,k){bb(n^a^c)ek;return(bj|b32-j)n}function s(b,n,a,c,e,j,k){bb(a^(n|~c))ek;return(bj|b32-j)n}for(var tCryptoJS,rt.lib,wr.WordArray,vr.Hasher,rt.algo,b[],x0;64x;x)b[x]4294967296*u.abs(u.sin(x1))|0;rr.MD5v.extend({_doReset:function(){this._hashnew w.init([1732584193,4023233417,2562383102,271733878])}, _doProcessBlock:function(q,n){for(var a0;16a;a){var cna,eq[c];q[c](e8|e24)16711935|(e24|e8)4278255360}var athis._hash.words,cq[n0],eq[n1],jq[n2],kq[n3],zq[n4],rq[n5],tq[n6],wq[n7],vq[n8],Aq[n9],Bq[n10],Cq[n11],uq[n12],Dq[n13],Eq[n14],xq[n15],fa[0],ma[1],ga[2],ha[3],fp(f,m,g,h,c,7,b[0]),hp(h,f,m,g,e,12,b[1]),gp(g,h,f,m,j,17,b[2]),mp(m,g,h,f,k,22,b[3]),fp(f,m,g,h,z,7,b[4]),hp(h,f,m,g,r,12,b[5]),gp(g,h,f,m,t,17,b[6]),mp(m,g,h,f,w,22,b[7]), fp(f,m,g,h,v,7,b[8]),hp(h,f,m,g,A,12,b[9]),gp(g,h,f,m,B,17,b[10]),mp(m,g,h,f,C,22,b[11]),fp(f,m,g,h,u,7,b[12]),hp(h,f,m,g,D,12,b[13]),gp(g,h,f,m,E,17,b[14]),mp(m,g,h,f,x,22,b[15]),fd(f,m,g,h,e,5,b[16]),hd(h,f,m,g,t,9,b[17]),gd(g,h,f,m,C,14,b[18]),md(m,g,h,f,c,20,b[19]),fd(f,m,g,h,r,5,b[20]),hd(h,f,m,g,B,9,b[21]),gd(g,h,f,m,x,14,b[22]),md(m,g,h,f,z,20,b[23]),fd(f,m,g,h,A,5,b[24]),hd(h,f,m,g,E,9,b[25]),gd(g,h,f,m,k,14,b[26]),md(m,g,h,f,v,20,b[27]),fd(f,m,g,h,D,5,b[28]),hd(h,f, m,g,j,9,b[29]),gd(g,h,f,m,w,14,b[30]),md(m,g,h,f,u,20,b[31]),fl(f,m,g,h,r,4,b[32]),hl(h,f,m,g,v,11,b[33]),gl(g,h,f,m,C,16,b[34]),ml(m,g,h,f,E,23,b[35]),fl(f,m,g,h,e,4,b[36]),hl(h,f,m,g,z,11,b[37]),gl(g,h,f,m,w,16,b[38]),ml(m,g,h,f,B,23,b[39]),fl(f,m,g,h,D,4,b[40]),hl(h,f,m,g,c,11,b[41]),gl(g,h,f,m,k,16,b[42]),ml(m,g,h,f,t,23,b[43]),fl(f,m,g,h,A,4,b[44]),hl(h,f,m,g,u,11,b[45]),gl(g,h,f,m,x,16,b[46]),ml(m,g,h,f,j,23,b[47]),fs(f,m,g,h,c,6,b[48]),hs(h,f,m,g,w,10,b[49]),gs(g,h,f,m, E,15,b[50]),ms(m,g,h,f,r,21,b[51]),fs(f,m,g,h,u,6,b[52]),hs(h,f,m,g,k,10,b[53]),gs(g,h,f,m,B,15,b[54]),ms(m,g,h,f,e,21,b[55]),fs(f,m,g,h,v,6,b[56]),hs(h,f,m,g,x,10,b[57]),gs(g,h,f,m,t,15,b[58]),ms(m,g,h,f,D,21,b[59]),fs(f,m,g,h,z,6,b[60]),hs(h,f,m,g,C,10,b[61]),gs(g,h,f,m,j,15,b[62]),ms(m,g,h,f,A,21,b[63]);a[0]a[0]f|0;a[1]a[1]m|0;a[2]a[2]g|0;a[3]a[3]h|0},_doFinalize:function(){var bthis._data,nb.words,a8*this._nDataBytes,c8*b.sigBytes;n[c5]|12824-c%32;var eu.floor(a/ 4294967296);n[(c6494)15](e8|e24)16711935|(e24|e8)4278255360;n[(c6494)14](a8|a24)16711935|(a24|a8)4278255360;b.sigBytes4*(n.length1);this._process();bthis._hash;nb.words;for(a0;4a;a)cn[a],n[a](c8|c24)16711935|(c24|c8)4278255360;return b},clone:function(){var bv.clone.call(this);b._hashthis._hash.clone();return b}});t.MD5v._createHelper(r);t.HmacMD5v._createHmacHelper(r)})(Math); (function(){var uCryptoJS,pu.lib,dp.Base,lp.WordArray,pu.algo,sp.EvpKDFd.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfgthis.cfg.extend(d)},compute:function(d,r){for(var pthis.cfg,sp.hasher.create(),bl.create(),ub.words,qp.keySize,pp.iterations;u.lengthq;){ns.update(n);var ns.update(d).finalize(r);s.reset();for(var a1;ap;a)ns.finalize(n),s.reset();b.concat(n)}b.sigBytes4*q;return b}});u.EvpKDFfunction(d,l,p){return s.create(p).compute(d, l)}})(); CryptoJS.lib.Cipher||function(u){var pCryptoJS,dp.lib,ld.Base,sd.WordArray,td.BufferedBlockAlgorithm,rp.enc.Base64,wp.algo.EvpKDF,vd.Ciphert.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfgthis.cfg.extend(b);this._xformModee;this._keya;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()}, finalize:function(e){ethis._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return(stringtypeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return(stringtypeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipherv.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var bp.mode{},xfunction(e,a,b){var cthis._iv;c?this._ivu:cthis._prevBlock;for(var d0;db;d)e[ad]^ c[d]},q(d.BlockCipherModel.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._ciphere;this._iva}})).extend();q.Encryptorq.extend({processBlock:function(e,a){var bthis._cipher,cb.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlocke.slice(a,ac)}});q.Decryptorq.extend({processBlock:function(e,a){var bthis._cipher,cb.blockSize,de.slice(a,ac);b.decryptBlock(e,a);x.call(this, e,a,c);this._prevBlockd}});bb.CBCq;q(p.pad{}).Pkcs7{pad:function(a,b){for(var c4*b,cc-a.sigBytes%c,dc24|c16|c8|c,l[],n0;nc;n4)l.push(d);cs.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-a.words[a.sigBytes-12]255}};d.BlockCipherv.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var athis.cfg,ba.iv,aa.mode;if(this._xformModethis._ENC_XFORM_MODE)var ca.createEncryptor;else ca.createDecryptor,this._minBufferSize1;this._modec.call(a, this,bb.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var athis.cfg.padding;if(this._xformModethis._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var bthis._process(!0)}else bthis._process(!0),a.unpad(b);return b},blockSize:4});var nd.CipherParamsl.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b(p.format{}).OpenSSL{stringify:function(a){var ba.ciphertext;aa.salt;return(a?s.create([1398893684, 1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){ar.parse(a);var ba.words;if(1398893684b[0]1701076831b[1]){var cs.create(b.slice(2,4));b.splice(0,4);a.sigBytes-16}return n.create({ciphertext:a,salt:c})}},ad.SerializableCipherl.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){dthis.cfg.extend(d);var la.createEncryptor(c,d);bl.finalize(b);ll.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})}, decrypt:function(a,b,c,d){dthis.cfg.extend(d);bthis._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){returnstringtypeof a?b.parse(a,this):a}}),p(p.kdf{}).OpenSSL{execute:function(a,b,c,d){d||(ds.random(8));aw.create({keySize:bc}).compute(a,d);cs.create(a.words.slice(b),4*c);a.sigBytes4*b;return n.create({key:a,iv:c,salt:d})}},cd.PasswordBasedCiphera.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){lthis.cfg.extend(l);dl.kdf.execute(d, b.keySize,b.ivSize);l.ivd.iv;ba.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){lthis.cfg.extend(l);cthis._parse(c,l.format);dl.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.ivd.iv;return a.decrypt.call(this,b,c,d.key,l)}})}(); (function(){for(var uCryptoJS,pu.lib.BlockCipher,du.algo,l[],s[],t[],r[],w[],v[],b[],x[],q[],n[],a[],c0;256c;c)a[c]128c?c1:c1^283;for(var e0,j0,c0;256c;c){var kj^j1^j2^j3^j4,kk8^k255^99;l[e]k;s[k]e;var za[e],Fa[z],Ga[F],y257*a[k]^16843008*k;t[e]y24|y8;r[e]y16|y16;w[e]y8|y24;v[e]y;y16843009*G^65537*F^257*z^16843008*e;b[k]y24|y8;x[k]y16|y16;q[k]y8|y24;n[k]y;e?(ez^a[a[a[G^z]]],j^a[a[j]]):ej1}var H[0,1,2,4,8, 16,32,64,128,27,54],dd.AESp.extend({_doReset:function(){for(var athis._key,ca.words,da.sigBytes/4,a4*((this._nRoundsd6)1),ethis._keySchedule[],j0;ja;j)if(jd)e[j]c[j];else{var ke[j-1];j%d?6d4j%d(kl[k24]24|l[k16255]16|l[k8255]8|l[k255]):(kk8|k24,kl[k24]24|l[k16255]16|l[k8255]8|l[k255],k^H[j/d|0]24);e[j]e[j-d]^k}cthis._invKeySchedule[];for(d0;da;d)ja-d,kd%4?e[j]:e[j-4],c[d]4d||4j?k:b[l[k24]]^x[l[k16255]]^q[l[k 8255]]^n[l[k255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var da[c1];a[c1]a[c3];a[c3]d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);da[c1];a[c1]a[c3];a[c3]d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var mthis._nRounds,ga[b]^c[0],ha[b1]^c[1],ka[b2]^c[2],na[b3]^c[3],p4,r1;rm;r)var qd[g24]^e[h16255]^j[k8255]^l[n255]^c[p],sd[h24]^e[k16255]^j[n8255]^l[g255]^c[p],t d[k24]^e[n16255]^j[g8255]^l[h255]^c[p],nd[n24]^e[g16255]^j[h8255]^l[k255]^c[p],gq,hs,kt;q(f[g24]24|f[h16255]16|f[k8255]8|f[n255])^c[p];s(f[h24]24|f[k16255]16|f[n8255]8|f[g255])^c[p];t(f[k24]24|f[n16255]16|f[g8255]8|f[h255])^c[p];n(f[n24]24|f[g16255]16|f[h8255]8|f[k255])^c[p];a[b]q;a[b1]s;a[b2]t;a[b3]n},keySize:8});u.AESp._createHelper(d)})();mode-ecb.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 */ /** * Electronic Codebook block mode. */ CryptoJS.mode.ECB (function () { var ECB CryptoJS.lib.BlockCipherMode.extend(); ECB.Encryptor ECB.extend({ processBlock: function (words, offset) { this._cipher.encryptBlock(words, offset); } }); ECB.Decryptor ECB.extend({ processBlock: function (words, offset) { this._cipher.decryptBlock(words, offset); } }); return ECB; }());2、前端请求示例这里我给出以ajax请求的使用示例加解密方法//密钥 var keys 54B288D8F8F*******203B92F25E8B3E; //aes json加密 function jsonEncode(parms) { var key CryptoJS.enc.Utf8.parse(keys); //aes:密钥 var encryptedData JSON.stringify(parms); //aes:加密必须是json格式的 //console.log(encryptedData); //console.log(parms); var datas CryptoJS.AES.encrypt(encryptedData, key, { //aes:参数加密 mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); //console.log(datas) return datas; }; //aes json解密 function jsonDecode(res) { // debugger; var key CryptoJS.enc.Utf8.parse(keys); var data res.split(\r\n).join(); //datas加密后的多余空格和换行去掉 data data.split(\n).join(); var decryptedData CryptoJS.AES.decrypt(data, key, { //解密 固定的 mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); //最后解密 为正常数据 return JSON.parse(decryptedData.toString(CryptoJS.enc.Utf8)); } //aes str加密 function strEncrypt(word) { var key CryptoJS.enc.Utf8.parse(keys); var srcs CryptoJS.enc.Utf8.parse(word); var encrypted CryptoJS.AES.encrypt(srcs, key, { mode : CryptoJS.mode.ECB, padding : CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } //aes str解密 function strDecrypt(word) { var key CryptoJS.enc.Utf8.parse(keys); var decrypt CryptoJS.AES.decrypt(word, key, { mode : CryptoJS.mode.ECB, padding : CryptoJS.pad.Pkcs7 }); return CryptoJS.enc.Utf8.stringify(decrypt).toString(); }请求方法封装 sendAjax//ajax 发送请求 //flag: false为同步 true为异步 func:回调函数 isAes: true为aes加密 false为不加密 function sendAjax(type,url,data,flag,func,isAes){ var contentType undefined; if(isAes){//加密 contentType application/json; if(data ! null data ! undefined data ! ){ data jsonEncode(data); } } var resultData; $.ajax({ layerIndex:-1, beforeSend:function(){ this.layerIndex layer.load(0, { shade: [0.5, #393D49] }); }, type:type, async:flag, url:url, headers : { encodeMethod : AES }, data:data, contentType : contentType, success:function(data){ if(data.code undefined){//结果已加密 异常时没有加密校验 所以做这个判断 data jsonDecode(data); } resultData data; if(flag){ func(data); } }, dataType:json, complete:function(){ layer.close(this.layerIndex); } }); // alert(resultData.data); return resultData; }sendAjax使用示例function findEachAgentNum(){ var sendData {userId:user.userId}; sendAjax(post,findEachAgentNumUrl,sendData,true,function(data){ if(data ! null data ! undefined data.code 200){ //此处省略数据处理业务逻辑 } },true); }至此使用aes256对接口进行加解密处理就完成了代码我已经全部献上了大家可以复制过去调试使用这是我以前做的项目里用到的有问题欢迎留言讨论。如果该文章有帮助到您就留言点个赞吧您的支持与肯定是我持续更新最大的动力。