java sha-1_SHA-1的Java实现 及在otp中的使用

/*** 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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值