java md6_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算法应用

packagecom.tao.test;importjava.io.UnsupportedEncodingException;importjava.security.MessageDigest;importjavax.xml.bind.annotation.adapters.HexBinaryAdapter;/*** MD加密工具类*/

classMDCoder {//MD2加密

public static String encodeMd2(byte[] data) throwsException {//初始化MessageDigest

MessageDigest md = MessageDigest.getInstance("MD2");//执行摘要信息

byte[] digest =md.digest(data);//将摘要信息转换为32位的十六进制字符串

return new String(newHexBinaryAdapter().marshal(digest));

}//MD5加密

public static String encodeMd5(byte[] data) throwsException {//初始化MessageDigest

MessageDigest md = MessageDigest.getInstance("MD5");//执行摘要信息

byte[] digest =md.digest(data);//将摘要信息转换为32位的十六进制字符串

return new String(newHexBinaryAdapter().marshal(digest));

}

}public classMDTest {public static void main(String[] args) throwsUnsupportedEncodingException, Exception {

String testString= "123456asdasdfsdfsdfsdf";

System.out.println(MDCoder.encodeMd2(testString.getBytes()));

System.out.println(MDCoder.encodeMd5(testString.getBytes()));

}

}

二、BouncyCastle补充的MD4算法的应用

packageTest;importjava.io.UnsupportedEncodingException;importjava.security.MessageDigest;importjava.security.Security;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.util.encoders.Hex;/*** MD加密工具类*/

classMDCoder {//MD2加密

public static String encodeMd4(byte[] data) throwsException {//加入BouncyCastle的支持

Security.addProvider(newBouncyCastleProvider());//初始化MessageDigest

MessageDigest md = MessageDigest.getInstance("MD4");//执行摘要信息

byte[] digest=md.digest(data);//将摘要信息转换为32位的十六进制字符串

return newString(Hex.encode(digest));

}

}public classMDTest {public static void main(String[] args) throwsUnsupportedEncodingException, Exception {

String testString="123456asdasdfsdfsdfsdf";

String digestString=MDCoder.encodeMd4(testString.getBytes());

System.out.println(digestString);

}

}

三、Commons Codec提供的实现

Commons Codec提供了消息摘要的工具类-----DigestUtils类。DigestUtils类是对Sun提供的MessageDigest类的一次封装,提供了MD5和SHA系列消息摘要算法的实现。

packageTest;importjava.io.UnsupportedEncodingException;importorg.apache.commons.codec.binary.Hex;importorg.apache.commons.codec.digest.DigestUtils;/*** MD加密工具类*/

classMDCoder {//MD5加密 返回十六进制的字符串

public static String encodeMd5Hex(byte[] data) throwsException {returnDigestUtils.md5Hex(data);

}//MD5加密,返回十进制的字节数组

public static byte[] encodeMd5(byte[] data) {returnDigestUtils.md5(data);

}

}public classMDTest {public static void main(String[] args) throwsUnsupportedEncodingException, Exception {

String testString= "123456asdasdfsdfsdfsdf";//十六进制的字符串

String digestString =MDCoder.encodeMd5Hex(testString.getBytes());

System.out.println(digestString);//字节数组

byte[] digest=MDCoder.encodeMd5(testString.getBytes());

String dString=newString(Hex.encodeHex(digest));

System.out.println(dString);

}

}

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于Java实现MD5加密解密的问题。 Java提供了MessageDigest类来实现MD5加密,可以通过以下代码实现: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Base64; public class MD5Util { /** * 对字符串进行MD5加密 * @param data 需要加密的字符串 * @return 加密后的字符串 */ public static String encrypt(String data) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] bytes = md5.digest(data.getBytes()); return Base64.getEncoder().encodeToString(bytes); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } /** * 对MD5加密后的字符串进行解密 * @param data 加密后的字符串 * @return 解密后的字符串 */ public static String decrypt(String data) { throw new UnsupportedOperationException("不支持MD5解密"); } } ``` 上述代码中,`encrypt`方法用于实现MD5加密,参数为需要加密的字符串,返回值为加密后的字符串。`decrypt`方法用于实现MD5加密后的字符串的解密,但是由于MD5是不可逆的加密算法,所以我们无法进行解密,因此在该方法中直接抛出了`UnsupportedOperationException`异常。 使用示例: ```java public class Main { public static void main(String[] args) { String password = "123456"; String encryptedPassword = MD5Util.encrypt(password); System.out.println("加密后的密码:" + encryptedPassword); } } ``` 输出结果: ``` 加密后的密码:MTIzNDU2Nzg5MDM0NTY3OA== ``` 可以看到,加密后的密码是一串Base64编码的字符串。如果需要将其转换为16进制字符串,可以使用以下代码: ```java import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Base64; public class MD5Util { /** * 对字符串进行MD5加密 * @param data 需要加密的字符串 * @return 加密后的字符串 */ public static String encrypt(String data) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] bytes = md5.digest(data.getBytes()); return new BigInteger(1, bytes).toString(16); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } /** * 对MD5加密后的字符串进行解密 * @param data 加密后的字符串 * @return 解密后的字符串 */ public static String decrypt(String data) { throw new UnsupportedOperationException("不支持MD5解密"); } } ``` 这样输出的加密后的密码就是16进制的字符串了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值