java使用Bouncy Castle加密提供者

鉴于出口限制问题,我们得到的JDK安全强度不够高,主要是密钥长度不够。对于这一点sun在官网啥忙提供Unlimited Strength Jurisdiction Policy Files,用于开放权限限制,在这里我们成为权限文件。本文介绍怎样将第三方(Bouncy Castle)的提供者用于到Java中。

鉴于出口限制问题,我们得到的JDK安全强度不够高,主要是密钥长度不够。对于这一点sun在官网啥忙提供Unlimited Strength Jurisdiction Policy Files,用于开放权限限制,在这里我们成为权限文件。本文介绍怎样将第三方(Bouncy Castle)的提供者用于到Java中。

Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。因为 Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4 到 J2ME(包括 MIDP)平台,它都可以运行。它是在 MIDP 上运行的唯一完整的密码术包。

Bouncy Castle官网:https://www.bouncycastle.org 

Bouncy Castle下载地址:https://polydistortion.net/bc/index.html

下载后的文件如下图:

bouncy castle文件目录

将Bouncy Castle加入到Java中的方式分为两种,分别是配置文件方式编码方式

配置文件方式

第一步:在%java_home%jrelibsecurityjava.security文件中加入下面代码:

# Customer BouncyCastle Provider
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

第二步:将bcprov-ext-jdk15on-153.jar文件放置到%java_home%jrelibext目录下面。到这里就配置好了,下面通过一个是来进行说明。

实例:将Bouncy Castle提供者中的所有加密算法详细信息列出来。如下:

package boundcyCastle;

import java.security.Provider;
import java.security.Security;
import java.util.Map;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

/**
 * 获取Bouncy Castle提供者中所有的算法详细信息
 * @author hx
 * @date 2015年11月30日22:38:35
 */
public class BCTest02 {
	public static void main(String[] args) {
		// 添加Bouncy Castle提供者
		Security.addProvider( new BouncyCastleProvider() );
		// 获取Bouncy Castle提供者
		Provider provider = Security.getProvider("BC");
		// 输出Bouncy Castle提供者算法详细描述信息
		for ( Map.Entry<Object,Object> entry : provider.entrySet() ) {
			System.out.println( entry.getKey() + " - " + entry.getValue() );
		}
	}
}

输出结果:

KeyAgreement.1.3.133.16.840.63.0.2 - org.bouncycastle.jcajce.provider.asymmetric.ec.KeyAgreementSpi$DHwithSHA1KDFAndSharedInfo

Alg.Alias.KeyGenerator.Skein-MAC512/224 - Skein-MAC-512-224

SecretKeyFactory.PBEWITHSHAANDTWOFISH-CBC - org.bouncycastle.jcajce.provider.symmetric.Twofish$PBEWithSHAKeyFactory

Alg.Alias.Signature.SHA512WithCVC-ECDSA - SHA512WITHCVC-ECDSA

Alg.Alias.Cipher.ELGAMAL/ECB/PKCS1PADDING - ELGAMAL/PKCS1

MessageDigest.Skein-512-160 - org.bouncycastle.jcajce.provider.digest.Skein$Digest_512_160

Alg.Alias.KeyGenerator.HMAC/SHA512/224 - HMACSHA512/224

...

编码方式

编码方式就很简单了,你在使用前需要将bcprov-ext-jdk15on-153.jar文件添加到classpath中。下面是一段测试代码,如下:

package boundcyCastle;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 在%JRE_HOME%或者%JAVA_HOME%下面配置其他安全提供者(如:Bouncy Castle)
 * @author huangxin
 * @date 2015年11月30日23:09:39
 */
public class BCTest04 {
	/*
	 * 在JDK中配置Bouncy Castle提供者,配置如下:
	 * bcprov-ext-jdk15on-153.jar将该文件拷贝到下面目录:
	 *   %JRE_HOME%libext
	 *   %JAVA_HOME%jrelibext
	 * 
	 * 在下面目录中的配置文件中:
	 *   %JAVA_HOME%jrelibsecurityjava.security
	 *   %JRE_HOME%jrelibsecurityjava.security
	 * 添加如下内容:
	 *   # Customer BouncyCastle Provider
	 *   security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
	 */
	public static void main(String[] args) {
		char[] chars = "0123456789ABCDEF".toCharArray();
		try {
			// 被加密的字节数组
			byte[] data = "aaaaaa".getBytes();
			// 获取Bouncy Castle提供者
//			Provider provider = Security.getProvider("BC");
			// 获取MD4算法的消息摘要对象
//			MessageDigest md = MessageDigest.getInstance("MD4", provider);
			MessageDigest md = MessageDigest.getInstance("MD4");
			// 使用指定的数据更新消息摘要数据
			md.update(data);
			// 获取消息摘要数据
			byte[] result = md.digest();
			// 使用十六进制输出加密结果
			StringBuffer buffer = new StringBuffer();
			for (int i = 0, len = result.length; i < len; i++ ) {
				byte b = result[i];
				buffer.append( chars[b >>> 4 & 0xF] );
				buffer.append( chars[b & 0xF] );
			}
			System.out.println( buffer.toString() );
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
}

输出结果:

9135D5535D445A5ADC299D227D3BDBFB

沉浸于现实的忙碌之中,没有时间和精力思念过去,成功也就不会太远了。——雷音
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号