Bouncy Castle 介绍
Bouncy Castle API目前包括以下内容:
-
适用于Java和C#的轻量级加密API。
-
Java加密扩展(JCE)和Java加密体系结构(JCA)的提供程序。
-
Java安全套接字扩展(JSSE)的提供程序。
-
JCE 1.2.1的洁净室实现。
-
用于读写编码的ASN.1对象的库。
-
用于TLS(RFC 2246,RFC 4346)和DTLS(RFC 6347 / RFC 4347)的轻量级API。
-
版本1和版本3 X.509证书,版本2 CRL和PKCS12文件的生成器。
-
版本2 X.509属性证书的生成器。
-
用于S / MIME和CMS的生成器/处理器(PKCS7 / RFC 3852)。
-
OCSP的发生器/处理器(RFC 2560)。
-
TSP的生成器/处理器(RFC 3161和RFC 5544)。
-
CMP和CRMF的生成器/处理器(RFC 4210和RFC 4211)。
-
OpenPGP的生成器/处理器(RFC 4880)。
-
用于扩展访问控制(EAC)的生成器/处理器。
-
数据验证和认证服务器(DVCS)的生成器/处理器 - RFC 3029。
-
用于基于DNS的命名实体认证的发生器/处理器(DANE)。
-
用于RFC 7030安全传输(EST)注册的生成器/处理器。
-
签名的jar版本适用于JDK 1.4-1.7和Sun JCE。
轻量级API适用于从J2ME到JDK 1.7的所有内容,C#中还有一个API,为上述大部分内容提供了相同的功能。
如何配置并使用
Bouncycstle 是一款开源的密码包,其包含了大量的密码算法,其支持椭圆曲线密码算法,本文主要说明 Bouncy Castle 如何配置和简单使用。
- Bouncy Castle 简介
- Bouncy Castle 两种配置方式
- Java 进口管制限制解除
Bouncy Castle 是一款轻量级的密码包,包含的许多常用的密码算法,对 Java 安全体系能够起到很好的补充,同时其支持椭圆曲线密码体系。
Bouncy Castle 配置方式有两种:一种是动态安装的方式,一种是静态配置的方式。无论是哪种配置方式,都需要先把 Bouncy Castle 包下载下来(当然也可以使用 Maven 等方式配置使用)。
最新 Bouncy Castle 下载地址请单击这里,需要下载两个文件 bcprov-jdk15on-158.jar 和 bcprov-ext-jdk15on-158.jar。
(一)动态安装的方式
这种方式是在工程中直接使用 Bouncy Castle,对环境的依赖较小。
- 将 bcprov-jdk15on-158.jar 导入工程
- 在使用之前动态加入BouncyCastle Provider
example 1:
public class hello {//动态使用provider static { Security.addProvider(new BouncyCastleProvider()); } public static void main(String args[]) { System.out.println("请输入待加密数据:"); Scanner scan = new Scanner(System.in); while (scan.hasNext()) { try { String date = scan.nextLine(); KeyGenerator kg =KeyGenerator.getInstance("AES"); kg.init(256); SecretKey secretKey = kg.generateKey(); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] enResult = cipher.doFinal(date.getBytes()); System.out.println("加密数据:"); String strEnResult = Base64.toBase64String(enResult); System.out.println(strEnResult); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvalidKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BadPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
(二)静态配置的方式
静态配置方式是本地 Java 环境中添加 Bouncy Castle 支持,需要使用到的 jar 包是 bcprov-ext-jdk15on-158.jar。
- 把 bcprov-ext-jdk15on-158.jar 添加到 java sdk 和 java jre 中。
- sdk位置→C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext
- jre位置→C:\Program Files\Java\jre1.8.0_144\lib\ext
-
修改security配置文件java.security,为了更好的体验,最好将sdk和jre中security文件都进行修改。实际仅仅修改sdk中security文件即可。
-
sdk中security文件:
C:\ProgramFiles\Java\jdk1.8.0_144\jre\lib\security\java.security
- jre中security文件:
C:\ProgramFiles\Java\jre1.8.0_144\lib\security\java.security
在 security 文件中找到以下部分:
security.provider.1=sun.security.provider.Sunsecurity.provider.2=sun.security.rsa.SunRsaSignsecurity.provider.3=sun.security.ec.SunECsecurity.provider.4=com.sun.net.ssl.internal.ssl.Providersecurity.provider.5=com.sun.crypto.provider.SunJCEsecurity.provider.6=sun.security.jgss.SunProvidersecurity.provider.7=com.sun.security.sasl.Providersecurity.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRIsecurity.provider.9=sun.security.smartcardio.SunPCSCsecurity.provider.10=sun.security.mscapi.SunMSCAPI
在后面添加
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
注意其中的序号根据自己security文件而定。检测安装是否成功,可以使用下面的简单程序进行:public static void main(String[] args) { Provider provider = Security.getProvider("BC"); System.out.println(provider); }若显示为null表示安装失败,若显示为BC表示安装成功。
(三)Java 进口管制限制解除
由于国外的进出口限制,对Java密码算法体系进行了一些限制,为了解除限制,需要覆盖策略文件。
(1)下载策略文件
- jdk6→http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
- jdk7→http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
- jdk8→http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载的策略文件中需要两个文件:local_policy.jar
和US_export_policy.jar
(2)覆盖 sdk 和 jre 中的这两个策略文件
- sdk 中策略文件位置→C:\Program Files\Java\jdk1.8.0_144\jre\lib\security
- jre 中策略文件位置→C:\Program Files\Java\jre1.8.0_144\lib\security
(四)测试
策略文件是否生效,可以使用下面的程序检验:
AES 算法没有解除限制之前,AES 算法只支持128位。
public static void main(String[] args) { try { KeyGenerator kg = KeyGenerator.getInstance("AES"); kg.init(256); SecretKey secretKey=kg.generateKey(); System.out.println(secretKey.getFormat()); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); }}
若出现 java.security.InvalidKeyException: Illegal key 错误,表示限制没有解除。