生成MD5编码

xiaoxiao2022-12-02  190

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; } }

转载请注明原文地址: https://www.6miu.com/read-4979225.html

最新回复(0)