当前位置:编程学习 > JAVA >>

java加密解密研究6、MD算法家族

上一篇:java加密解密研究5、消息摘要算法简介

一、简述
MD5算法是典型的消息摘要算法,其前身有MD2、MD3和MD4算法,它由MD4、MD3和MD2算法改进而来。不论是哪一种MD算法,它们都需要获得一个随机长度的信息并产生一个123位的信息摘要。如果将这个128位的二进制摘要信息换算成十六进制,可以得到一个32位的字符串,故我们见到的大部分MD5算法的数字指纹都是32为十六进制的字符串。
MD算法家族的发展史:
MD2算法:
1989年,著名的非对称算法RSA发明人之一----麻省理工学院教授罗纳德.李维斯特开发了MD2算法。这个算法首先对信息进行数据补位,使信息的字节长度是16的倍数。再以一个16位的检验和做为补充信息追加到原信息的末尾。最后根据这个新产生的信息计算出一个128位的散列值,MD2算法由此诞生。
MD4算法:
1990年,罗纳德.李维斯特教授开发出较之MD2算法有着更高安全性的MD4算法。在这个算法中,我们仍需对信息进行数据补位。不同的是,这种补位使其信息的字节长度加上448个字节后成为512的倍数(信息字节长度mod 512 =448)。此外,关于MD4算的处理和MD2算法有很大的差别。但最终仍旧会获得一个128为的散列值。MD4算法对后续消息摘要算法起到了推动作用,许多比较有名的消息摘要算法都是在MD4算法的基础上发展而来的,如MD5、SHA-1、RIPE-MD和HAVAL算法等。
MD5算法:
1991年,继MD4算法后,罗纳德.李维斯特教授开发了MD5算法,将MD算法推向成熟。MD5算法经MD2、MD3和MD4算法发展而来,算法复杂程度和安全强度打打提高,但浙西MD算法的最终结果都是产生一个128位的信息摘要。这也是MD系列算法的特点。
 
 
一、java提供的MD2和MD5算法应用
 
package com.tao.test; 
 
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
 
import javax.xml.bind.annotation.adapters.HexBinaryAdapter; 
 
 
/**
 * MD加密工具类
 */ 
class MDCoder { 
    // MD2加密 
    public static String encodeMd2(byte[] data) throws Exception { 
        // 初始化MessageDigest 
        MessageDigest md = MessageDigest.getInstance("MD2"); 
        // 执行摘要信息 
        byte[] digest = md.digest(data);  
        // 将摘要信息转换为32位的十六进制字符串 
        return new String(new HexBinaryAdapter().marshal(digest)); 
    } 
 
    // MD5加密  www.zzzyk.com
    public static String encodeMd5(byte[] data) throws Exception { 
        // 初始化MessageDigest 
        MessageDigest md = MessageDigest.getInstance("MD5"); 
        // 执行摘要信息 
        byte[] digest = md.digest(data); 
        // 将摘要信息转换为32位的十六进制字符串 
        return new String(new HexBinaryAdapter().marshal(digest)); 
    } 

 
public class MDTest { 
    public static void main(String[] args) throws UnsupportedEncodingException, Exception { 
        String testString = "123456asdasdfsdfsdfsdf"; 
        System.out.println(MDCoder.encodeMd2(testString.getBytes())); 
        System.out.println(MDCoder.encodeMd5(testString.getBytes())); 
    } 

 
 
二、BouncyCastle补充的MD4算法的应用
 
package Test; 
 
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.Security; 
 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 
import org.bouncycastle.util.encoders.Hex; 
 
/**
 * MD加密工具类
 */ 
class MDCoder { 
    // MD2加密 
    public static String encodeMd4(byte[] data) throws Exception { 
        //加入BouncyCastle的支持 
        Security.addProvider(new BouncyCastleProvider()); 
        // 初始化MessageDigest 
        MessageDigest md = MessageDigest.getInstance("MD4"); 
        //执行摘要信息 
        byte[] digest=md.digest(data); 
        //将摘要信息转换为32位的十六进制字符串 
        return new String(Hex.encode(digest)); 
    } 

 
public class MDTest { 
    public static void main(String[] args) throws UnsupportedEncodingException, Exception { 
        String testString="123456asdasdfsdfsdfsdf"; 
        String digestString=MDCoder.encodeMd4(testString.getBytes()); 
        System.out.println(digestString); 
    } 

 
三、Commons Codec提供的实现
Commons Codec提供了消息摘要的工具类-----DigestUtils类。DigestUtils类是对Sun提供的MessageDigest类的一次封装,提供了MD5和SHA系列消息摘要算法的实现。
 
package Test; 
 
import java.io.UnsupportedEncodingException; 
 
import org.apache.commons.codec.binary.Hex; 
import org.apache.commons.codec.digest.DigestUtils; 
 
/**
 * MD加密工具类
 */ 
class MDCoder { 
    // MD5加密 返回十六进制的字符串 
    public static String encodeMd5Hex(byte[] data) throws Exception { 
        return DigestUtils.md5Hex(data); 
    } 
 
    // MD5加密,返回十进制的字节数组 
    public static byte[] encodeMd5(byte[] data) { 
        return DigestUtils.md5(data); 
    } 

 
public class MDTest { 
    public static void main(String[] args) throws UnsupportedEncodingException, Exception { 
        String testString = "123456asdasdfsdfsdfsdf"; 
        //十六进制的字符串 
        String digestString = MDCoder.encodeMd5Hex(testString.getBytes()); 
        System.out.println(digestString); 
         
        //字节数组 
        byte[] digest=MDCoder.encodeMd5(testString.getBytes()); 
        String dString=new String(Hex.encodeHex(digest)); 
        System.out.println(dString); 
    } 

 
 
实际应用中根据自己
补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,