Bouncy Castle使用备份

本文档记录了使用Bouncy Castle库在Java中生成证书和私钥的过程,作为学习备份。主要涉及bcprov-jdk15on-1.54.jar和bcpkix-jdk15on-1.54.jar两个jar包,同时提到了旧版API的过期警告以及推荐使用X509v3CertificateBuilder进行证书生成。
摘要由CSDN通过智能技术生成

最近再使用java代码生成证书和私钥,留个学习备份在这里

 

使用的jar包是:bcprov-jdk15on-1.54.jar

base64使用apache的codec里面的,日期使用的joda-time

 

第一个是以前的bouncy castle版本生成证书的代码,现在可以用,但是已经不推荐了,有些API会显示已经过期了

 

public class Test1 {
	static {
		Security.addProvider(new BouncyCastleProvider());
	}

	public static void main(String[] args) throws Exception {
		// Hashtable attrs = new Hashtable();
		// Vector order = new Vector();
		//
		// attrs.put(X509Principal.C, "AU");
		// attrs.put(X509Principal.O, "The Legion of the Bouncy Castle");
		// attrs.put(X509Principal.OU, "Bouncy Intermediate Certificate");
		// attrs.put(X509Principal.EmailAddress,
		// "feedback-crypto@bouncycastle.org");
		//
		// order.addElement(X509Principal.C);
		// order.addElement(X509Principal.O);
		// order.addElement(X509Principal.OU);
		// order.addElement(X509Principal.EmailAddress);
		// new X509Principal(order, attrs)
		

		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
		keyPairGen.initialize(1024);

		KeyPair keyPair = keyPairGen.generateKeyPair();

		PublicKey pubKey = keyPair.getPublic();
		PrivateKey privKey = keyPair.getPrivate();

		X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
		certGen.setSerialNumber(BigInteger.valueOf(1));
		certGen.setIssuerDN(new X509Principal(
				"C=CN,ST=JS,L=SZ,CN=DL,EMAILADDRESS=feedback-crypto@bouncycastle.org,O=OR,OU=OU"));
		certGen.setSubjectDN(new X509Principal(
				"C=CN,ST=JS,L=SZ,CN=DL,EMAILADDRESS=feedback-crypto@bouncycastle.org,O=OR,OU=OU"));
		certGen.setNotBefore(LocalDate.now().toDate());
		certGen.setNotAfter(LocalDate.now().plusYears(100).toDate());
		certGen.setPublicKey(pubKey);
		// certGen.setSignatureAlgorithm("MD5withRSA");
		certGen.setSignatureAlgorithm("SHA1withRSA");
		Certificate cert = certGen.generateX509Certificate(privKey);
		System.out.println(cert);
		

	}
}

 

在新的bouncy castle版本里,推荐使用的是另一个生成方法

X509v3CertificateBuilder是推荐使用的,需要导入另一个jar包bcpkix-jdk15on-1.54.jar

public class Test2 {
	static {
		Security.addProvider(new BouncyCastleProvider());
	}

	public static void main(String[] args) throws Exception {
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", "BC");
		keyPairGen.initialize(1024);

		KeyPair keyPair = keyPairGen.generateKeyPair();

		PublicKey pubKey = keyPair.getPublic();
		PrivateKey privKey = keyPair.getPrivate();

		String mySigAlgo = "Sha1withRSA";
		SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfo
				.getInstance(pubKey.getEncoded());

//		X500NameBuilder nameBuilder = new X500NameBuilder();
//		nameBuilder.addRDN(BCStyle.C, "CN");
//		nameBuilder.addRDN(BCStyle.ST, "JS");
//		nameBuilder.addRDN(BCStyle.L, "SZ");
//		nameBuilder.addRDN(BCStyle.CN, "DL");
//		nameBuilder.addRDN(BCStyle.E, "feedback-crypto@bouncycastle.org");
//		nameBuilder.addRDN(BCStyle.O, "O");
//		nameBuilder.addRDN(BCStyle.OU, "OU");
//
//		X500Name x500Name = nameBuilder.build();
		
		X500Name x500Name = new X500Name("C=CN,ST=JS,L=SZ,CN=DL,EMAILADDRESS=feedback-crypto@bouncycastle.org,O=OR,OU=OU");
		LocalDate now = LocalDate.now();
		X509v3CertificateBuilder certBuilder = new X509v3CertificateBuilder(
				x500Name, new BigInteger(64, new SecureRandom()), new Date(
						now.toEpochDay()), new Date(now.plusYears(100)
						.toEpochDay()), x500Name, publicKeyInfo);
		ContentSigner signer = new JcaContentSignerBuilder(mySigAlgo)
				.build(privKey);
		X509CertificateHolder certHolder = certBuilder.build(signer);
		X509Certificate cert = (new JcaX509CertificateConverter())
				.getCertificate(certHolder);
		System.out.println(cert);

	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bouncy Castle可以通过下载相应的jar包并将其添加到项目中来使用。在Java中,你可以使用Bouncy Castle提供的API来访问其提供的加密算法和协议。下面是一个简单的示例,演示如何使用Bouncy Castle进行AES加密和解密: ```java import org.bouncycastle.crypto.BufferedBlockCipher; import org.bouncycastle.crypto.engines.AESEngine; import org.bouncycastle.crypto.modes.CBCBlockCipher; import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.crypto.params.ParametersWithIV; import org.bouncycastle.util.encoders.Base64; import java.security.SecureRandom; public class BouncyCastleExample { private static final int KEY_SIZE = 256; private static final int IV_SIZE = 128; private static final int BLOCK_SIZE = 128; private static final String KEY = "my_secret_key"; private static final String PLAIN_TEXT = "Hello, world!"; public static void main(String[] args) throws Exception { SecureRandom random = new SecureRandom(); byte[] keyBytes = KEY.getBytes(); byte[] ivBytes = new byte[IV_SIZE / 8]; random.nextBytes(ivBytes); BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine())); KeyParameter keyParam = new KeyParameter(keyBytes); ParametersWithIV params = new ParametersWithIV(keyParam, ivBytes); cipher.init(true, params); byte[] input = PLAIN_TEXT.getBytes(); byte[] output = new byte[cipher.getOutputSize(input.length)]; int len = cipher.processBytes(input, 0, input.length, output, 0); len += cipher.doFinal(output, len); String base64Encoded = new String(Base64.encode(output)); System.out.println("Encrypted text: " + base64Encoded); cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine())); params = new ParametersWithIV(keyParam, ivBytes); cipher.init(false, params); byte[] decoded = Base64.decode(base64Encoded); byte[] decrypted = new byte[cipher.getOutputSize(decoded.length)]; len = cipher.processBytes(decoded, 0, decoded.length, decrypted, 0); len += cipher.doFinal(decrypted, len); System.out.println("Decrypted text: " + new String(decrypted)); } } ``` 在上面的示例中,我们使用Bouncy Castle提供的AES算法和CBC模式来加密和解密数据。我们首先生成一个随机的IV(初始化向量),并使用它和我们的密钥一起初始化加密/解密器。在加密时,我们将输入数据转换为字节数组,将其传递给加密器,并将加密后的结果编码为Base64字符串。在解密时,我们对编码后的字符串进行解码,然后使用相同的IV和密钥初始化解密器,并将解密后的结果转换为字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值