java加密解密研究9、其他消息摘要算法

除了MD、SHA、MAC这三大主流消息摘要算法外,还有许多我们不了解的消息摘要算法,包括RipeMD系列,Tiger,Whirlpool和GOST3411算法、


一、概述

RipeMD:

RipeMD(RACE Integrity Primitives Evaluation Message Digest),是由Hans Dobbertin等3人在对MD4,MD5缺陷分析的基础上,于1996年提出的。目前,RipeMD算法共有4个标准,主要是对摘要值长度的区分,类似于SHA系列算法,包含RipeMD128,RipeMD160、RipeMD256和RipeMD320共四种算法。HmacRipeMD128和HmacRipeMd160算法是RipeMD与MAC算法融合的产物


Tiger:

Tiger由Ross于1995年提出。Tiger号称是最快的Hash算法,专门为64位机器做了优化,其消息摘要长度为192位。


Whirlpool:

Whirlpool已被列入ISO标准,由于它使用了与AES加密标准相同的转化技术,极大的提高了安全性,被称为最安全的摘要算法。Whirlpool在历史上共有3个版本,目前最新的版本是2003年颁布的,通常将其称为Whirlpool3.0,其消息摘要长度为512位。


GOST3411:

GOST3411消息摘要长度为256位。


二、实现和应用

java6没有提供上述算法的实现,所以,这里主要介绍BouncyCastle的实现和应用

1、RipeMD系列算法

package Test;

import java.security.MessageDigest;
import java.security.Security;


import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
/**
 * RipeMD摘要算法工具类
 */
class RipeMDCoder {
	/**
	 * RipeMD128摘要算法
	 */
	public static String encodeRipeMD128(byte[] data) throws Exception {
		// 添加BouncyCastle的支持
		Security.addProvider(new BouncyCastleProvider());
		// 初始化MessageDigest的信息
		MessageDigest md = MessageDigest.getInstance("RipeMD128");
		byte[] digest = md.digest(data);
		return new String(Hex.encode(digest));
	}
	
	/**
	 * RipeMD160摘要算法
	 */
	public static String encodeRipeMD160(byte[] data) throws Exception {
		// 添加BouncyCastle的支持
		Security.addProvider(new BouncyCastleProvider());
		// 初始化MessageDigest的信息
		MessageDigest md = MessageDigest.getInstance("RipeMD160");
		byte[] digest = md.digest(data);
		return new String(Hex.encode(digest));
	}
	
	/**
	 * RipeMD256摘要算法
	 */
	public static String encodeRipeMD256(byte[] data) throws Exception {
		// 添加BouncyCastle的支持
		Security.addProvider(new BouncyCastleProvider());
		// 初始化MessageDigest的信息
		MessageDigest md = MessageDigest.getInstance("RipeMD256");
		byte[] digest = md.digest(data);
		return new String(Hex.encode(digest));
	}
	
	
	/**
	 * RipeMD320摘要算法
	 */
	public static String encodeRipeMD320(byte[] data) throws Exception {
		// 添加BouncyCastle的支持
		Security.addProvider(new BouncyCastleProvider());
		// 初始化MessageDigest的信息
		MessageDigest md = MessageDigest.getInstance("RipeMD320");
		byte[] digest = md.digest(data);
		return new String(Hex.encode(digest));
	}
}

public class RipeMDTest {
	public static void main(String[] args) throws Exception {
		String testString="12123123asd";
		System.out.println(RipeMDCoder.encodeRipeMD128(testString.getBytes()));
		System.out.println(RipeMDCoder.encodeRipeMD160(testString.getBytes()));
		System.out.println(RipeMDCoder.encodeRipeMD256(testString.getBytes()));
		System.out.println(RipeMDCoder.encodeRipeMD320(testString.getBytes()));
	}
}


2、HmacRipeMD算法

package Test;

import java.security.Security;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

/**
 * HmacRipeMD摘要算法工具类
 */
class HmacRipeMDCoder {
	/**
	 * 初始化HmacRipeMD128摘要算法的密钥
	 */
	public static byte[] initHmacRipeMD128Key() throws Exception {
		// 添加BouncyCastle的支持
		Security.addProvider(new BouncyCastleProvider());
		// 初始化KeyGenerator
		KeyGenerator generator = KeyGenerator.getInstance("HmacRipeMD128");
		// 产生私密密钥
		SecretKey secretKey = generator.generateKey();
		// 获得密钥
		return secretKey.getEncoded();
	}

	/**
	 * HmacRipeMD128摘要算法
	 */
	public static String encodeHmacRipeMD128(byte[] data,byte[] key) throws Exception {
		// 添加BouncyCastle的支持
		Security.addProvider(new BouncyCastleProvider());
		//还原密钥
		SecretKey secretKey=new SecretKeySpec(key, "HmacRipeMD128");
		//实例化Mac
		Mac mac=Mac.getInstance(secretKey.getAlgorithm());
		//初始化mac
		mac.init(secretKey);
		//执行消息摘要
		byte[] digest=mac.doFinal(data);
		return new String(Hex.encode(digest));
	}

	
	
	/**
	 * 初始化HmacRipeMD128摘要算法的密钥
	 */
	public static byte[] initHmacRipeMD160Key() throws Exception {
		// 添加BouncyCastle的支持
		Security.addProvider(new BouncyCastleProvider());
		// 初始化KeyGenerator
		KeyGenerator generator = KeyGenerator.getInstance("HmacRipeMD160");
		// 产生私密密钥
		SecretKey secretKey = generator.generateKey();
		// 获得密钥
		return secretKey.getEncoded();
	}

	/**
	 * HmacRipeMD128摘要算法
	 */
	public static String encodeHmacRipeMD160(byte[] data,byte[] key) throws Exception {
		// 添加BouncyCastle的支持
		Security.addProvider(new BouncyCastleProvider());
		//还原密钥
		SecretKey secretKey=new SecretKeySpec(key, "HmacRipeMD160");
		//实例化Mac
		Mac mac=Mac.getInstance(secretKey.getAlgorithm());
		//初始化mac
		mac.init(secretKey);
		//执行消息摘要
		byte[] digest=mac.doFinal(data);
		return new String(Hex.encode(digest));
	}
}

public class HmacRipeMDTest {
	public static void main(String[] args) throws Exception {
		String testString = "12123123asd";
		
		byte[] hmacRipeMD128Key=HmacRipeMDCoder.initHmacRipeMD128Key();
		String digestString1=HmacRipeMDCoder.encodeHmacRipeMD128(testString.getBytes(), hmacRipeMD128Key);
		System.out.println(digestString1);
		
		byte[] hmacRipeMD160Key=HmacRipeMDCoder.initHmacRipeMD160Key();
		String digestString2=HmacRipeMDCoder.encodeHmacRipeMD160(testString.getBytes(), hmacRipeMD160Key);
		System.out.println(digestString2);
	}
}


你可能感兴趣的:(java,加密,exception,算法,String,解密)