Java+bcprov库实现对称和非对称加密算法


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));
	}
}

控制台打印输出如下所示。
在这里插入图片描述

org.bouncycastle.openssl.PEMException: problem parsing ENCRYPTED PRIVATE KEY: java.lang.SecurityException: JCE cannot authenticate the provider BC at org.bouncycastle.openssl.PEMReader$EncryptedPrivateKeyParser.parseObject(Unknown Source) at org.bouncycastle.openssl.PEMReader.readObject(Unknown Source) at org.whispersystems.textsecuregcm.push.RetryingApnsClient.initializePrivateKey(RetryingApnsClient.java:135) at org.whispersystems.textsecuregcm.push.RetryingApnsClient.(RetryingApnsClient.java:65) at org.whispersystems.textsecuregcm.push.APNSender.(APNSender.java:61) at org.whispersystems.textsecuregcm.WhisperServerService.run(WhisperServerService.java:182) at org.whispersystems.textsecuregcm.WhisperServerService.run(WhisperServerService.java:111) at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:43) at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:87) at io.dropwizard.cli.Cli.run(Cli.java:78) at io.dropwizard.Application.run(Application.java:93) at org.whispersystems.textsecuregcm.WhisperServerService.main(WhisperServerService.java:283) Caused by: java.lang.SecurityException: JCE cannot authenticate the provider BC at javax.crypto.Cipher.getInstance(Cipher.java:656) at javax.crypto.Cipher.getInstance(Cipher.java:595) ... 12 more Caused by: java.util.jar.JarException: file:/opt/code/signal-Server-master/target/TextSecureServer-1.87.jar has unsigned entries - org/whispersystems/dispatch/DispatchManager$4.class at javax.crypto.JarVerifier.verifySingleJar(JarVerifier.java:502) at javax.crypto.JarVerifier.verifyJars(JarVerifier.java:363) at javax.crypto.JarVerifier.verify(JarVerifier.java:289) at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:164) at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:190) at javax.crypto.Cipher.getInstance(Cipher.java:652) ... 13 more --------------------- 作者:idwtwt 来源:CSDN 原文:https://blog.csdn.net/idwtwt/article/details/83793940 版权声明:本文为
BCryptProv-JDK16是一个用于Java的密码学,它包含了SM2算法的支持。SM2Engine.Mode.C1C3C2是一种SM2密码模式,其中C1、C3和C2代表三种不同的操作: 1. C1 (加密): 这是SM2算法的主要加密步骤,通常用于生成公钥对中的公钥以及对数据进行加密。 2. C3 (解密): 对称于C1,C3是SM2的解密过程,用于从接收方的私钥解密消息。 3. C2 (签名/验签): SM2还支持数字签名,C2模式表示使用私钥进行签名(生成消息摘要并加密),而C2'则对应的是验证签名的过程。 在实际使用中,你需要创建一个`SM2Engine`实例,并设置模式为`Mode.C1C3C2`。例如,如果你想要生成一个SM2公钥对并进行加密,你可以这样做: ```java import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; // 首先,添加Bouncy Castle提供者 Security.addProvider(new BouncyCastleProvider()); // 创建X9ECParameters对象 X9ECParameters params = ...; // 根据需要加载SM2参数 // 初始化SM2 Engine SM2Engine engine = new SM2Engine(params); // 设置模式为C1C3C2 engine.setMode(SM2Engine.Mode.C1C3C2); // 发生实际的操作,如生成公钥对和加密 byte[] publicKeyBytes = engine.generatePublic(); byte[] encryptedMessage = engine.encrypt(message, privateKeyBytes); // privateKeyBytes是私钥字节形式 ``` 这里需要注意的是,你需要确保提供的`X9ECParameters`对象包含了正确的SM2参数,以及`privateKeyBytes`是你想用于加密的私钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值