生成MD5编码

MD5算法说明


<!-- 正文begin --> 1、MD5算法是对输入的数据进行补位,使得如果数据位长度LEN对512求余的结果是448。即数据扩展至K*512+448位。即K*64+56个字节,K为整数。具体补位操作:补一个1,然后补0至满足上述要求

2、补数据长度:用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。这时,数据就被填补成长度为512位的倍数。

3.初始化MD5参数:四个32位整数(A,B,C,D)用来计算信息摘要,初始化使用的是十六进制表示的数字

A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
4、处理位操作函数
X,Y,Z为32位整数。
F(X,Y,Z)=X&Y|NOT(X)&Z
G(X,Y,Z)=X&Z|Y?(Z)
H(X,Y,Z)=XxorYxorZ
I(X,Y,Z)=Yxor(X|not(Z))
5、主要变换过程:使用常数组T[1...64],T[i]为32位整数用16进制表示,数据用16个32位的整数数组M[]表示。

具体过程如下:
/*处理数据原文*/
Fori=0toN/16-1do
/*每一次,把数据原文存放在16个元素的数组X中.*/
Forj=0to15do
SetX[j]toM[i*16+j].
end/结束对J的循环
/*SaveAasAA,BasBB,CasCC,andDasDD.*/
AA=A
BB=B
CC=C
DD=D
/*第1轮*/
/*以[abcdksi]表示如下操作
a=b+((a+F(b,c,d)+X[k]+T[i])<<<s).*/
/*Dothefollowing16operations.*/
[ABCD071][DABC1122][CDAB2173][BCDA3224]
[ABCD475][DABC5126][CDAB6177][BCDA7228]
[ABCD879][DABC91210][CDAB101711][BCDA112212]
[ABCD12713][DABC131214][CDAB141715][BCDA152216]
/*第2轮**/
/*以[abcdksi]表示如下操作
a=b+((a+G(b,c,d)+X[k]+T[i])<<<s).*/
/*Dothefollowing16operations.*/
[ABCD1517][DABC6918][CDAB111419][BCDA02020]
[ABCD5521][DABC10922][CDAB151423][BCDA42024]
[ABCD9525][DABC14926][CDAB31427][BCDA82028]
[ABCD13529][DABC2930][CDAB71431][BCDA122032]
/*第3轮*/
/*以[abcdksi]表示如下操作
a=b+((a+H(b,c,d)+X[k]+T[i])<<<s).*/
/*Dothefollowing16operations.*/
[ABCD5433][DABC81134][CDAB111635][BCDA142336]
[ABCD1437][DABC41138][CDAB71639][BCDA102340]
[ABCD13441][DABC01142][CDAB31643][BCDA62344]
[ABCD9445][DABC121146][CDAB151647][BCDA22348]
/*第4轮*/
/*以[abcdksi]表示如下操作
a=b+((a+I(b,c,d)+X[k]+T[i])<<<s).*/
/*Dothefollowing16operations.*/
[ABCD0649][DABC71050][CDAB141551][BCDA52152]
[ABCD12653][DABC31054][CDAB101555][BCDA12156]
[ABCD8657][DABC151058][CDAB61559][BCDA132160]
[ABCD4661][DABC111062][CDAB21563][BCDA92164]
/*然后进行如下操作*/
A=A+AA
B=B+BB
C=C+CC
D=D+DD
end/*结束对I的循环*/
6、输出结果。

/* * MD5.java * * Created on 2008年10月20日, 上午10:11 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.log4j.Logger; /** * * @author fengye */ public class MD5 { /** Creates a new instance of MD5 */ public MD5() { } static Logger logger = Logger.getLogger(MD5.class.getName()); public static String getMD5(String source) { if(source == null) return null; byte[] ss = source.getBytes(); String s = null; char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; MessageDigest md; try { md = MessageDigest.getInstance("MD5"); md.update(ss); byte[] tmp = md.digest(); char[] str = new char[16*2]; int k = 0; for(int i=0;i<16;i++) { byte byte0 = tmp[i]; str[k++] = hexDigits[byte0 >>>4 & 0x0f]; str[k++] = hexDigits[byte0 & 0x0f]; } s = new String(str); } catch (NoSuchAlgorithmException ex) { ex.printStackTrace(); } return s; } public static String getMD5(byte[] bytes) { String s = null; char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; MessageDigest md; try { md = MessageDigest.getInstance("MD5"); md.update(bytes); byte[] tmp = md.digest(); logger.info("md.digest() :"+new String(tmp)); char[] str = new char[16*2]; int k = 0; for(int i=0;i<16;i++) { byte byte0 = tmp[i]; str[k++] = hexDigits[byte0 >>>4 & 0x0f]; str[k++] = hexDigits[byte0 & 0x0f]; } s = new String(str); } catch (NoSuchAlgorithmException ex) { ex.printStackTrace(); } return s; } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值