JavaScript实现SHA-1加密算法的方法
本文实例讲述了JavaScript实现SHA-1加密算法的方法。分享给大家供大家参考。具体实现方法如下:
调用方法:hex_sha1即可。
/*
*
*AJavaScriptimplementationoftheSecureHashAlgorithm,SHA-1,asdefined
*inFIPSPUB180-1
*
*Bylizq
*
*2006-11-11
*
*/
/*
*
*Configurablevariables.
*
*/
varhexcase=0;/*hexoutputformat.0-lowercase;1-uppercase*/
varchrsz=8;/*bitsperinputcharacter.8-ASCII;16-Unicode*/
/*
*
*Themainfunctiontocalculatemessagedigest
*
*/
functionhex_sha1(s){
returnbinb2hex(core_sha1(AlignSHA1(s)));
}
/*
*
*Performasimpleself-testtoseeiftheVMisworking
*
*/
functionsha1_vm_test(){
returnhex_sha1("abc")=="a9993e364706816aba3e25717850c26c9cd0d89d";
}
/*
*
*CalculatetheSHA-1ofanarrayofbig-endianwords,andabitlength
*
*/
functioncore_sha1(blockArray){
varx=blockArray;//appendpadding
varw=Array(80);
vara=1732584193;
varb=-271733879;
varc=-1732584194;
vard=271733878;
vare=-1009589776;
for(vari=0;i<x.length;i+=16)//每次处理512位16*32
{
varolda=a;
varoldb=b;
varoldc=c;
varoldd=d;
varolde=e;
for(varj=0;j<80;j++)//对每个512位进行80步操作
{
if(j<16)
w[j]=x[i+j];
else
w[j]=rol(w[j-3]^w[j-8]^w[j-14]^w[j-16],1);
vart=safe_add(safe_add(rol(a,5),sha1_ft(j,b,c,d)),safe_add(safe_add(e,w[j]),sha1_kt(j)));
e=d;
d=c;
c=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);
}
returnnewArray(a,b,c,d,e);
}
/*
*
*Performtheappropriatetripletcombinationfunctionforthecurrent
*iteration
*
*返回对应F函数的值
*
*/
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;//t<80
}
/*
*
*Determinetheappropriateadditiveconstantforthecurrentiteration
*
*返回对应的Kt值
*
*/
functionsha1_kt(t){
return(t<20)?1518500249:(t<40)?1859775393:(t<60)?-1894007588:-899497514;
}
/*
*
*Addintegers,wrappingat2^32.Thisuses16-bitoperationsinternally
*
*toworkaroundbugsinsomeJSinterpreters.
*
*将32位数拆成高16位和低16位分别进行相加,从而实现MOD2^32的加法
*
*/
functionsafe_add(x,y){
varlsw=(x&0xFFFF)+(y&0xFFFF);
varmsw=(x>>16)+(y>>16)+(lsw>>16);
return(msw<<16)|(lsw&0xFFFF);
}
/*
*
*Bitwiserotatea32-bitnumbertotheleft.
*
*32位二进制数循环左移
*
*/
functionrol(num,cnt){
return(num<<cnt)|(num>>>(32-cnt));
}
/*
*
*ThestandardSHA1needstheinputstringtofitintoablock
*
*Thisfunctionaligntheinputstringtomeettherequirement
*
*/
functionAlignSHA1(str){
varnblk=((str.length+8)>>6)+1,blks=newArray(nblk*16);
for(vari=0;i<nblk*16;i++)
blks[i]=0;
for(i=0;i<str.length;i++)
blks[i>>2]|=str.charCodeAt(i)<<(24-(i&3)*8);
blks[i>>2]|=0x80<<(24-(i&3)*8);
blks[nblk*16-1]=str.length*8;
returnblks;
}
/*
*
*Convertanarrayofbig-endianwordstoahexstring.
*
*/
functionbinb2hex(binarray){
varhex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";
varstr="";
for(vari=0;i<binarray.length*4;i++){
str+=hex_tab.charAt((binarray[i>>2]>>((3-i%4)*8+4))&0xF)+
hex_tab.charAt((binarray[i>>2]>>((3-i%4)*8))&0xF);
}
returnstr;
}
/*
*
*calculateMessageDigestaccordtosourcemessagethatinputted
*
*/
functioncalcDigest(){
vardigestM=hex_sha1(document.SHAForm.SourceMessage.value);
document.SHAForm.MessageDigest.value=digestM;
}
希望本文所述对大家的javascript程序设计有所帮助。