Java实现SHA-1算法实例
本文实例讲述了Java实现SHA-1算法的方法。分享给大家供大家参考。具体实现方法如下:
publicclassSHA1Util{ privatestaticfinalbooleanhexcase=false; privatestaticfinalStringb64pad="="; privatestaticfinalintchrsz=8; //得到字符串SHA-1值的方法 publicstaticStringhex_sha1(Strings){ s=(s==null)?"":s; returnbinb2hex(core_sha1(str2binb(s),s.length()*chrsz)); } publicstaticStringb64_hmac_sha1(Stringkey,Stringdata){ returnbinb2b64(core_hmac_sha1(key,data)); } publicstaticStringb64_sha1(Strings){ s=(s==null)?"":s; returnbinb2b64(core_sha1(str2binb(s),s.length()*chrsz)); } privatestaticStringbinb2b64(int[]binarray){ Stringtab="abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/"; Stringstr=""; binarray=strechbinarray(binarray,binarray.length*4); for(inti=0;i<binarray.length*4;i+=3){ inttriplet=(((binarray[i>>2]>>8*(3-i%4))&0xff)<<16) |(((binarray[i+1>>2]>>8*(3-(i+1)%4))&0xff)<<8) |((binarray[i+2>>2]>>8*(3-(i+2)%4))&0xff); for(intj=0;j<4;j++){ if(i*8+j*6>binarray.length*32){ str+=b64pad; }else{ str+=tab.charAt((triplet>>6*(3-j))&0x3f); } } } returncleanb64str(str); } privatestaticStringbinb2hex(int[]binarray){ Stringhex_tab=hexcase?"0123456789abcdef":"0123456789abcdef"; Stringstr=""; for(inti=0;i<binarray.length*4;i++){ chara=(char)hex_tab.charAt((binarray[i>>2]>>((3-i%4)*8+4))&0xf); charb=(char)hex_tab.charAt((binarray[i>>2]>>((3-i%4)*8))&0xf); str+=(newCharacter(a).toString()+newCharacter(b).toString()); } returnstr; } privatestaticStringbinb2str(int[]bin){ Stringstr=""; intmask=(1<<chrsz)-1; for(inti=0;i<bin.length*32;i+=chrsz){ str+=(char)((bin[i>>5]>>>(24-i%32))&mask); } returnstr; } privatestaticintbit_rol(intnum,intcnt){ return(num<<cnt)|(num>>>(32-cnt)); } privatestaticStringcleanb64str(Stringstr){ str=(str==null)?"":str; intlen=str.length(); if(len<=1){ returnstr; } chartrailchar=str.charAt(len-1); Stringtrailstr=""; for(inti=len-1;i>=0&&str.charAt(i)==trailchar;i--){ trailstr+=str.charAt(i); } returnstr.substring(0,str.indexOf(trailstr)); } privatestaticint[]complete216(int[]oldbin){ if(oldbin.length>=16){ returnoldbin; } int[]newbin=newint[16-oldbin.length]; for(inti=0;i<newbin.length;newbin[i]=0,i++) ; returnconcat(oldbin,newbin); } privatestaticint[]concat(int[]oldbin,int[]newbin){ int[]retval=newint[oldbin.length+newbin.length]; for(inti=0;i<(oldbin.length+newbin.length);i++){ if(i<oldbin.length){ retval[i]=oldbin[i]; }else{ retval[i]=newbin[i-oldbin.length]; } } returnretval; } privatestaticint[]core_hmac_sha1(Stringkey,Stringdata){ key=(key==null)?"":key; data=(data==null)?"":data; int[]bkey=complete216(str2binb(key)); if(bkey.length>16){ bkey=core_sha1(bkey,key.length()*chrsz); } int[]ipad=newint[16]; int[]opad=newint[16]; for(inti=0;i<16;ipad[i]=0,opad[i]=0,i++) ; for(inti=0;i<16;i++){ ipad[i]=bkey[i]^0x36363636; opad[i]=bkey[i]^0x5c5c5c5c; } int[]hash=core_sha1(concat(ipad,str2binb(data)),512+data.length()*chrsz); returncore_sha1(concat(opad,hash),512+160); } privatestaticint[]core_sha1(int[]x,intlen){ intsize=(len>>5); x=strechbinarray(x,size); x[len>>5]|=0x80<<(24-len%32); size=((len+64>>9)<<4)+15; x=strechbinarray(x,size); x[((len+64>>9)<<4)+15]=len; int[]w=newint[80]; inta=1732584193; intb=-271733879; intc=-1732584194; intd=271733878; inte=-1009589776; for(inti=0;i<x.length;i+=16){ intolda=a; intoldb=b; intoldc=c; intoldd=d; intolde=e; for(intj=0;j<80;j++){ 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); } intt=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); } int[]retval=newint[5]; retval[0]=a; retval[1]=b; retval[2]=c; retval[3]=d; retval[4]=e; returnretval; } privatestaticvoiddotest(){ Stringkey="key"; Stringdata="data"; System.out.println("hex_sha1("+data+")="+hex_sha1(data)); System.out.println("b64_sha1("+data+")="+b64_sha1(data)); System.out.println("str_sha1("+data+")="+str_sha1(data)); System.out.println("hex_hmac_sha1("+key+","+data+")="+hex_hmac_sha1(key,data)); System.out.println("b64_hmac_sha1("+key+","+data+")="+b64_hmac_sha1(key,data)); System.out.println("str_hmac_sha1("+key+","+data+")="+str_hmac_sha1(key,data)); } publicstaticStringhex_hmac_sha1(Stringkey,Stringdata){ returnbinb2hex(core_hmac_sha1(key,data)); } privatestaticintrol(intnum,intcnt){ return(num<<cnt)|(num>>>(32-cnt)); } privatestaticintsafe_add(intx,inty){ intlsw=(int)(x&0xffff)+(int)(y&0xffff); intmsw=(x>>16)+(y>>16)+(lsw>>16); return(msw<<16)|(lsw&0xffff); } privatestaticintsha1_ft(intt,intb,intc,intd){ 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; } privatestaticintsha1_kt(intt){ return(t<20)?1518500249:(t<40)?1859775393:(t<60)?-1894007588:-899497514; } privatestaticbooleansha1_vm_test(){ returnhexcase?hex_sha1("abc").equals("a9993e364706816aba3e25717850c26c9cd0d89d"):hex_sha1("abc").equals( "a9993e364706816aba3e25717850c26c9cd0d89d"); } publicstaticStringstr_hmac_sha1(Stringkey,Stringdata){ returnbinb2str(core_hmac_sha1(key,data)); } publicstaticStringstr_sha1(Strings){ s=(s==null)?"":s; returnbinb2str(core_sha1(str2binb(s),s.length()*chrsz)); } privatestaticint[]str2binb(Stringstr){ str=(str==null)?"":str; int[]tmp=newint[str.length()*chrsz]; intmask=(1<<chrsz)-1; for(inti=0;i<str.length()*chrsz;i+=chrsz){ tmp[i>>5]|=((int)(str.charAt(i/chrsz))&mask)<<(24-i%32); } intlen=0; for(inti=0;i<tmp.length&&tmp[i]!=0;i++,len++) ; int[]bin=newint[len]; for(inti=0;i<len;i++){ bin[i]=tmp[i]; } returnbin; } privatestaticint[]strechbinarray(int[]oldbin,intsize){ intcurrlen=oldbin.length; if(currlen>=size+1){ returnoldbin; } int[]newbin=newint[size+1]; for(inti=0;i<size;newbin[i]=0,i++) ; for(inti=0;i<currlen;i++){ newbin[i]=oldbin[i]; } returnnewbin; } publicstaticvoidmain(Stringargs[]){ System.out.println("admin的SHA1的值为:"+hex_sha1("admin")+",length="+hex_sha1("admin").length()); } }
希望本文所述对大家的java程序设计有所帮助。