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));
}
以上就是本文的全部内容,希望对大家有所帮助,希望大家继续关注毛票票的最新内容。