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

一、简述

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加密
    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);
    }
}

实际应用中根据自己的选择用选择不同的方法来实现MD消息摘要算法

转自:http://blog.csdn.net/lonelyroamer/article/details/7652320

时间: 2024-10-10 15:56:45

java加密解密研究6、MD算法家族的相关文章

java加密解密算法位运算

一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算会把加密后的字符串还原为原有字符串的值.效果图如下: 二.实现过程 1 package com.itxxz; 2 3 import java.util.Scanner; 4 5 /** 6 * java加密解密算法 7 * 8 * @author 螃蟹 9 * 网站:IT学习者 10 * 网址:ht

密码学——Java 加密解密基础

Java  加密解密基础 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学:应用于破译密码以获取通信情报的,称为破译学,总称密码学. 密码学常用术语 明文: 待加密数据. 密文: 明文经过加密后数据. 加密: 将明文转换为密文的过程. 加密算法: 将明文转换为密文的转换算法. 加密密钥: 通过加密算法进行加密操作的密钥. 解密: 将密文转换为铭文的过程. 解密算法: 将密文转换为明文的转换算法. 解密密钥: 通过解密短发进行解密操作的密

java加密解密和证书的demo

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyPair; import java.security.KeyPa

密码学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)

Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又称为数字摘要(Digital Digest).它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了.因此消息摘要保证了消息的完整性.消息摘要采用单向Hash 函数将需加密 的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(

Java加密解密与数字证书的操作

1 keytool命令总结 一.创建数字证书 交互模式 使用默认的密钥库.keystore(文件夹是c: Documents and Settingusername)和算法(DSA) keytool -genkey 默认的别名mykey 密钥库中能够存放多个条目(公钥/私钥对和证书),它们在密钥库中以别名(alias)区分. [plain] view plaincopy keytool -genkey -alias mytest -keyalg RSA -keysize 1024 -keysto

Java 加密解密之对称加密算法AES

Java 加密解密之对称加密算法AES 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.该算法

Java加密解密(一)Java加密体系基础

Java加密解密(一)Java加密体系基础 1. JCA(Java Cryptography Architecture) 提供基本的加密框架,如证书,数字签名,消息摘要和密钥对生成器.其主要实现在java.security包中. 2. JCE(Java Cryptography Extension) 在JCA的基础了作了扩展,提供了各种加密算法.消息摘要算法和密钥管理等功能.JDK提供的JCE实现主要在javax.crypto包中.第三方提供的JCE也称为安全提供者.由于出口限制,可能需要一个或

Java加密解密字符串

http://www.cnblogs.com/vwpolo/archive/2012/07/18/2597232.html Java加密解密字符串 旧文重发:http://www.blogjava.net/vwpolo/archive/2009/12/05/304874.html#383365 import java.security.Key; import java.security.Security; import javax.crypto.Cipher; /** * DES加密和解密工具,

java加密解密

秘钥 Key,分为对称密钥和非对称密钥 对称秘钥  SecretKey,由KeyGenerator生成 非对 PrivateKey,PublicKey,由KeyPairGenerator生成 KeyFactory(SecretKeyFactory)也可生成秘钥,可以将秘钥转换为外部表示如字节数组,秘钥规范(Key Spec)等 一个KeySpec对应一个Key KeyFactory  秘钥,秘钥规范转换 DSAPrivateKeySpec spec = xx; KeyFactory kf = K