MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)。

MD5算法加密~16位、32位、64位。

1991年,由Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。MD5是非常安全的。

消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。 消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这串摘要便可成为验证明文是否是"真身"的"指纹"了。

因为MD5是基于消息摘要原理的,消息摘要的基本特征就是很难根据摘要推算出消息报文。

java实现代码:

package com.ts.u;

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Encoder;

/**

* MD5 encrypt algorithm.

* Encryption irreversible.

* @author Tony_tian

* @version 0.0.1
2015-10-15 12:57:12

* */

public final class MD5 {

/**Determine encrypt algorithm MD5*/

private static final String ALGORITHM_MD5 = "MD5";

/**UTF-8 Encoding*/

private static final String UTF_8 = "UTF-8";

/**

* MD5 16bit Encrypt Methods.

* @param readyEncryptStr ready encrypt string

* @return String encrypt result string

* @throws NoSuchAlgorithmException

* */

public static final String MD5_16bit(String readyEncryptStr) throws NoSuchAlgorithmException{

if(readyEncryptStr != null){

return MD5.MD5_32bit(readyEncryptStr).substring(8, 24);

}else{

return null;

}

}

/**

* MD5 32bit Encrypt Methods.

* @param readyEncryptStr ready encrypt string

* @return String encrypt result string

* @throws NoSuchAlgorithmException

* */

public static final String MD5_32bit(String readyEncryptStr) throws NoSuchAlgorithmException{

if(readyEncryptStr != null){

//Get MD5 digest algorithm's MessageDigest's instance.

MessageDigest md = MessageDigest.getInstance(ALGORITHM_MD5);

//Use specified byte update digest.

md.update(readyEncryptStr.getBytes());

//Get cipher text

byte [] b = md.digest();

//The cipher text converted to hexadecimal string

StringBuilder su = new StringBuilder();

//byte array switch hexadecimal number.

for(int offset = 0,bLen = b.length; offset < bLen; offset++){

String haxHex = Integer.toHexString(b[offset] & 0xFF);

if(haxHex.length() < 2){

su.append("0");

}

su.append(haxHex);

}

return su.toString();

}else{

return null;

}

}

/**

* MD5 32bit Encrypt Methods.

* @param readyEncryptStr ready encrypt string

* @return String encrypt result string

* @throws NoSuchAlgorithmException

* */

public static final String MD5_32bit1(String readyEncryptStr) throws NoSuchAlgorithmException{

if(readyEncryptStr != null){

//The cipher text converted to hexadecimal string

StringBuilder su = new StringBuilder();

//Get MD5 digest algorithm's MessageDigest's instance.

MessageDigest md = MessageDigest.getInstance(ALGORITHM_MD5);

byte [] b = md.digest(readyEncryptStr.getBytes());

int temp = 0;

//byte array switch hexadecimal number.

for(int offset = 0,bLen = b.length; offset < bLen; offset++){

temp = b[offset];

if(temp < 0){

temp += 256;

}

int d1 = temp / 16;

int d2 = temp % 16;

su.append(Integer.toHexString(d1) + Integer.toHexString(d2)) ;

}

return su.toString();

}else{

return null;

}

}

/**

* MD5 32bit Encrypt Methods.

* @param readyEncryptStr ready encrypt string

* @return String encrypt result string

* @throws NoSuchAlgorithmException

* */

public static final String MD5_32bit2(String readyEncryptStr) throws NoSuchAlgorithmException{

if(readyEncryptStr != null){

//The cipher text converted to hexadecimal string

StringBuilder su = new StringBuilder();

//Get MD5 digest algorithm's MessageDigest's instance.

MessageDigest md = MessageDigest.getInstance(ALGORITHM_MD5);

//Use specified byte update digest.

md.update(readyEncryptStr.getBytes());

byte [] b = md.digest();

int temp = 0;

//byte array switch hexadecimal number.

for(int offset = 0,bLen = b.length; offset < bLen; offset++){

temp = b[offset];

if(temp < 0){

temp += 256;

}

if(temp < 16){

su.append("0");

}

su.append(Integer.toHexString(temp));

}

return su.toString();

}else{

return null;

}

}

/**

* MD5 64bit Encrypt Methods.

* @param readyEncryptStr ready encrypt string

* @return String encrypt result string

* @throws NoSuchAlgorithmException

* @throws UnsupportedEncodingException

* */

public static final String MD5_64bit(String readyEncryptStr) throws NoSuchAlgorithmException, UnsupportedEncodingException{

MessageDigest md = MessageDigest.getInstance(ALGORITHM_MD5);

BASE64Encoder base64Encoder = new BASE64Encoder();

return base64Encoder.encode(md.digest(readyEncryptStr.getBytes(UTF_8)));

}

public static void main(String[] args) {

try {

String md516 = MD5.MD5_16bit("kaka123");

System.out.println("16bit-md5:\n" + md516); //

String md532 = MD5.MD5_32bit("kaka123");

String md5321 = MD5.MD5_32bit1("kaka123");

String md5322 = MD5.MD5_32bit2("kaka123");

System.out.println("32bit-md5:"); //5d052f1e32af4e4ac2544a5fc2a9b992

System.out.println("1: " + md532);

System.out.println("2: " + md5321);

System.out.println("3: " + md5322);

String md564 = MD5.MD5_64bit("kaka123");

System.out.println("64bit-md5:\n" + md564); //

} catch (Exception e) {

e.printStackTrace();

}

}

}

运行结果:

16bit-md5:

32af4e4ac2544a5f

32bit-md5:

1: 5d052f1e32af4e4ac2544a5fc2a9b992

2: 5d052f1e32af4e4ac2544a5fc2a9b992

3: 5d052f1e32af4e4ac2544a5fc2a9b992

64bit-md5:

XQUvHjKvTkrCVEpfwqm5kg==

转载自:https://blog.csdn.net/typa01_kk/article/details/49152173