JavaScript SHA1加密算法实现详细代码
本文实例为大家介绍了JavaScriptSHA1加密算法吗,供大家参考,具体内容如下
/* *AJavaScriptimplementationoftheSecureHashAlgorithm,SHA-1,asdefined *inFIPS180-1 *Version2.2CopyrightPaulJohnston2000-2009. *Othercontributors:GregHolt,AndrewKepert,Ydnar,Lostinet *DistributedundertheBSDLicense *Seehttp://pajhome.org.uk/crypt/md5fordetails. *http://www.sharejs.com */ /* *Configurablevariables.Youmayneedtotweakthesetobecompatiblewith *theserver-side,butthedefaultsworkinmostcases. */ varhexcase=0;/*hexoutputformat.0-lowercase;1-uppercase*/ varb64pad="";/*base-64padcharacter."="forstrictRFCcompliance*/ /* *Thesearethefunctionsyou'llusuallywanttocall *Theytakestringargumentsandreturneitherhexorbase-64encodedstrings */ functionhex_sha1(s){returnrstr2hex(rstr_sha1(str2rstr_utf8(s)));} functionb64_sha1(s){returnrstr2b64(rstr_sha1(str2rstr_utf8(s)));} functionany_sha1(s,e){returnrstr2any(rstr_sha1(str2rstr_utf8(s)),e);} functionhex_hmac_sha1(k,d) {returnrstr2hex(rstr_hmac_sha1(str2rstr_utf8(k),str2rstr_utf8(d)));} functionb64_hmac_sha1(k,d) {returnrstr2b64(rstr_hmac_sha1(str2rstr_utf8(k),str2rstr_utf8(d)));} functionany_hmac_sha1(k,d,e) {returnrstr2any(rstr_hmac_sha1(str2rstr_utf8(k),str2rstr_utf8(d)),e);} /* *Performasimpleself-testtoseeiftheVMisworking */ functionsha1_vm_test() { returnhex_sha1("abc").toLowerCase()=="a9993e364706816aba3e25717850c26c9cd0d89d"; } /* *CalculatetheSHA1ofarawstring */ functionrstr_sha1(s) { returnbinb2rstr(binb_sha1(rstr2binb(s),s.length*8)); } /* *CalculatetheHMAC-SHA1ofakeyandsomedata(rawstrings) */ functionrstr_hmac_sha1(key,data) { varbkey=rstr2binb(key); if(bkey.length>16)bkey=binb_sha1(bkey,key.length*8); varipad=Array(16),opad=Array(16); for(vari=0;i<16;i++) { ipad[i]=bkey[i]^0x36363636; opad[i]=bkey[i]^0x5C5C5C5C; } varhash=binb_sha1(ipad.concat(rstr2binb(data)),512+data.length*8); returnbinb2rstr(binb_sha1(opad.concat(hash),512+160)); } /* *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; varremainders=Array(); vari,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.Westopwhenthedividendiszero. *Allremaindersarestoredforlateruse. */ while(dividend.length>0) { 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[remainders.length]=x; dividend=quotient; } /*Converttheremainderstotheoutputstring*/ varoutput=""; for(i=remainders.length-1;i>=0;i--) output+=encoding.charAt(remainders[i]); /*Appendleadingzeroequivalents*/ varfull_length=Math.ceil(input.length*8/ (Math.log(encoding.length)/Math.log(2))) for(i=output.length;i<full_length;i++) output=encoding[0]+output; 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-1ofanarrayofbig-endianwords,andabitlength */ functionbinb_sha1(x,len) { /*appendpadding*/ x[len>>5]|=0x80<<(24-len%32); x[((len+64>>9)<<4)+15]=len; varw=Array(80); vara=1732584193; varb=-271733879; varc=-1732584194; vard=271733878; vare=-1009589776; for(vari=0;i<x.length;i+=16) { varolda=a; varoldb=b; varoldc=c; varoldd=d; varolde=e; for(varj=0;j<80;j++) { if(j<16)w[j]=x[i+j]; elsew[j]=bit_rol(w[j-3]^w[j-8]^w[j-14]^w[j-16],1); vart=safe_add(safe_add(bit_rol(a,5),sha1_ft(j,b,c,d)), safe_add(safe_add(e,w[j]),sha1_kt(j))); e=d; d=c; c=bit_rol(b,30); b=a; a=t; } a=safe_add(a,olda); b=safe_add(b,oldb); c=safe_add(c,oldc); d=safe_add(d,oldd); e=safe_add(e,olde); } returnArray(a,b,c,d,e); } /* *Performtheappropriatetripletcombinationfunctionforthecurrent *iteration */ functionsha1_ft(t,b,c,d) { if(t<20)return(b&c)|((~b)&d); if(t<40)returnb^c^d; if(t<60)return(b&c)|(b&d)|(c&d); returnb^c^d; } /* *Determinetheappropriateadditiveconstantforthecurrentiteration */ functionsha1_kt(t) { return(t<20)?1518500249:(t<40)?1859775393: (t<60)?-1894007588:-899497514; } /* *Addintegers,wrappingat2^32.Thisuses16-bitoperationsinternally *toworkaroundbugsinsomeJSinterpreters. */ functionsafe_add(x,y) { varlsw=(x&0xFFFF)+(y&0xFFFF); varmsw=(x>>16)+(y>>16)+(lsw>>16); return(msw<<16)|(lsw&0xFFFF); } /* *Bitwiserotatea32-bitnumbertotheleft. */ functionbit_rol(num,cnt) { return(num<<cnt)|(num>>>(32-cnt)); }
以上就是本文的全部内容,希望对大家有所帮助,希望大家继续关注毛票票的最新内容。