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程序设计有所帮助。