MD5加密

 1.算法原理

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。

2. Java中的MD5实现

         MD5加密算法的Java实现如下所示:

package amigo.endecrypt;

import java.security.MessageDigest;

/** 
 * 采用MD5加密
 * @author Xingxing,Xie
 * @datetime 2014-5-31 
 */
public class MD5Util {
    /*** 
     * MD5加密 生成32位md5码
     * @param 待加密字符串
     * @return 返回32位md5码
     */
    public static String md5Encode(String inStr) throws Exception {
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }

        byte[] byteArray = inStr.getBytes("UTF-8");
        byte[] md5Bytes = md5.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16) {
                hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }

    /**
     * 测试主函数
     * @param args
     * @throws Exception
     */
    public static void main(String args[]) throws Exception {
        String str = new String("amigoxiexiexingxing");
        System.out.println("原始:" + str);
        System.out.println("MD5后:" + md5Encode(str));
    }
}

 测试结果:

原始:amigoxiexiexingxing

MD5后:e9ac094091b96b84cca48098bc21b1d6

 

 

 

另一种参考:

public class Encryption
 {
   private static final String KEY_MD5 = "MD5";
   private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', 
     '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
 
   public static byte[] encryptToMD5(String data)
   {
     byte[] digestdata = (byte[])null;
     try
     {
       MessageDigest alga = MessageDigest.getInstance("MD5");
       alga.update(data.getBytes());
       digestdata = alga.digest();
     } catch (NoSuchAlgorithmException e) {
       e.printStackTrace();
     }
 
     return digestdata;
   }
 
   public static String MD5(String pwd)
   {
     StringBuffer signatureData = new StringBuffer(pwd);
     byte[] byteMD5 = encryptToMD5(signatureData.toString());
 
     return toHexString(byteMD5);
   }
 
   public static String toHexString(byte[] b)
   {
     StringBuilder sb = new StringBuilder(b.length * 2);
     for (int i = 0; i < b.length; i++) {
       sb.append(HEX_DIGITS[((b[i] & 0xF0) >>> 4)]);
       sb.append(HEX_DIGITS[(b[i] & 0xF)]);
     }
     return sb.toString();
   }
 }

 

 

 

posted on 2016-04-11 09:26  蒙奇奇小眼睛  阅读(107)  评论(0)    收藏  举报

导航