问题描述
publicclassSHA1{privatefinalint[]abcde={0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0};//摘要数据存储数组privateint[]digestInt=newint[5];//计算过程中的临时数据存储数组privateint[]tmpData=newint[80];//计算sha-1摘要privateintprocess_input_bytes(byte[]bytedata){//初试化常量System.arraycopy(abcde,0,digestInt,0,abcde.length);//格式化输入字节数组,补10及长度数据byte[]newbyte=byteArrayFormatData(bytedata);//获取数据摘要计算的数据单元个数intMCount=newbyte.length/64;//循环对每个数据单元进行摘要计算for(intpos=0;pos<MCount;pos++){//将每个单元的数据转换成16个整型数据,并保存到tmpData的前16个数组元素中for(intj=0;j<16;j++){tmpData[j]=byteArrayToInt(newbyte,(pos*64)+(j*4));}//摘要计算函数encrypt();}return20;}//格式化输入字节数组格式privatebyte[]byteArrayFormatData(byte[]bytedata){//补0数量intzeros=0;//补位后总位数intsize=0;//原始数据长度intn=bytedata.length;//模64后的剩余位数intm=n%64;//计算添加0的个数以及添加10后的总长度if(m<56){zeros=55-m;size=n-m+64;}elseif(m==56){zeros=63;size=n+8+64;}else{zeros=63-m+56;size=(n+64)-m+64;}//补位后生成的新数组内容byte[]newbyte=newbyte[size];//复制数组的前面部分System.arraycopy(bytedata,0,newbyte,0,n);//获得数组Append数据元素的位置intl=n;//补1操作newbyte[l++]=(byte)0x80;//补0操作for(inti=0;i<zeros;i++){newbyte[l++]=(byte)0x00;}//计算数据长度,补数据长度位共8字节,长整型longN=(long)n*8;byteh8=(byte)(N&0xFF);byteh7=(byte)((N>>8)&0xFF);byteh6=(byte)((N>>16)&0xFF);byteh5=(byte)((N>>24)&0xFF);byteh4=(byte)((N>>32)&0xFF);byteh3=(byte)((N>>40)&0xFF);byteh2=(byte)((N>>48)&0xFF);byteh1=(byte)(N>>56);newbyte[l++]=h1;newbyte[l++]=h2;newbyte[l++]=h3;newbyte[l++]=h4;newbyte[l++]=h5;newbyte[l++]=h6;newbyte[l++]=h7;newbyte[l++]=h8;returnnewbyte;}privateintf1(intx,inty,intz){return(x&y)|(~x&z);}privateintf2(intx,inty,intz){returnx^y^z;}privateintf3(intx,inty,intz){return(x&y)|(x&z)|(y&z);}privateintf4(intx,inty){return(x<<y)|x>>>(32-y);}//单元摘要计算函数privatevoidencrypt(){for(inti=16;i<=79;i++){tmpData[i]=f4(tmpData[i-3]^tmpData[i-8]^tmpData[i-14]^tmpData[i-16],1);}int[]tmpabcde=newint[5];for(inti1=0;i1<tmpabcde.length;i1++){tmpabcde[i1]=digestInt[i1];}for(intj=0;j<=19;j++){inttmp=f4(tmpabcde[0],5)+f1(tmpabcde[1],tmpabcde[2],tmpabcde[3])+tmpabcde[4]+tmpData[j]+0x5a827999;tmpabcde[4]=tmpabcde[3];tmpabcde[3]=tmpabcde[2];tmpabcde[2]=f4(tmpabcde[1],30);tmpabcde[1]=tmpabcde[0];tmpabcde[0]=tmp;}for(intk=20;k<=39;k++){inttmp=f4(tmpabcde[0],5)+f2(tmpabcde[1],tmpabcde[2],tmpabcde[3])+tmpabcde[4]+tmpData[k]+0x6ed9eba1;tmpabcde[4]=tmpabcde[3];tmpabcde[3]=tmpabcde[2];tmpabcde[2]=f4(tmpabcde[1],30);tmpabcde[1]=tmpabcde[0];tmpabcde[0]=tmp;}for(intl=40;l<=59;l++){inttmp=f4(tmpabcde[0],5)+f3(tmpabcde[1],tmpabcde[2],tmpabcde[3])+tmpabcde[4]+tmpData[l]+0x8f1bbcdc;tmpabcde[4]=tmpabcde[3];tmpabcde[3]=tmpabcde[2];tmpabcde[2]=f4(tmpabcde[1],30);tmpabcde[1]=tmpabcde[0];tmpabcde[0]=tmp;}for(intm=60;m<=79;m++){inttmp=f4(tmpabcde[0],5)+f2(tmpabcde[1],tmpabcde[2],tmpabcde[3])+tmpabcde[4]+tmpData[m]+0xca62c1d6;tmpabcde[4]=tmpabcde[3];tmpabcde[3]=tmpabcde[2];tmpabcde[2]=f4(tmpabcde[1],30);tmpabcde[1]=tmpabcde[0];tmpabcde[0]=tmp;}for(inti2=0;i2<tmpabcde.length;i2++){digestInt[i2]=digestInt[i2]+tmpabcde[i2];}for(intn=0;n<tmpData.length;n++){tmpData[n]=0;}}//4字节数组转换为整数privateintbyteArrayToInt(byte[]bytedata,inti){return((bytedata[i]&0xff)<<24)|((bytedata[i+1]&0xff)<<16)|((bytedata[i+2]&0xff)<<8)|(bytedata[i+3]&0xff);}//整数转换为4字节数组privatevoidintToByteArray(intintValue,byte[]byteData,inti){byteData[i]=(byte)(intValue>>>24);byteData[i+1]=(byte)(intValue>>>16);byteData[i+2]=(byte)(intValue>>>8);byteData[i+3]=(byte)intValue;}//将字节转换为十六进制字符串privatestaticStringbyteToHexString(byteib){char[]Digit={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};char[]ob=newchar[2];ob[0]=Digit[(ib>>>4)&0X0F];ob[1]=Digit[ib&0X0F];Strings=newString(ob);returns;}//将字节数组转换为十六进制字符串privatestaticStringbyteArrayToHexString(byte[]bytearray){StringstrDigest="";for(inti=0;i<bytearray.length;i++){strDigest+=byteToHexString(bytearray[i]);}returnstrDigest;}//计算sha-1摘要,返回相应的字节数组publicbyte[]getDigestOfBytes(byte[]byteData){process_input_bytes(byteData);byte[]digest=newbyte[20];for(inti=0;i<digestInt.length;i++){intToByteArray(digestInt[i],digest,i*4);}returndigest;}//计算sha-1摘要,返回相应的十六进制字符串publicStringgetDigestOfString(byte[]byteData){returnbyteArrayToHexString(getDigestOfBytes(byteData));}publicstaticvoidmain(String[]args){Stringdata1="12345678901234567890";byte[]data=Tool.hexStringToBytes(data1);System.out.println(data);Stringdigest=newSHA1().getDigestOfString(data);System.out.println(digest);}publicclassHMACSHA1{publicstaticbyte[]getHmacSHA1(Stringdata,Stringkey){byte[]ipadArray=newbyte[64];byte[]opadArray=newbyte[64];byte[]keyArray=newbyte[64];intex=key.length();SHA1sha1=newSHA1();if(key.length()>64){byte[]temp=sha1.getDigestOfBytes(key.getBytes());ex=temp.length;for(inti=0;i<ex;i++){keyArray[i]=temp[i];}}else{byte[]temp=key.getBytes();for(inti=0;i<temp.length;i++){keyArray[i]=temp[i];}}for(inti=ex;i<64;i++){keyArray[i]=0;}for(intj=0;j<64;j++){ipadArray[j]=(byte)(keyArray[j]^0x36);opadArray[j]=(byte)(keyArray[j]^0x5C);}byte[]tempResult=sha1.getDigestOfBytes(join(ipadArray,data.getBytes()));//tempResult=sha1.getDigestOfBytes(join(ipadArray,tempResult));returnsha1.getDigestOfBytes(join(opadArray,tempResult));}privatestaticbyte[]join(byte[]b1,byte[]b2){intlength=b1.length+b2.length;byte[]newer=newbyte[length];for(inti=0;i<b1.length;i++){newer[i]=b1[i];}for(inti=0;i<b2.length;i++){newer[i+b1.length]=b2[i];}returnnewer;}publicstaticvoidmain(String[]args){HMACSHA1hMacSha1=newHMACSHA1();Stringdata="123456";Stringkey="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";byte[]ab=hMacSha1.getHmacSHA1(data,key);Stringa=Tool.bytesToHexString(ab);a=a.toUpperCase();System.out.println("HMacSha1=================="+a);}}sha1值为:AE4659D724E6CA2EAB552C3AAF662805552C8C6EC++计算key="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";data="123456"sha1="40C84ADE47F4DEFCA8EA74E6CADD7F4BF3D3C3DB"
解决方案
本帖最后由 wangqinglin_12 于 2010-12-09 17:32:30 编辑
解决方案二:
如果实现算法一样的饿,结果也是一样。