是TC

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

BouncyCastle配置 

一、环境配置

1.下载BouncyCastle相关jar包

BouncyCastle官网

2.需要的jar包:

bcprov-jdk15to18-168.jar
bcprov-ext-jdk15to18-168.jar 

3.将下载的两个jar包拷贝到$JAVA_HOME$\jre\lib\ext目录下面

4.修改配置文件$JAVA_HOME$\jre\lib\security\java.security,在末尾添加security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

5.在项目中导入jar包:bcprov‐ext‐jdk15to18‐168.jar

二、代码

(1)demo.java

1)demo.java
import
org.bouncycastle.jce.provider.
BouncyCastleProvider;
import
java.security.*;
import
java.security.spec.
ECGenParameterSpec;
import
java.util.
Arrays;
public class demo {
private static
java.lang.
String M = "20211325";
public static void main(String[] args) throws Exception {
SM2Util sm2 = new SM2Util();
final ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2
// 获取一个椭圆曲线类型的密钥对生成器
final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC"
// 使用SM2参数初始化生成器
kpg.initialize(sm2Spec);
// 获取密钥对
java.security.
KeyPair keyPair = kpg.generateKeyPair();
 
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println("明文:" + M);
String data = sm2.encrypt(publicKey, M);
System.out.println("密文:" + data);
String text = sm2.decrypt(privateKey, data);
System.out.println("解密结果:" + text);
SM3Util sm3 = new SM3Util();
byte[] digest = sm3.digest(M);
System.out.println("SM3摘要结果:" + Arrays.toString(digest));
SM4Util sm4 = new SM4Util();
byte[] key1 = SM4Key.generateKey();
byte[] iv = null;
byte[] sm4data = sm4.encrypt(digest, key1, SM4ModeAndPaddingEn
System.out.println("SM4加密结果:" + Arrays.toString(sm4data));
byte[] sm4text = sm4.decrypt(sm4data, key1, SM4ModeAndPaddingE
System.out.println("SM4解密结果:" + Arrays.toString(sm4text));
}
}

选做

(2)SM2Util.java 

import SM2Engine;
import *;
import BCECPrivateKey;
import BCECPublicKey;
import ECParameterSpec;
import Hex;
import StandardCharsets;
import PrivateKey;
import PublicKey;
import SecureRandom;
public class SM2Util {
/**
* SM2加密算法
*
* @param publicKey 公钥
* @param data 明文数据
* @return
**/
public String encrypt(PublicKey publicKey, String data) {
org.bouncycastle.crypto.engines.
org.bouncycastle.crypto.params.
org.bouncycastle.jcajce.provider.asymmetric.ec.
org.bouncycastle.jcajce.provider.asymmetric.ec.
org.bouncycastle.jce.spec.
org.bouncycastle.util.encoders.
java.nio.charset.
java.security.
java.security.
java.security.
ECPublicKeyParameters ecPublicKeyParameters = null;
if (publicKey instanceof BCECPublicKey) {
BCECPublicKey bcecPublicKey = (BCECPublicKey) publicKey;
ECParameterSpec ecParameterSpec = bcecPublicKey.getParamet
ECDomainParameters ecDomainParameters = new ECDomainParame
ecParameterSpec.getG(), ecParameterSpec.getN());
ecPublicKeyParameters = new ECPublicKeyParameters(bcecPubl
}
SM2Engine sm2Engine = new SM2Engine();
sm2Engine.init(true, new ParametersWithRandom(ecPublicKeyParam
byte[] arrayOfBytes = null;
try {
byte[] in = data.getBytes(StandardCharsets.UTF_8);
arrayOfBytes = sm2Engine.processBlock(in, 0, in.length);
} catch (Exception e) {
System.out.println("SM2加密时出现异常:");
}
return Hex.toHexString(arrayOfBytes);
}
/**
* SM2解密算法
*
* @param privateKey 私钥
* @param cipherData 密文数据
* @return
**/
public String decrypt(PrivateKey privateKey, String cipherData) {
byte[] cipherDataByte = Hex.decode(cipherData);
BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) privateKey;
ECParameterSpec ecParameterSpec = bcecPrivateKey.getParameters
ECDomainParameters ecDomainParameters = new ECDomainParameters
ecParameterSpec.getG(), ecParameterSpec.getN());
ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateK
ecDomainParameters);
SM2Engine sm2Engine = new SM2Engine();
sm2Engine.init(false, ecPrivateKeyParameters);
String result = null;
try {
byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByt
return new String(arrayOfBytes, StandardCharsets.UTF_8);
} catch (Exception e) {
System.out.println("SM2解密时出现异常");
}
return result;
}
}

(3)SM3Util.java 

import
org.bouncycastle.crypto.digests.
SM3Digest;
import
org.bouncycastle.jce.provider.
BouncyCastleProvider;
import
java.security.
Security;
public class SM3Util {
static {
Security.addProvider(new BouncyCastleProvider());
}
public byte[] digest(String input) {
SM3Digest sm3Digest = new SM3Digest();
int length = input.length();
byte[] data = input.getBytes();
sm3Digest.update(data, 0, length);
byte[] ret = new byte[sm3Digest.getDigestSize()];
sm3Digest.doFinal(ret, 0);
return ret;
}
}

(4)SM4Key.java

import
org.bouncycastle.jce.provider.
BouncyCastleProvider;
import
javax.crypto.
KeyGenerator;
import
java.security.
SecureRandom;
import
java.security.
Security;
public class SM4Key {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static byte[] generateKey() throws Exception {
KeyGenerator kg = KeyGenerator.getInstance("SM4", BouncyCastle
kg.init(128, new SecureRandom());
return kg.generateKey().getEncoded();
 
}
}

(5)SM4Util.java

import BouncyCastleProvider;
import Cipher;
import IvParameterSpec;
import SecretKeySpec;
import Security;
public class SM4Util {
static {
Security.addProvider(new BouncyCastleProvider());
}
/**
* SM4 加密
*
* @param input 明文数据
* @param key 密钥
* @param sm4ModeAndPaddingEnum 加密模式和padding模式
* @param iv 初始向量(ECB模式下传NULL)
* @return
* @throws Exception
*/
public byte[] encrypt(byte[] input, byte[] key, SM4ModeAndPaddingE
throws Exception {
return sm4(input, key, sm4ModeAndPaddingEnum, iv, Cipher.ENCRY
}
/**
* SM4 解密
*
* @param input 密文数据
* @param key 密钥
* @param sm4ModeAndPaddingEnum 加密模式和padding模式
* @param iv 初始向量(ECB模式下传NULL)
* @return
* @throws Exception
*/
public byte[] decrypt(byte[] input, byte[] key, SM4ModeAndPaddingE
throws Exception {
return sm4(input, key, sm4ModeAndPaddingEnum, iv, Cipher.DECRY
org.bouncycastle.jce.provider.
javax.crypto.
javax.crypto.spec.
javax.crypto.spec.
java.security.
 
}
private static byte[] sm4(byte[] input, byte[] key, SM4ModeAndPadd
int mode) throws Exception {
IvParameterSpec ivParameterSpec = null;
if (iv != null) {
ivParameterSpec = new IvParameterSpec(iv);
}
SecretKeySpec sm4Key = new SecretKeySpec(key, "SM4");
Cipher cipher = Cipher.getInstance(sm4ModeAndPaddingEnum.getNa
if (ivParameterSpec == null) {
cipher.init(mode, sm4Key);
} else {
cipher.init(mode, sm4Key, ivParameterSpec);
}
return cipher.doFinal(input);
}
}

(6)SM4ModeAndPaddingEnum.java

public enum SM4ModeAndPaddingEnum {
SM4_ECB_NoPadding("SM4/ECB/NoPadding"), SM4_ECB_PKCS5Padding("SM4/
SM4_ECB_PKCS7Padding("SM4/ECB/PKCS7Padding"), SM4_CBC_NoPadding("S
SM4_CBC_PKCS5Padding("SM4/CBC/PKCS5Padding"), SM4_CBC_PKCS7Padding
private String name;
SM4ModeAndPaddingEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
}

截图

 

posted on 2024-03-31 18:14  是TC  阅读(275)  评论(0编辑  收藏  举报