/*** SHA1类,主要包含encrypt,init,upData,doFinal函数
*@authorSnowolf
**/publicclassSHA1{privatefinalint[] abcde={0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0};//摘要数据存储数组privateint[] digestInt=newint[5];//计算过程中的临时数据存储数组privateint[] tmpData=newint[80];/*** f1是SHA1算法中的一系列函数中的一个,操作32位字x,y,z并且产生32位字作为输出
*@paramx 32位字
*@paramy 32位字
*@paramz 32位字
*@return运算结果*/privateintf1(intx,inty,intz) {return(x&y)|(~x&z);
}/*** f2是SHA1算法中的一系列函数中的一个,操作32位字x,y,z并且产生32位字作为输出
*@paramx 32位字
*@paramy 32位字
*@paramz 32位字
*@return运算结果*/privateintf2(intx,inty,intz) {returnx^y^z;
}/*** f3是SHA1算法中的一系列函数中的一个,操作32位字x,y,z并且产生32位字作为输出
*@paramx 32位字
*@paramy 32位字
*@paramz 32位字
*@return运算结果*/privateintf3(intx,inty,intz) {return(x&y)|(x&z)|(y&z);
}/*** f4是循环移位函数,将x进行循环移位,移位次数为y
*@paramx 要移位的字
*@paramy 移位次数
*@return运算结果*/privateintf4(intx,inty) {return(x<>>(32-y);
}/*** 单元摘要计算函数,函数运算完成后,最终结果储存在digestInt中
*@paramMessage_Block 为大小16个字的int型数组,即我们已经格式化完成的,要进行加密运算的数据
*@returnvoid
*@authorSnowolf*/privatevoidencrypt(int[] Message_Block) {for(intt=0; t<16; t++)
{
tmpData[t]=Message_Block[t];
}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[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
digestInt[i2]=digestInt[i2]+tmpabcde[i2];//摘要存储在digestInt}for(intn=0; n
tmpData[n]=0;
}
}/*** 初始化函数,将digestInt值初始化为SHA1算法中的原始初值*/publicvoidinit(){
System.arraycopy(abcde,0, digestInt,0, abcde.length);
}/**SHA1加密运算,其中updata返回值为void,此时digestInt中的数据为计算结果(摘要)
*为16个字的int型数组,即我们已经格式化完成的数据
*@paramMessage_Block 为大小16个字的int型数组,即我们已经格式化完成的,要进行加密运算的数据
*@authorSnowolf*/publicvoidupData(int[] Message_Block){
encrypt(Message_Block);
}/*** SHA1加密运算,返回值为int[],即返回计算出来的摘要
*@paramMessage_Block 为大小16个字的int型数组,即我们已经格式化完成的,要进行加密运算的数据
*@returnint[5]摘要
*@authorSnowolf*/publicint[] doFinal(int[] Message_Block){int[] doFinalInt=newint[5];
encrypt(Message_Block);
System.arraycopy(digestInt,0, doFinalInt,0, digestInt.length);returndoFinalInt;
}
}