写一个java加密程序

2022-04-03 科技 51阅读

publicclassSsytemSha1{
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//将每个单元的数据转换成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;inewbyte[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<>>(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;i1tmpabcde[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;i2digestInt[i2]=digestInt[i2]+tmpabcde[i2];
}
for(intn=0;ntmpData[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;istrDigest+=byteToHexString(bytearray[i]);
}
returnstrDigest;
}
//计算sha-1摘要,返回相应的字节数组
publicbyte[]getDigestOfBytes(byte[]byteData){
process_input_bytes(byteData);
byte[]digest=newbyte[20];
for(inti=0;iintToByteArray(digestInt[i],digest,i*4);
}
returndigest;
}
//计算sha-1摘要,返回相应的十六进制字符串
publicStringgetDigestOfString(byte[]byteData){
returnbyteArrayToHexString(getDigestOfBytes(byteData));
}
publicstaticvoidmain(String[]args){//测试通过
Stringdata="123";
Stringdigest=newSsytemSha1().getDigestOfString(data.getBytes());
}

}
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com