在JSP中如何实现MD5加密.docx
- 文档编号:10073034
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:13
- 大小:19.49KB
在JSP中如何实现MD5加密.docx
《在JSP中如何实现MD5加密.docx》由会员分享,可在线阅读,更多相关《在JSP中如何实现MD5加密.docx(13页珍藏版)》请在冰点文库上搜索。
在JSP中如何实现MD5加密
在JSP中如何实现MD5加密
源码
/**
*类名:
MD5Digest
*说明:
用来进行密码加密的md5公用参数
*编写日期:
2001/03/05
*修改者:
*修改信息:
*@authoredgarloedgarlo@
*@version1.0
*/
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
publicclassMD5Digest
{
privateMessageDigest__md5=null;
privateStringBuffer__digestBuffer=null;
publicMD5Digest()
throwsNoSuchAlgorithmException
{
__md5=MessageDigest.getInstance("MD5");
__digestBuffer=newStringBuffer();
}
publicStringmd5crypt(Strings)
{
__digestBuffer.setLength(0);
byteabyte0[]=__md5.digest(s.getBytes());
for(inti=0;i __digestBuffer.append(toHex(abyte0[i])); return__digestBuffer.toString(); } publicStringtoHex(byteone){ StringHEX="0123456789ABCDEF"; char[]result=newchar[2]; result[0]=HEX.charAt((one&0xf0)>>4); result[1]=HEX.charAt(one&0x0f); Stringmm=newString(result); returnmm; } } -------------------------------------------------------------------------------- /************************************************ MD5算法的JavaBean @author: TopcatTuppin LastModified: 10,Mar,2001 *************************************************/ packagebeartool; importjava.lang.reflect.*; /************************************************* md5类实现了RSADataSecurity,Inc.在提交给IETF 的RFC1321中的MD5message-digest算法。 *************************************************/ publicclassMD5{ /*下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define实现的, 这里把它们实现成为staticfinal是表示了只读,切能在同一个进程空间内的多个 Instance间共享*/ staticfinalintS11=7; staticfinalintS12=12; staticfinalintS13=17; staticfinalintS14=22; staticfinalintS21=5; staticfinalintS22=9; staticfinalintS23=14; staticfinalintS24=20; staticfinalintS31=4; staticfinalintS32=11; staticfinalintS33=16; staticfinalintS34=23; staticfinalintS41=6; staticfinalintS42=10; staticfinalintS43=15; staticfinalintS44=21; staticfinalbyte[]PADDING={-128,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /*下面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现中 被定义到MD5_CTX结构中 */ privatelong[]state=newlong[4];//state(ABCD) privatelong[]count=newlong[2];//numberofbits,modulo2^64(lsbfirst) privatebyte[]buffer=newbyte[64];//inputbuffer /*digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的 16进制ASCII表示. */ publicStringdigestHexStr; /*digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值. */ privatebyte[]digest=newbyte[16]; /* getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串 返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的. */ publicStringgetMD5ofStr(Stringinbuf){ md5Init(); md5Update(inbuf.getBytes(),inbuf.length()); md5Final(); digestHexStr=""; for(inti=0;i<16;i++){ digestHexStr+=byteHEX(digest[i]); } returndigestHexStr; } //这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数 publicMD5(){ md5Init(); return; } /*md5Init是一个初始化函数,初始化核心变量,装入标准的幻数*/ privatevoidmd5Init(){ count[0]=0L; count[1]=0L; ///*Loadmagicinitializationconstants. state[0]=0x67452301L; state[1]=0xefcdab89L; state[2]=0x98badcfeL; state[3]=0x10325476L; return; } /*F,G,H,I是4个基本的MD5函数,在原始的MD5的C实现中,由于它们是 简单的位运算,可能出于效率的考虑把它们实现成了宏,在java中,我们把它们 实现成了private方法,名字保持了原来C中的。 */ privatelongF(longx,longy,longz){ return(x&y)|((~x)&z); } privatelongG(longx,longy,longz){ return(x&z)|(y&(~z)); } privatelongH(longx,longy,longz){ returnx^y^z; } privatelongI(longx,longy,longz){ returny^(x|(~z)); } /* FF,GG,HH和II将调用F,G,H,I进行近一步变换 FF,GG,HH,andIItransformationsforrounds1,2,3,and4. Rotationisseparatefromadditiontopreventrecomputation. */ privatelongFF(longa,longb,longc,longd,longx,longs, longac){ a+=F(b,c,d)+x+ac; a=((int)a< a+=b; returna; } privatelongGG(longa,longb,longc,longd,longx,longs, longac){ a+=G(b,c,d)+x+ac; a=((int)a< a+=b; returna; } privatelongHH(longa,longb,longc,longd,longx,longs, longac){ a+=H(b,c,d)+x+ac; a=((int)a< a+=b; returna; } privatelongII(longa,longb,longc,longd,longx,longs, longac){ a+=I(b,c,d)+x+ac; a=((int)a< a+=b; returna; } /* md5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个 函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private的 */ privatevoidmd5Update(byte[]inbuf,intinputLen){ inti,index,partLen; byte[]block=newbyte[64]; index=(int)(count[0]>>>3)&0x3F; ///*Updatenumberofbits*/ if((count[0]+=(inputLen<<3))<(inputLen<<3)) count[1]++; count[1]+=(inputLen>>>29); partLen=64-index; //Transformasmanytimesaspossible. if(inputLen>=partLen){ md5Memcpy(buffer,inbuf,index,0,partLen); md5Transform(buffer); for(i=partLen;i+63 md5Memcpy(block,inbuf,0,i,64); md5Transform(block); } index=0; }else i=0; ///*Bufferremaininginput*/ md5Memcpy(buffer,inbuf,index,i,inputLen-i); } /* md5Final整理和填写输出结果 */ privatevoidmd5Final(){ byte[]bits=newbyte[8]; intindex,padLen; ///*Savenumberofbits*/ Encode(bits,count,8); ///*Padoutto56mod64. index=(int)(count[0]>>>3)&0x3f; padLen=(index<56)? (56-index): (120-index); md5Update(PADDING,padLen); ///*Appendlength(beforepadding)*/ md5Update(bits,8); ///*Storestateindigest*/ Encode(digest,state,16); } /*md5Memcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的 字节拷贝到output的outpos位置开始 */ privatevoidmd5Memcpy(byte[]output,byte[]input, intoutpos,intinpos,intlen) { inti; for(i=0;i output[outpos+i]=input[inpos+i]; } /* md5Transform是MD5核心变换程序,有md5Update调用,block是分块的原始字节 */ privatevoidmd5Transform(byteblock[]){ longa=state[0],b=state[1],c=state[2],d=state[3]; long[]x=newlong[16]; Decode(x,block,64); /*Round1*/ a=FF(a,b,c,d,x[0],S11,0xd76aa478L);/*1*/ d=FF(d,a,b,c,x[1],S12,0xe8c7b756L);/*2*/ c=FF(c,d,a,b,x[2],S13,0x242070dbL);/*3*/ b=FF(b,c,d,a,x[3],S14,0xc1bdceeeL);/*4*/ a=FF(a,b,c,d,x[4],S11,0xf57c0fafL);/*5*/ d=FF(d,a,b,c,x[5],S12,0x4787c62aL);/*6*/ c=FF(c,d,a,b,x[6],S13,0xa8304613L);/*7*/ b=FF(b,c,d,a,x[7],S14,0xfd469501L);/*8*/ a=FF(a,b,c,d,x[8],S11,0x698098d8L);/*9*/ d=FF(d,a,b,c,x[9],S12,0x8b44f7afL);/*10*/ c=FF(c,d,a,b,x[10],S13,0xffff5bb1L);/*11*/ b=FF(b,c,d,a,x[11],S14,0x895cd7beL);/*12*/ a=FF(a,b,c,d,x[12],S11,0x6b901122L);/*13*/ d=FF(d,a,b,c,x[13],S12,0xfd987193L);/*14*/ c=FF(c,d,a,b,x[14],S13,0xa679438eL);/*15*/ b=FF(b,c,d,a,x[15],S14,0x49b40821L);/*16*/ /*Round2*/ a=GG(a,b,c,d,x[1],S21,0xf61e2562L);/*17*/ d=GG(d,a,b,c,x[6],S22,0xc040b340L);/*18*/ c=GG(c,d,a,b,x[11],S23,0x265e5a51L);/*19*/ b=GG(b,c,d,a,x[0],S24,0xe9b6c7aaL);/*20*/ a=GG(a,b,c,d,x[5],S21,0xd62f105dL);/*21*/ d=GG(d,a,b,c,x[10],S22,0x2441453L);/*22*/ c=GG(c,d,a,b,x[15],S23,0xd8a1e681L);/*23*/ b=GG(b,c,d,a,x[4],S24,0xe7d3fbc8L);/*24*/ a=GG(a,b,c,d,x[9],S21,0x21e1cde6L);/*25*/ d=GG(d,a,b,c,x[14],S22,0xc33707d6L);/*26*/ c=GG(c,d,a,b,x[3],S23,0xf4d50d87L);/*27*/ b=GG(b,c,d,a,x[8],S24,0x455a14edL);/*28*/ a=GG(a,b,c,d,x[13],S21,0xa9e3e905L);/*29*/ d=GG(d,a,b,c,x[2],S22,0xfcefa3f8L);/*30*/ c=GG(c,d,a,b,x[7],S23,0x676f02d9L);/*31*/ b=GG(b,c,d,a,x[12],S24,0x8d2a4c8aL);/*32*/ /*Round3*/ a=HH(a,b,c,d,x[5],S31,0xfffa3942L);/*33*/ d=HH(d,a,b,c,x[8],S32,0x8771f681L);/*34*/ c=HH(c,d,a,b,x[11],S33,0x6d9d6122L);/*35*/ b=HH(b,c,d,a,x[14],S34,0xfde5380cL);/*36*/ a=HH(a,b,c,d,x[1],S31,0xa4beea44L);/*37*/ d=HH(d,a,b,c,x[4],S32,0x4bdecfa9L);/*38*/ c=HH(c,d,a,b,x[7],S33,0xf6bb4b60L);/*39*/ b=HH(b,c,d,a,x[10],S34,0xbebfbc70L);/*40*/ a=HH(a,b,c,d,x[13],S31,0x289b7ec6L);/*41*/ d=HH(d,a,b,c,x[0],S32,0xeaa127faL);/*42*/ c=HH(c,d,a,b,x[3],S33,0xd4ef3085L);/*43*/ b=HH(b,c,d,a,x[6],S34,0x4881d05L);/*44*/ a=HH(a,b,c,d,x[9],S31,0xd9d4d039L);/*45*/ d=HH(d,a,b,c,x[12],S32,0xe6db99e5L);/*46*/ c=HH(c,d,a,b,x[15],S33,0x1fa27cf8L);/*47*/ b=HH(b,c,d,a,x[2],S34,0xc4ac5665L);/*48*/ /*Round4*/ a=II(a,b,c,d,x[0],S41,0xf4292244L);/*49*/ d=II(d,a,b,c,x[7],S42,0x432aff97L);/*50*/ c=II(c,d,a,b,x[14],S43,0xab9423a7L);/*51*/ b=II(b,c,d,a,x[5],S44,0xfc93a039L);/*52*/ a=II(a,b,c,d,x[12],S41,0x655b59c3L);/*53*/ d=II(d,a,b,c,x[3],S42,0x8f0ccc92L);/*54*/ c=II(c,d,a,b,x[10],S43,0xffeff47dL);/*55*/ b>>(32-s));>>(32-s));>>(32-s));>>(32-s));
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JSP 如何 实现 MD5 加密