BouncyCastle,即BC,其是一款开源的密码包,包含了大量的密码算法。
本篇主要演示BC库引入,对称加密算法AES、SM4和 非对称加密EC算法的简单实现,以下是实现过程。
一、将BC添加到JRE环境
前提:已安装JRE环境,本地环境为jdk1.8
第一步、修改java.security文件
查找JDK安装位置,可执行 where javac
到 目录(D:\eclipse-ide\resource\java\jdk1.8.0_151\jre\lib\security)找到 java.security 文件,管理员方式打开,添加以下内容。
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
添加位置和效果,如下图所示。
第二步、将BC的jar保添加到指定目录
即(D:\eclipse-ide\resource\java\jdk1.8.0_151\jre\lib\ext)下。
二、将BC库添加到项目
新建项目 -> 命名为 bcprovdemo,将 bcprov-ext-jdk15on-165.jar复制到项目的 lib文件下。
在 jar包右键-> Build Path -> Add to Build Patch ,将其添加到构建路径下
添加成功如下所示。
三、测试环境中 provider 是否正确
新建Java类-ProviderTest,使用到 security 包中的Provider和Security。
import java.security.Provider;
import java.security.Security;
import java.util.Map;
public class ProviderTest {
public static void main(String [] args) {
// 添加BC库
BouncyCastleProvider bcp = new BouncyCastleProvider();
Security.addProvider(bcp);
for(Provider p : Security.getProviders()) {
System.out.println("当前遍历的p值为:"+ p);
int cout = 1;
for(Map.Entry<Object, Object> entry : p.entrySet()) {
System.out.println("\t"+entry.getKey());
cout++;
if(cout>5)
break;
}
}
}
}
执行结果如下所示。
其打印的结果即 java.security 文件中的配置信息。
四、对称密钥生成
1)对称密钥算法 AES
AES可指定生成长度,默认为128,生成代码如下所示。
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import org.bouncycastle.util.encoders.Hex;
public class HexTest {
void keyg() throws NoSuchAlgorithmException {
SecureRandom sr = new SecureRandom();
// 实例化
KeyGenerator kg = KeyGenerator.getInstance("AES");
// AES默认为128,三种长度 128192 256
kg.init(192, sr);
SecretKey sk = kg.generateKey();
byte[] b = sk.getEncoded();
System.out.println("密钥十六进制值为:" + Hex.toHexString(b));
}
// 调用密钥
public static void main(String[] args) throws NoSuchAlgorithmException {
HexTest ht = new HexTest();
ht.keyg();
}
}
结果如下图所示。
2)对称密钥 SM4算法
SM4算法 需要引入 BC库,其也可不指定长度,实现代码如下所示。
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
public class HexTest {
void keyg() throws NoSuchAlgorithmException {
// 添加BC库
BouncyCastleProvider bcp = new BouncyCastleProvider();
Security.addProvider(bcp);
SecureRandom sr = new SecureRandom();
// 实例化
KeyGenerator kg = KeyGenerator.getInstance("SM4");
// SM4 可不指定长度
kg.init(sr);
SecretKey sk = kg.generateKey();
byte[] b = sk.getEncoded();
System.out.println("SM4-密钥十六进制值为:" + Hex.toHexString(b));
}
// 调用密钥
public static void main(String[] args) throws NoSuchAlgorithmException {
HexTest ht = new HexTest();
ht.keyg();
}
}
控制台打印输出如下所示。
五、非对称密钥生成
非对称加密EC算法,引入BC库,其是以对出现,即公钥和私钥。实现代码如下所示。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
public class KeyPairTest {
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException {
// 添加BC库
BouncyCastleProvider bcp = new BouncyCastleProvider();
Security.addProvider(bcp);
// 密钥对实例
KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC");
// KeyPairGenerator kpg = KeyPairGenerator.getInstance("RAS"); // 椭圆曲线
// 初始化
kpg.initialize(256);
// 产生密钥对
KeyPair key = kpg.genKeyPair();
byte[] b = key.getPublic().getEncoded();
// 公钥短,验证签名快
System.out.println("生成的公钥为:" + Hex.toHexString(b));
b = key.getPrivate().getEncoded();
// 私钥长,验证签名慢
System.out.println("生成的私钥为:" + Hex.toHexString(b));
}
}
控制台打印输出如下所示。