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