⼩程序使⽤Base64加密key(秘钥)和iv(偏移量)在进⾏aes加密,AES加密
技术简。。。
AES简介
AES最⼀种常见的对称加密算法,对称加密算法也就是加密和解密⽤相同的密钥。
具体的加密流程如下图:
明⽂P
没有经过加密的数据。
密钥K
⽤来加密明⽂的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收⽅与发送⽅协商产⽣,但不可以直接在⽹络上传输,否则会导致密钥泄漏,通常是通过⾮对称加密算法加密密钥,然后再通过⽹络传输给对⽅,或者直接⾯对⾯商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密⽂,窃取机密数据。
AES加密函数
设AES加密函数为E,则 C = E(K, P),其中P为明⽂,K为密钥,C为密⽂。也就是说,把明⽂P和密钥K作为加密函数的参数输⼊,则加密函数E会输出密⽂C。
密⽂C
经加密函数处理后的数据
AES解密函数
设AES解密函数为D,则 P = D(K, C),其中C为密⽂,K为密钥,P为明⽂。也就是说,把密⽂C和密钥K作为解密函数的参数输⼊,则解密函数会输出明⽂P。
在这⾥简单介绍下对称加密算法与⾮对称加密算法的区别。
对称加密算法
加密和解密⽤到的密钥是相同的,这种加密⽅式加密速度⾮常快,适合经常发送数据的场合。缺点是密钥的传输⽐较⿇烦。
⾮对称加密算法
加密和解密⽤的密钥是不同的,这种加密⽅式是⽤数学上的难解问题构造的,通常加密解密的速度⽐较慢,适合偶尔发送数据的场合。优点是密钥传输⽅便。常见的⾮对称加密算法为RSA、ECC和EIGamal。
base64编码:
Base64是⼀种⽤64个字符来表⽰任意⼆进制数据的⽅法, 常⽤于在URL、Cookie、⽹页中传输⼆进制数据,是⽹络上最常见的⽤于传输8Bit字节代码的编码⽅式之⼀,可⽤于在HTTP环境下传递较长的标识信息。
Base64这种编码规则是公开的,基本只要有程序能⼒都能解开,所以请勿⽤作加密⽤途。
Base64编码的主要的作⽤不在于安全性,⽽在于让内容能在⽹络间⽆错的传输。(常⽤语编码特殊字符,编码⼩型⼆进制⽂件等)
aes编码:更快,兼容设备,安全级别⾼:
⾼级加密标准(英语:AdvancedEncryption Standard,缩写:AES),在密码学中⼜称Rijndael加密法,是美国联邦政府采⽤的⼀种区块加密标准。这个标准⽤来替代原先的DES,已经被多⽅分析且⼴为全世界所使⽤。经过五年的甄选流程,⾼级加密标准由美国国家标准与技术研究院(NIST)于2001年11⽉26⽇发布于FIPSPUB 197,并在2002年5⽉26⽇成为有效的标准。2006年,⾼级加密标准已然成为对称密钥加密中最流⾏的算法之⼀。
js代码加密软件对于加解密⾸先想到的不是aes解码,⽽是base64,由于base64的安全性没有aes的⾼,
所以先对key和iv进⾏base64加密在使⽤aes加密,达到代码⽆明⽂的效果。
base64.js :加解密函数处理⽅法
function base64_encode(str){// 编码
var c1, c2, c3;
var base64EncodeChars ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var i =0,
len = str.length,
strin ='';
while(i < len){
c1 = str.charCodeAt(i++)&0xff;
if(i == len){
strin += base64EncodeChars.charAt(c1 >>2);
strin += base64EncodeChars.charAt((c1 &0x3)<<4);
strin +="==";
break;
}
c2 = str.charCodeAt(i++);
if(i == len){
strin += base64EncodeChars.charAt(c1 >>2);
strin += base64EncodeChars.charAt(((c1 &0x3)<<4)|((c2 &0xF0)>>4));
strin += base64EncodeChars.charAt((c2 &0xF)<<2);
strin +="=";
break;
break;
}
c3 = str.charCodeAt(i++);
strin += base64EncodeChars.charAt(c1 >>2);
strin += base64EncodeChars.charAt(((c1 &0x3)<<4)|((c2 &0xF0)>>4));
strin += base64EncodeChars.charAt(((c2 &0xF)<<2)|((c3 &0xC0)>>6));
strin += base64EncodeChars.charAt(c3 &0x3F)
}
return strin
}
function base64_decode(input){// 解码
var base64EncodeChars ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var output ="";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i =0;
input = place(/[^A-Za-z0-9\+\/\=]/g,"");
while(i < input.length){
enc1 = base64EncodeChars.indexOf(input.charAt(i++));
enc2 = base64EncodeChars.indexOf(input.charAt(i++));
enc3 = base64EncodeChars.indexOf(input.charAt(i++));
enc4 = base64EncodeChars.indexOf(input.charAt(i++));
chr1 =(enc1 <<2)|(enc2 >>4);
chr2 =((enc2 &15)<<4)|(enc3 >>2);
chr3 =((enc3 &3)<<6)| enc4;
output = output + String.fromCharCode(chr1);
if(enc3 !=64){
output = output + String.fromCharCode(chr2);
}
if(enc4 !=64){
output = output + String.fromCharCode(chr3);
}
}
return utf8_decode(output);
}
function utf8_decode(utftext){// utf-8解码
var string ='';
let i =0;
let c =0;
let c1 =0;
let c2 =0;
while(i < utftext.length){
c = utftext.charCodeAt(i);
if(c <128){
string += String.fromCharCode(c);
i++;
}else if((c >191)&&(c <224)){
c1 = utftext.charCodeAt(i +1);
string += String.fromCharCode(((c &31)<<6)|(c1 &63));
i +=2;
}else{
c1 = utftext.charCodeAt(i +1);
c2 = utftext.charCodeAt(i +2);
string += String.fromCharCode(((c &15)<<12)|((c1 &63)<<6)|(c2 &63));
i +=3;
}
}
return string;
}
base64_encode,
base64_decode
}
}
keyIv.js:处理秘钥和偏移量
var{base64_encode,base64_decode}=require('./keyIvBase64');//base64
/
/ var key=base64_encode('783a2274472d5928')
// var iv=base64_encode('0102030405060708')
var key='NzgzYTIyNzQ0NzJkNTkyOA=='//加密后的秘钥原 783a2274472d5928
var iv='MDEwMjAzMDQwNTA2MDcwOA=='//加密后的偏移量原 0102030405060708
上图为⽅便省事所以keyIv.js和base64.js合并了。
common.js :汇总处理,解密秘钥和偏移量在进⾏aes加密
var fun_aes =require('./aes.js');//aes加密
var{base64_encode,base64_decode}=require('./keyIvBase64');//base64
var{key,iv}=require('./keyIv');//秘钥和偏移量
// base64解密⽅法base64_decode()  在进⾏aes加密fun_Utf8.parse()
var key = fun_Utf8.parse(base64_decode(key));//⼗六位⼗六进制数作为秘钥var iv = fun_Utf8.parse(base64_decode(iv));//⼗六位⼗六进制数作为秘钥偏移量
aes.js :加密处理⽅法
使⽤aes⾸先要安装 crypto-js
安装crypto-js: npm install crypto-js --save-dev
/*
CryptoJS v3.1.2
(c) 2009-2013 by Jeff Mott. All rights reserved.
*/
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 =d(); a.init.appl y(a, arguments);return a },init:function(){},mixIn:function(a){for(var c in a) a.hasOwnProperty(c)&&(this[c]= a[c]); a.hasOwnProperty("toString")&& (String = a.toString)},clone:function(){return this.d(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(4 294967296* 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).toSt ring(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]|=(a.charCodeAt(j)&255)<<24-8*(j %4);r eturn new r.init(e, c)}}, x = w.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)))}},
q = l.BufferedBlockAlgorithm = t.extend({
reset:function(){this._data =new r.init;this._nDataBytes =0},_append:function(a){"string"==typeof a &&(a = x.parse(a));this._at(a);th is._nDataBytes += a.sigBytes },_process:function(a){var c =this._data, e = c.words, j = c.sigBytes, k =this.blockSize, b = j /(4* k), b = a ? u.ceil(b): u.m ax((b |0)-this._minBufferSize,0); a = b * k; j = u.min(4* a, j);if(a){for(var q =0; q < a; q += k)this._doProcessBloc
k(e, q); q = e.splice(0, a); c.sigBytes -= j }return new r.init(q, j)},clone:function(){
var a = t.clone.call(this);
a._data =this._data.clone();return a
}, _minBufferSize:0
}); l.Hasher = q.extend({
cfg: t.extend(),init:function(a){this.cfg =d(a);set()},reset:function(){ q.reset.call(this);this._doReset()},update:function(a){t his._append(a);this._process();return this},finalize:function(a){ a &&this._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 n = d.algo ={};return d
}(Math);
(function(){
var u = CryptoJS, p = u.lib.WordArray; u.enc.Base64 ={
stringify:function(d){var l = d.words, p = d.sigBytes, t =this._map; d.clamp(); d =[];for(var r =0; r < p; r +=3)for(var w =(l[r >>>2]>>>24-8*(r %4 )&255)<<16|(l[r +1>>>2]>>>24-8*((r +1)%4)&255)<<8| l[r +2>>>2]>>>24-8*((r +2)%4)&255, v =0;4> v && r +0.75* v < p; v++)d.pu sh(t.charAt(w >>>6*(3- v)&63));if(l = t.charAt(64))for(; d.length %4;)d.push(l);return d.join("")},parse:function(d){ var l = d.length, s =this._map, t = s.charAt(64); t &&(t = d.indexOf(t),-1!= t &&(l = t));for(var t =[], r =0, w =0; w <
l; w++)if(w %4){var v = s.indexOf(d.charAt(w -1))<<2*(w %4), b = s.indexOf(d.charAt(w))>>>6-2*(w %4); t[r >>>2]|=(v | b)<<24-8*(r % 4); r++}ate(t, r)
}, _map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
}
})();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。