赞
踩
前提:已安装JRE环境,本地环境为jdk1.8
查找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
添加位置和效果,如下图所示。
即(D:\eclipse-ide\resource\java\jdk1.8.0_151\jre\lib\ext)下。
新建项目 -> 命名为 bcprovdemo,将 bcprov-ext-jdk15on-165.jar复制到项目的 lib文件下。
在 jar包右键-> Build Path -> Add to Build Patch ,将其添加到构建路径下
添加成功如下所示。
新建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 文件中的配置信息。
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(); } }
结果如下图所示。
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)); } }
控制台打印输出如下所示。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。