JavaScript SHA512加密算法详细代码
本文实例为大家分享了JavaScriptSHA512加密算法,供大家参考,具体内容如下
/* *AJavaScriptimplementationoftheSecureHashAlgorithm,SHA-512,asdefined *inFIPS180-2 *Version2.2CopyrightAnonymousContributor,PaulJohnston2000-2009. *Othercontributors:GregHolt,AndrewKepert,Ydnar,Lostinet *DistributedundertheBSDLicense *Seehttp://pajhome.org.uk/crypt/md5fordetails. *http://www.sharejs.com/codes */ /* *Configurablevariables.Youmayneedtotweakthesetobecompatiblewith *theserver-side,butthedefaultsworkinmostcases. */ varhexcase=0;/*hexoutputformat.0-lowercase;1-uppercase*/ varb64pad="";/*base-64padcharacter."="forstrictRFCcompliance*/ /* *Thesearethefunctionsyou'llusuallywanttocall *Theytakestringargumentsandreturneitherhexorbase-64encodedstrings */ functionhex_sha512(s){returnrstr2hex(rstr_sha512(str2rstr_utf8(s)));} functionb64_sha512(s){returnrstr2b64(rstr_sha512(str2rstr_utf8(s)));} functionany_sha512(s,e){returnrstr2any(rstr_sha512(str2rstr_utf8(s)),e);} functionhex_hmac_sha512(k,d) {returnrstr2hex(rstr_hmac_sha512(str2rstr_utf8(k),str2rstr_utf8(d)));} functionb64_hmac_sha512(k,d) {returnrstr2b64(rstr_hmac_sha512(str2rstr_utf8(k),str2rstr_utf8(d)));} functionany_hmac_sha512(k,d,e) {returnrstr2any(rstr_hmac_sha512(str2rstr_utf8(k),str2rstr_utf8(d)),e);} /* *Performasimpleself-testtoseeiftheVMisworking */ functionsha512_vm_test() { returnhex_sha512("abc").toLowerCase()== "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"+ "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"; } /* *CalculatetheSHA-512ofarawstring */ functionrstr_sha512(s) { returnbinb2rstr(binb_sha512(rstr2binb(s),s.length*8)); } /* *CalculatetheHMAC-SHA-512ofakeyandsomedata(rawstrings) */ functionrstr_hmac_sha512(key,data) { varbkey=rstr2binb(key); if(bkey.length>32)bkey=binb_sha512(bkey,key.length*8); varipad=Array(32),opad=Array(32); for(vari=0;i<32;i++) { ipad[i]=bkey[i]^0x36363636; opad[i]=bkey[i]^0x5C5C5C5C; } varhash=binb_sha512(ipad.concat(rstr2binb(data)),1024+data.length*8); returnbinb2rstr(binb_sha512(opad.concat(hash),1024+512)); } /* *Convertarawstringtoahexstring */ functionrstr2hex(input) { try{hexcase}catch(e){hexcase=0;} varhex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef"; varoutput=""; varx; for(vari=0;i<input.length;i++) { x=input.charCodeAt(i); output+=hex_tab.charAt((x>>>4)&0x0F) +hex_tab.charAt(x&0x0F); } returnoutput; } /* *Convertarawstringtoabase-64string */ functionrstr2b64(input) { try{b64pad}catch(e){b64pad='';} vartab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; varoutput=""; varlen=input.length; for(vari=0;i<len;i+=3) { vartriplet=(input.charCodeAt(i)<<16) |(i+1<len?input.charCodeAt(i+1)<<8:0) |(i+2<len?input.charCodeAt(i+2):0); for(varj=0;j<4;j++) { if(i*8+j*6>input.length*8)output+=b64pad; elseoutput+=tab.charAt((triplet>>>6*(3-j))&0x3F); } } returnoutput; } /* *Convertarawstringtoanarbitrarystringencoding */ functionrstr2any(input,encoding) { vardivisor=encoding.length; vari,j,q,x,quotient; /*Converttoanarrayof16-bitbig-endianvalues,formingthedividend*/ vardividend=Array(Math.ceil(input.length/2)); for(i=0;i<dividend.length;i++) { dividend[i]=(input.charCodeAt(i*2)<<8)|input.charCodeAt(i*2+1); } /* *Repeatedlyperformalongdivision.Thebinaryarrayformsthedividend, *thelengthoftheencodingisthedivisor.Oncecomputed,thequotient *formsthedividendforthenextstep.Allremaindersarestoredforlater *use. */ varfull_length=Math.ceil(input.length*8/ (Math.log(encoding.length)/Math.log(2))); varremainders=Array(full_length); for(j=0;j<full_length;j++) { quotient=Array(); x=0; for(i=0;i<dividend.length;i++) { x=(x<<16)+dividend[i]; q=Math.floor(x/divisor); x-=q*divisor; if(quotient.length>0||q>0) quotient[quotient.length]=q; } remainders[j]=x; dividend=quotient; } /*Converttheremainderstotheoutputstring*/ varoutput=""; for(i=remainders.length-1;i>=0;i--) output+=encoding.charAt(remainders[i]); returnoutput; } /* *Encodeastringasutf-8. *Forefficiency,thisassumestheinputisvalidutf-16. */ functionstr2rstr_utf8(input) { varoutput=""; vari=-1; varx,y; while(++i<input.length) { /*Decodeutf-16surrogatepairs*/ x=input.charCodeAt(i); y=i+1<input.length?input.charCodeAt(i+1):0; if(0xD800<=x&&x<=0xDBFF&&0xDC00<=y&&y<=0xDFFF) { x=0x10000+((x&0x03FF)<<10)+(y&0x03FF); i++; } /*Encodeoutputasutf-8*/ if(x<=0x7F) output+=String.fromCharCode(x); elseif(x<=0x7FF) output+=String.fromCharCode(0xC0|((x>>>6)&0x1F), 0x80|(x&0x3F)); elseif(x<=0xFFFF) output+=String.fromCharCode(0xE0|((x>>>12)&0x0F), 0x80|((x>>>6)&0x3F), 0x80|(x&0x3F)); elseif(x<=0x1FFFFF) output+=String.fromCharCode(0xF0|((x>>>18)&0x07), 0x80|((x>>>12)&0x3F), 0x80|((x>>>6)&0x3F), 0x80|(x&0x3F)); } returnoutput; } /* *Encodeastringasutf-16 */ functionstr2rstr_utf16le(input) { varoutput=""; for(vari=0;i<input.length;i++) output+=String.fromCharCode(input.charCodeAt(i)&0xFF, (input.charCodeAt(i)>>>8)&0xFF); returnoutput; } functionstr2rstr_utf16be(input) { varoutput=""; for(vari=0;i<input.length;i++) output+=String.fromCharCode((input.charCodeAt(i)>>>8)&0xFF, input.charCodeAt(i)&0xFF); returnoutput; } /* *Convertarawstringtoanarrayofbig-endianwords *Characters>255havetheirhigh-bytesilentlyignored. */ functionrstr2binb(input) { varoutput=Array(input.length>>2); for(vari=0;i<output.length;i++) output[i]=0; for(vari=0;i<input.length*8;i+=8) output[i>>5]|=(input.charCodeAt(i/8)&0xFF)<<(24-i%32); returnoutput; } /* *Convertanarrayofbig-endianwordstoastring */ functionbinb2rstr(input) { varoutput=""; for(vari=0;i<input.length*32;i+=8) output+=String.fromCharCode((input[i>>5]>>>(24-i%32))&0xFF); returnoutput; } /* *CalculatetheSHA-512ofanarrayofbig-endiandwords,andabitlength */ varsha512_k; functionbinb_sha512(x,len) { if(sha512_k==undefined) { //SHA512constants sha512_k=newArray( newint64(0x428a2f98,-685199838),newint64(0x71374491,0x23ef65cd), newint64(-1245643825,-330482897),newint64(-373957723,-2121671748), newint64(0x3956c25b,-213338824),newint64(0x59f111f1,-1241133031), newint64(-1841331548,-1357295717),newint64(-1424204075,-630357736), newint64(-670586216,-1560083902),newint64(0x12835b01,0x45706fbe), newint64(0x243185be,0x4ee4b28c),newint64(0x550c7dc3,-704662302), newint64(0x72be5d74,-226784913),newint64(-2132889090,0x3b1696b1), newint64(-1680079193,0x25c71235),newint64(-1046744716,-815192428), newint64(-459576895,-1628353838),newint64(-272742522,0x384f25e3), newint64(0xfc19dc6,-1953704523),newint64(0x240ca1cc,0x77ac9c65), newint64(0x2de92c6f,0x592b0275),newint64(0x4a7484aa,0x6ea6e483), newint64(0x5cb0a9dc,-1119749164),newint64(0x76f988da,-2096016459), newint64(-1740746414,-295247957),newint64(-1473132947,0x2db43210), newint64(-1341970488,-1728372417),newint64(-1084653625,-1091629340), newint64(-958395405,0x3da88fc2),newint64(-710438585,-1828018395), newint64(0x6ca6351,-536640913),newint64(0x14292967,0xa0e6e70), newint64(0x27b70a85,0x46d22ffc),newint64(0x2e1b2138,0x5c26c926), newint64(0x4d2c6dfc,0x5ac42aed),newint64(0x53380d13,-1651133473), newint64(0x650a7354,-1951439906),newint64(0x766a0abb,0x3c77b2a8), newint64(-2117940946,0x47edaee6),newint64(-1838011259,0x1482353b), newint64(-1564481375,0x4cf10364),newint64(-1474664885,-1136513023), newint64(-1035236496,-789014639),newint64(-949202525,0x654be30), newint64(-778901479,-688958952),newint64(-694614492,0x5565a910), newint64(-200395387,0x5771202a),newint64(0x106aa070,0x32bbd1b8), newint64(0x19a4c116,-1194143544),newint64(0x1e376c08,0x5141ab53), newint64(0x2748774c,-544281703),newint64(0x34b0bcb5,-509917016), newint64(0x391c0cb3,-976659869),newint64(0x4ed8aa4a,-482243893), newint64(0x5b9cca4f,0x7763e373),newint64(0x682e6ff3,-692930397), newint64(0x748f82ee,0x5defb2fc),newint64(0x78a5636f,0x43172f60), newint64(-2067236844,-1578062990),newint64(-1933114872,0x1a6439ec), newint64(-1866530822,0x23631e28),newint64(-1538233109,-561857047), newint64(-1090935817,-1295615723),newint64(-965641998,-479046869), newint64(-903397682,-366583396),newint64(-779700025,0x21c0c207), newint64(-354779690,-840897762),newint64(-176337025,-294727304), newint64(0x6f067aa,0x72176fba),newint64(0xa637dc5,-1563912026), newint64(0x113f9804,-1090974290),newint64(0x1b710b35,0x131c471b), newint64(0x28db77f5,0x23047d84),newint64(0x32caab7b,0x40c72493), newint64(0x3c9ebe0a,0x15c9bebc),newint64(0x431d67c4,-1676669620), newint64(0x4cc5d4be,-885112138),newint64(0x597f299c,-60457430), newint64(0x5fcb6fab,0x3ad6faec),newint64(0x6c44198c,0x4a475817)); } //Initialhashvalues varH=newArray( newint64(0x6a09e667,-205731576), newint64(-1150833019,-2067093701), newint64(0x3c6ef372,-23791573), newint64(-1521486534,0x5f1d36f1), newint64(0x510e527f,-1377402159), newint64(-1694144372,0x2b3e6c1f), newint64(0x1f83d9ab,-79577749), newint64(0x5be0cd19,0x137e2179)); varT1=newint64(0,0), T2=newint64(0,0), a=newint64(0,0), b=newint64(0,0), c=newint64(0,0), d=newint64(0,0), e=newint64(0,0), f=newint64(0,0), g=newint64(0,0), h=newint64(0,0), //Temporaryvariablesnotspecifiedbythedocument s0=newint64(0,0), s1=newint64(0,0), Ch=newint64(0,0), Maj=newint64(0,0), r1=newint64(0,0), r2=newint64(0,0), r3=newint64(0,0); varj,i; varW=newArray(80); for(i=0;i<80;i++) W[i]=newint64(0,0); //appendpaddingtothesourcestring.TheformatisdescribedintheFIPS. x[len>>5]|=0x80<<(24-(len&0x1f)); x[((len+128>>10)<<5)+31]=len; for(i=0;i<x.length;i+=32)//32dwordsistheblocksize { int64copy(a,H[0]); int64copy(b,H[1]); int64copy(c,H[2]); int64copy(d,H[3]); int64copy(e,H[4]); int64copy(f,H[5]); int64copy(g,H[6]); int64copy(h,H[7]); for(j=0;j<16;j++) { W[j].h=x[i+2*j]; W[j].l=x[i+2*j+1]; } for(j=16;j<80;j++) { //sigma1 int64rrot(r1,W[j-2],19); int64revrrot(r2,W[j-2],29); int64shr(r3,W[j-2],6); s1.l=r1.l^r2.l^r3.l; s1.h=r1.h^r2.h^r3.h; //sigma0 int64rrot(r1,W[j-15],1); int64rrot(r2,W[j-15],8); int64shr(r3,W[j-15],7); s0.l=r1.l^r2.l^r3.l; s0.h=r1.h^r2.h^r3.h; int64add4(W[j],s1,W[j-7],s0,W[j-16]); } for(j=0;j<80;j++) { //Ch Ch.l=(e.l&f.l)^(~e.l&g.l); Ch.h=(e.h&f.h)^(~e.h&g.h); //Sigma1 int64rrot(r1,e,14); int64rrot(r2,e,18); int64revrrot(r3,e,9); s1.l=r1.l^r2.l^r3.l; s1.h=r1.h^r2.h^r3.h; //Sigma0 int64rrot(r1,a,28); int64revrrot(r2,a,2); int64revrrot(r3,a,7); s0.l=r1.l^r2.l^r3.l; s0.h=r1.h^r2.h^r3.h; //Maj Maj.l=(a.l&b.l)^(a.l&c.l)^(b.l&c.l); Maj.h=(a.h&b.h)^(a.h&c.h)^(b.h&c.h); int64add5(T1,h,s1,Ch,sha512_k[j],W[j]); int64add(T2,s0,Maj); int64copy(h,g); int64copy(g,f); int64copy(f,e); int64add(e,d,T1); int64copy(d,c); int64copy(c,b); int64copy(b,a); int64add(a,T1,T2); } int64add(H[0],H[0],a); int64add(H[1],H[1],b); int64add(H[2],H[2],c); int64add(H[3],H[3],d); int64add(H[4],H[4],e); int64add(H[5],H[5],f); int64add(H[6],H[6],g); int64add(H[7],H[7],h); } //representthehashasanarrayof32-bitdwords varhash=newArray(16); for(i=0;i<8;i++) { hash[2*i]=H[i].h; hash[2*i+1]=H[i].l; } returnhash; } //Aconstructorfor64-bitnumbers functionint64(h,l) { this.h=h; this.l=l; //this.toString=int64toString; } //Copiessrcintodst,assumingbothare64-bitnumbers functionint64copy(dst,src) { dst.h=src.h; dst.l=src.l; } //Right-rotatesa64-bitnumberbyshift //Won'thandlecasesofshift>=32 //Thefunctionrevrrot()isforthat functionint64rrot(dst,x,shift) { dst.l=(x.l>>>shift)|(x.h<<(32-shift)); dst.h=(x.h>>>shift)|(x.l<<(32-shift)); } //Reversesthedwordsofthesourceandthenrotatesrightbyshift. //Thisisequivalenttorotationby32+shift functionint64revrrot(dst,x,shift) { dst.l=(x.h>>>shift)|(x.l<<(32-shift)); dst.h=(x.l>>>shift)|(x.h<<(32-shift)); } //Bitwise-shiftsrighta64-bitnumberbyshift //Won'thandleshift>=32,butit'sneverneededinSHA512 functionint64shr(dst,x,shift) { dst.l=(x.l>>>shift)|(x.h<<(32-shift)); dst.h=(x.h>>>shift); } //Addstwo64-bitnumbers //Liketheoriginalimplementation,doesnotrelyon32-bitoperations functionint64add(dst,x,y) { varw0=(x.l&0xffff)+(y.l&0xffff); varw1=(x.l>>>16)+(y.l>>>16)+(w0>>>16); varw2=(x.h&0xffff)+(y.h&0xffff)+(w1>>>16); varw3=(x.h>>>16)+(y.h>>>16)+(w2>>>16); dst.l=(w0&0xffff)|(w1<<16); dst.h=(w2&0xffff)|(w3<<16); } //Same,exceptwith4addends.Worksfasterthanaddingthemonebyone. functionint64add4(dst,a,b,c,d) { varw0=(a.l&0xffff)+(b.l&0xffff)+(c.l&0xffff)+(d.l&0xffff); varw1=(a.l>>>16)+(b.l>>>16)+(c.l>>>16)+(d.l>>>16)+(w0>>>16); varw2=(a.h&0xffff)+(b.h&0xffff)+(c.h&0xffff)+(d.h&0xffff)+(w1>>>16); varw3=(a.h>>>16)+(b.h>>>16)+(c.h>>>16)+(d.h>>>16)+(w2>>>16); dst.l=(w0&0xffff)|(w1<<16); dst.h=(w2&0xffff)|(w3<<16); } //Same,exceptwith5addends functionint64add5(dst,a,b,c,d,e) { varw0=(a.l&0xffff)+(b.l&0xffff)+(c.l&0xffff)+(d.l&0xffff)+(e.l&0xffff); varw1=(a.l>>>16)+(b.l>>>16)+(c.l>>>16)+(d.l>>>16)+(e.l>>>16)+(w0>>>16); varw2=(a.h&0xffff)+(b.h&0xffff)+(c.h&0xffff)+(d.h&0xffff)+(e.h&0xffff)+(w1>>>16); varw3=(a.h>>>16)+(b.h>>>16)+(c.h>>>16)+(d.h>>>16)+(e.h>>>16)+(w2>>>16); dst.l=(w0&0xffff)|(w1<<16); dst.h=(w2&0xffff)|(w3<<16); }
以上就是本文的全部内容,希望对大家有所帮助,希望大家继续关注毛票票的最新内容。