前端JS AES加密 后端PHP AES加解密

JavaScript09

前端JS AES加密 后端PHP AES加解密,第1张

<!DOCTYPEhtml>

<html>

<head>

    <title>aes demo</title>

</head>

<body>

    <script type="text/javascript" src="./CryptoJS/aes.js"></script>

    <script type="text/javascript" src="./CryptoJS/pad-zeropadding.js"></script>

    <script type="text/javascript">

    text = 'did=12345dg&version=1'

    var key = '123454536f667445454d537973576562'

    key = CryptoJS.enc.Utf8.parse(key)

    var iv = "1234577290ABCDEF1264147890ACAE45"

    iv = CryptoJS.enc.Utf8.parse(iv)

    var encrypted = CryptoJS.AES.encrypt(text, key, {

        iv: iv,

        mode: CryptoJS.mode.CBC,

        padding: CryptoJS.pad.ZeroPadding

    }).toString()

    document.write(encrypted)

    </script>

</body>

</html>

后端

public function encrypt2($input = ''){

        $pk = "123454536f667445454d537973576562"

        $iv = substr("1234577290ABCDEF1264147890ACAE45", 0, 16)

        // $t = 'T10515'

        $encrypted = ( mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $pk, $input, MCRYPT_MODE_CBC,$iv) )

        return base64_encode($encrypted)

    } 

    public function decrypt2($encrypted){

        $pk = "123454536f667445454d537973576562"

        $iv = substr("1234577290ABCDEF1264147890ACAE45", 0, 16)

        // $t = 'T10515'

        // $encrypted = "b7y/JPJFNTfxNVR8H4NNtw=="

        return  mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $pk, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv)

    }

可以推断, js 部分实际只使用了 iv 的 16 位长度

ps:

js加密后默认会base64_encode

使用php解密需要base64_decode后才一致

所以使用js加密和php解密时候需要注意,php端要先base64_decode再解密,例:

js加密的串是$t=b7y/JPJFNTfxNVR8H4NNtw==

php需要

$password= trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $pk,base64_decode( $t), MCRYPT_MODE_CBC, $iv))

则$password才能正确解析出来

需要引入的两个js文件

ase.js

[javascript] view plain copy

/*

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=thisvar c=new sa&&c.mixIn(a)c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)})c.init.prototype=cc.$super=thisreturn 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.sigBytesa=a.sigBytesthis.clamp()if(j%4)for(var k=0k<ak++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4)else if(65535<e.length)for(k=0k<ak+=4)c[j+k>>>2]=e[k>>>2]else c.push.apply(c,e)this.sigBytes+=areturn this},clamp:function(){var a=this.words,c=this.sigBytesa[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=0e<ae+=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.wordsa=a.sigBytesfor(var e=[],j=0j<aj++){var k=c[j>>>2]>>>24-8*(j%4)&255e.push((k>>>4).toString(16))e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0j<cj+=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.wordsa=a.sigBytesfor(var e=[],j=0j<aj++)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=0j<cj++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4)return 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.initthis._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a))this._data.concat(a)this._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.max((b|0)-this._minBufferSize,0)a=b*kj=u.min(4*a,j)if(a){for(var q=0q<aq+=k)this._doProcessBlock(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=this.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){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.WordArrayu.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._mapd.clamp()d=[]for(var r=0r<pr+=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=04>v&&r+0.75*v<pv++)d.push(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=0w<

lw++)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++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})()

(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+kreturn(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+kreturn(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+kreturn(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+kreturn(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=064>xx++)b[x]=4294967296*u.abs(u.sin(x+1))|0r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},

_doProcessBlock:function(q,n){for(var a=016>aa++){var c=n+a,e=q[c]q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),

f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,

m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,

E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63])a[0]=a[0]+f|0a[1]=a[1]+m|0a[2]=a[2]+g|0a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytesn[c>>>5]|=128<<24-c%32var e=u.floor(a/

4294967296)n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360b.sigBytes=4*(n.length+1)this._process()b=this._hashn=b.wordsfor(a=04>aa++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360return b},clone:function(){var b=v.clone.call(this)b._hash=this._hash.clone()return b}})t.MD5=v._createHelper(r)t.HmacMD5=v._createHmacHelper(r)})(Math)

(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterationsu.length<q){n&&s.update(n)var n=s.update(d).finalize(r)s.reset()for(var a=1a<pa++)n=s.finalize(n),s.reset()b.concat(n)}b.sigBytes=4*qreturn b}})u.EvpKDF=function(d,l,p){return s.create(p).compute(d,

l)}})()

CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.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.cfg=this.cfg.extend(b)this._xformMode=ethis._key=athis.reset()},reset:function(){t.reset.call(this)this._doReset()},process:function(e){this._append(e)return this._process()},

finalize:function(e){e&&this._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("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}})d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1})var b=p.mode={},x=function(e,a,b){var c=this._ivc?this._iv=u:c=this._prevBlockfor(var d=0d<bd++)e[a+d]^=

c[d]},q=(d.BlockCipherMode=l.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._cipher=ethis._iv=a}})).extend()q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSizex.call(this,e,a,c)b.encryptBlock(e,a)this._prevBlock=e.slice(a,a+c)}})q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c)b.decryptBlock(e,a)x.call(this,

e,a,c)this._prevBlock=d}})b=b.CBC=qq=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0n<cn+=4)l.push(d)c=s.create(l,c)a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}}d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this)var a=this.cfg,b=a.iv,a=a.modeif(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptorelse c=a.createDecryptor,this._minBufferSize=1this._mode=c.call(a,

this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.paddingif(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 n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertexta=a.saltreturn(a?s.create([1398893684,

1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a)var b=a.wordsif(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4))b.splice(0,4)a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d)var l=a.createEncryptor(c,d)b=l.finalize(b)l=l.cfgreturn 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){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}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8))a=w.create({keySize:b+c}).compute(a,d)c=s.create(a.words.slice(b),4*c)a.sigBytes=4*breturn n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l)d=l.kdf.execute(d,

b.keySize,b.ivSize)l.iv=d.ivb=a.encrypt.call(this,b,c,d.key,l)b.mixIn(d)return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l)c=this._parse(c,l.format)d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt)l.iv=d.ivreturn a.decrypt.call(this,b,c,d.key,l)}})}()

(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0256>cc++)a[c]=128>c?c<<1:c<<1^283for(var e=0,j=0,c=0256>cc++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99l[e]=ks[k]=evar z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*kt[e]=y<<24|y>>>8r[e]=y<<16|y>>>16w[e]=y<<8|y>>>24v[e]=yy=16843009*G^65537*F^257*z^16843008*eb[k]=y<<24|y>>>8x[k]=y<<16|y>>>16q[k]=y<<8|y>>>24n[k]=ye?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,

16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0j<aj++)if(j<d)e[j]=c[j]else{var k=e[j-1]j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24)e[j]=e[j-d]^k}c=this._invKeySchedule=[]for(d=0d<ad++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>

8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1]a[c+1]=a[c+3]a[c+3]=dthis._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s)d=a[c+1]a[c+1]=a[c+3]a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1r<mr++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=

d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=tq=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++]s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++]t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++]n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++]a[b]=qa[b+1]=sa[b+2]=ta[b+3]=n},keySize:8})u.AES=p._createHelper(d)})()

pad-zeropadding.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

*/

/**

* Zero padding strategy.

*/

CryptoJS.pad.ZeroPadding = {

    pad: function (data, blockSize) {

        // Shortcut

        var blockSizeBytes = blockSize * 4 

        // Pad

        data.clamp()

        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes)

    }, 

    unpad: function (data) {

        // Shortcut

        var dataWords = data.words 

        // Unpad

        var i = data.sigBytes - 1

        while (!((dataWords[i >>>2] >>>(24 - (i % 4) * 8)) &0xff)) {

            i--

        }

        data.sigBytes = i + 1

    }

作者/上善若水

1.md5(string $str,bool $flag = false)

$flag = false 默认返回32位的16进至数据散列值

$flag = true  返回原始流数据

2.sha1($string,$flag = false)

$flag = false 默认返回40位的16进至数据散列值

true  返回原始流数据

3.hash(string $algo,srting $str,bool $flag)

$algo : 算法名称,可通过hash_algos()函数获取所有hash加密的算法

如:md5,sha1等,采用md5,sha1加密所得结果和1,2两种方式结 果相同。

$flag = false 默认返回16进至的数据散列值,具体长度根据算法不同

而不同。

true  返回原始流数据。

4.crypt(string $str,$string $salt);

函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。

具体算法依赖于PHP检查之后支持的算法和$salt的格式和长度,当 然具体结果也和操作系统有关。比较结果采用 hash_equals($crypted,crypt($input,$salt))//且salt值相同

Password_verify($str,$crypted)

5.password_hash ( string $str, integer $algo [, array $options ] )

函数返回哈希加密后的密码字符串, password_hash() 是crypt()的 一个简单封装

$algo : 算法 PASSWORD_DEFAULT ,PASSWORD_BCRYPT

$options = [

“cost”=>10,//指明算法递归的层数,

“salt”=>“xxadasdsad”//加密盐值,即将被遗 弃,采用系统自动随机生成安全性更高

];

使用的算法、cost 和盐值作为哈希的一部分返回

Password_verify($str,$hashed)

6.base64_encode(string $str)

设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层 传输,例如电子邮件的主体。base64_decode(string $encoded)

可以进行解码

7.mcrypt_encrypt ( string $cipher , string $key , string $data ,

string $mode [, string $iv ] )

mcrypt_decrypt ( string $cipher , string $key , string $crypted ,

string $mode [, string $iv ] )

$ciper:加密算法,mcrypt_list_algorithms()可以获取该函数所有支持的算法

如MCRYPT_DES(“des”),MCRYPT_RIJNDAEL_128(“rijndael-128”)

$mode : 加密模式 ,mcrypt_list_modes()获取所有支持的加密模式,ecb,cbc

$key: 加密的秘钥,mcrypt_get_key_size ( string $cipher , string $mode )

获取指定的算法和模式所需的密钥长度。$key要满足这个长度,如果长 度无效会报出警告。

$iv : 加密的初始向量,可通过mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] ),

Iv的参数size:

通过mcrypt_get_iv_size ( string $cipher , string $mode )获取

Iv 的参数source:

初始向量数据来源。可选值有: MCRYPT_RAND (系统随机数生成 器), MCRYPT_DEV_RANDOM (从 /dev/random 文件读取数据) 和  MCRYPT_DEV_URANDOM (从 /dev/urandom 文件读取数据)。 在 Windows 平台,PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND。

请注意,在 PHP 5.6.0 之前的版本中, 此参数的默认值 为 MCRYPT_DEV_RANDOM。

Note: 需要注意的是,如果没有更多可用的用来产生随机数据的信息, 那么 MCRYPT_DEV_RANDOM 可能进入阻塞状态。

$data : 要加密的字符串数据

base64 可加可解。 md5 不可解

2种PHP的源码加密方式,此加密方法支持任意PHP版。

注意,加密后的PHP代码无需第三方工具解密,像往常一样,直接运行即可。

复制代码 代码如下:

<?php

function encode_file_contents($filename) {$type=strtolower(substr(strrchr($filename,'.'),1))if ('php' == $type &&is_file($filename) &&is_writable($filename)) { // 如果是PHP文件 并且可写 则进行压缩编码$contents = file_get_contents($filename)// 判断文件是否已经被编码处理$contents = php_strip_whitespace($filename)// 去除PHP头部和尾部标识

$headerPos = strpos($contents,'<?php')

$footerPos = strrpos($contents,'?>')

$contents = substr($contents, $headerPos + 5, $footerPos - $headerPos)$encode = base64_encode(gzdeflate($contents))// 开始编码$encode = '<?php'."\n eval(gzinflate(base64_decode("."'".$encode."'".")))\n\n?>"return file_put_contents($filename, $encode)}

return false

}

//调用函数

$filename = 'dam.php'

encode_file_contents($filename)

echo "OK,加密完成!"

?>

加密方式2:

复制代码 代码如下:

<?php

function RandAbc($length = "") { // 返回随机字符串$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"return str_shuffle($str)

}

$filename = 'index.php'//要加密的文件

$T_k1 = RandAbc()//随机密匙1

$T_k2 = RandAbc()//随机密匙2

$vstr = file_get_contents($filename)

$v1 = base64_encode($vstr)

$c = strtr($v1, $T_k1, $T_k2)//根据密匙替换对应字符。

$c = $T_k1.$T_k2.$c

$q1 = "O00O0O"

$q2 = "O0O000"

$q3 = "O0OO00"

$q4 = "OO0O00"

$q5 = "OO0000"

$q6 = "O00OO0"

$s = '$'.$q6.'=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A")$'.$q1.'=$'.$q6.'{3}.$'.$q6.'{6}.$'.$q6.'{33}.$'.$q6.'{30}$'.$q3.'=$'.$q6.'{33}.$'.$q6.'{10}.$'.$q6.'{24}.$'.$q6.'{10}.$'.$q6.'{24}$'.$q4.'=$'.$q3.'{0}.$'.$q6.'{18}.$'.$q6.'{3}.$'.$q3.'{0}.$'.$q3.'{1}.$'.$q6.'{24}$'.$q5.'=$'.$q6.'{7}.$'.$q6.'{13}$'.$q1.'.=$'.$q6.'{22}.$'.$q6.'{36}.$'.$q6.'{29}.$'.$q6.'{26}.$'.$q6.'{30}.$'.$q6.'{32}.$'.$q6.'{35}.$'.$q6.'{26}.$'.$q6.'{30}eval($'.$q1.'("'.base64_encode('$'.$q2.'="'.$c.'"eval(\'?>\'.$'.$q1.'($'.$q3.'($'.$q4.'($'.$q2.',$'.$q5.'*2),$'.$q4.'($'.$q2.',$'.$q5.',$'.$q5.'),$'.$q4.'($'.$q2.',0,$'.$q5.'))))').'"))'$s = '<?php '."\n".$s."\n".' ?>'

//echo $s

// 生成 加密后的PHP文件

$fpp1 = fopen('temp_'.$filename, 'w')

fwrite($fpp1, $s) or die('写文件错误')

?>

其实,PHP加密源码方式有很多,譬如,免费的微盾PHP加密,还有 www.phpjm.net 搞的在线加密,只是phpjm更复杂点而已。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++另外,分享一个 PHP类,它能对 文本的内容进行 二进制加密 与 解密,代码如下:

复制代码 代码如下:

<?php

class text_auth

{

var $n_iter

function text_auth()

{

$this->setIter(32)

}

function setIter($n_iter)

{

$this->n_iter = $n_iter

}

function getIter()

{

return $this->n_iter

}

function encrypt($data, $key)

{

$n = $this->_resize($data, 4)

$data_long[0] = $n

$n_data_long= $this->_str2long(1, $data, $data_long)$n = count($data_long)

if (($n &1) == 1) {

$data_long[$n] = chr(0)

$n_data_long++

}

$this->_resize($key, 16, true)

if ( '' == $key )

$key = '0000000000000000'

$n_key_long = $this->_str2long(0, $key, $key_long)$enc_data = ''

$w = array(0, 0)

$j = 0

$k = array(0, 0, 0, 0)

for ($i = 0$i <$n_data_long++$i) {

if ($j + 4 <= $n_key_long) {

$k[0] = $key_long[$j]

$k[1] = $key_long[$j + 1]

$k[2] = $key_long[$j + 2]

$k[3] = $key_long[$j + 3]

} else {

$k[0] = $key_long[$j % $n_key_long]

$k[1] = $key_long[($j + 1) % $n_key_long]$k[2] = $key_long[($j + 2) % $n_key_long]$k[3] = $key_long[($j + 3) % $n_key_long]}

$j = ($j + 4) % $n_key_long

$this->_encipherLong($data_long[$i], $data_long[++$i], $w, $k)$enc_data .= $this->_long2str($w[0])

$enc_data .= $this->_long2str($w[1])

}

return $enc_data

}

function decrypt($enc_data, $key)

{

$n_enc_data_long = $this->_str2long(0, $enc_data, $enc_data_long)$this->_resize($key, 16, true)

if ( '' == $key )

$key = '0000000000000000'

$n_key_long = $this->_str2long(0, $key, $key_long)$data = ''

$w = array(0, 0)

$j = 0

$len= 0

$k = array(0, 0, 0, 0)

$pos= 0

for ($i = 0$i <$n_enc_data_long$i += 2) {if ($j + 4 <= $n_key_long) {

$k[0] = $key_long[$j]

$k[1] = $key_long[$j + 1]

$k[2] = $key_long[$j + 2]

$k[3] = $key_long[$j + 3]

} else {

$k[0] = $key_long[$j % $n_key_long]

$k[1] = $key_long[($j + 1) % $n_key_long]$k[2] = $key_long[($j + 2) % $n_key_long]$k[3] = $key_long[($j + 3) % $n_key_long]}

$j = ($j + 4) % $n_key_long

$this->_decipherLong($enc_data_long[$i], $enc_data_long[$i + 1], $w, $k)if (0 == $i) {

$len = $w[0]

if (4 <= $len) {

$data .= $this->_long2str($w[1])

} else {

$data .= substr($this->_long2str($w[1]), 0, $len % 4)}

} else {

$pos = ($i - 1) * 4

if ($pos + 4 <= $len) {

$data .= $this->_long2str($w[0])

if ($pos + 8 <= $len) {

$data .= $this->_long2str($w[1])

} elseif ($pos + 4 <$len) {

$data .= substr($this->_long2str($w[1]), 0, $len % 4)}

} else {

$data .= substr($this->_long2str($w[0]), 0, $len % 4)}

}

}

return $data

}

function _encipherLong($y, $z, &$w, &$k)

{

$sum= (integer) 0

$delta = 0x9E3779B9

$n = (integer) $this->n_iter

while ($n-- >0) {

$y = $this->_add($y,

$this->_add($z <<4 ^ $this->_rshift($z, 5), $z) ^$this->_add($sum, $k[$sum &3]))

$sum= $this->_add($sum, $delta)

$z = $this->_add($z,

$this->_add($y <<4 ^ $this->_rshift($y, 5), $y) ^$this->_add($sum, $k[$this->_rshift($sum, 11) &3]))}

$w[0] = $y

$w[1] = $z

}

function _decipherLong($y, $z, &$w, &$k)

{

$sum= 0xC6EF3720

$delta = 0x9E3779B9

$n = (integer) $this->n_iter

while ($n-- >0) {

$z = $this->_add($z,

-($this->_add($y <<4 ^ $this->_rshift($y, 5), $y) ^$this->_add($sum, $k[$this->_rshift($sum, 11) &3])))$sum= $this->_add($sum, -$delta)

$y = $this->_add($y,

-($this->_add($z <<4 ^ $this->_rshift($z, 5), $z) ^$this->_add($sum, $k[$sum &3])))

}

$w[0] = $y

$w[1] = $z

}

function _resize(&$data, $size, $nonull = false){

$n = strlen($data)

$nmod = $n % $size

if ( 0 == $nmod )

$nmod = $size

if ($nmod >0) {

if ($nonull) {

for ($i = $n$i <$n - $nmod + $size++$i) {$data[$i] = $data[$i % $n]

}

} else {

for ($i = $n$i <$n - $nmod + $size++$i) {$data[$i] = chr(0)

}

}

}

return $n

}

function _hex2bin($str)

{

$len = strlen($str)

return pack('H' . $len, $str)

}

function _str2long($start, &$data, &$data_long){

$n = strlen($data)

$tmp= unpack('N*', $data)

$j = $start

foreach ($tmp as $value)

$data_long[$j++] = $value

return $j

}

function _long2str($l)

{

return pack('N', $l)

}

function _rshift($integer, $n)

{

if (0xffffffff <$integer || -0xffffffff >$integer) {$integer = fmod($integer, 0xffffffff + 1)}

if (0x7fffffff <$integer) {

$integer -= 0xffffffff + 1.0

} elseif (-0x80000000 >$integer) {

$integer += 0xffffffff + 1.0

}

if (0 >$integer) {

$integer &= 0x7fffffff

$integer >>= $n

$integer |= 1 <<(31 - $n)

} else {

$integer >>= $n

}

return $integer

}

function _add($i1, $i2)

{

$result = 0.0

foreach (func_get_args() as $value) {

if (0.0 >$value) {

$value -= 1.0 + 0xffffffff

}

$result += $value

}

if (0xffffffff <$result || -0xffffffff >$result) {$result = fmod($result, 0xffffffff + 1)

}

if (0x7fffffff <$result) {

$result -= 0xffffffff + 1.0

} elseif (-0x80000000 >$result) {

$result += 0xffffffff + 1.0

}

return $result

}

}

?>

使用方法参考如下:

// 加密过程

view sourceprint?

$text_file = S_ROOT . './456.php'

$str = @file_get_contents($text_file)

require_once S_ROOT . "./text_auth.php"

$text_auth = new text_auth(64)

$str = $text_auth->encrypt($str, "qianyunlai.com")$filename = S_ROOT . './789.php'// 加密后的文本为二进制,普通的文本编辑器无法正常查看file_put_contents($filename, $str)

// 解密过程

view sourceprint

?01 $text_file = S_ROOT . './789.php'

$str = @file_get_contents($text_file)

require_once S_ROOT . "./text_auth.php"

$text_auth = new text_auth(64)

$str = $text_auth->decrypt($str, "qianyunlai.com")$filename = S_ROOT . './456.php'

file_put_contents($filename, $str)