Java如何生成publickey_根据PrivateKey生成 PublicKey

KeyContext.java

import lombok.Builder;

import lombok.Getter;

import lombok.Setter;

import java.security.PrivateKey;

import java.security.PublicKey;

@Getter

@Setter

@Builder

public class KeyContext {

private String privateKeyStr;

private PrivateKey privateKey;

private String publicKeyStr;

private PublicKey publicKey;

}

KeyUtil.java

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

import javax.crypto.Cipher;

import java.security.KeyFactory;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.interfaces.RSAPrivateCrtKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.RSAPublicKeySpec;

import java.util.Base64;

@Component

public class KeyUtil {

private static final Logger logger = LoggerFactory.getLogger(KeyUtil.class);

private static BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();

public KeyContext genPublicKey(String privateKeyString) {

logger.info("Origin privateKey: {}", privateKeyString);

KeyContext.KeyContextBuilder builder = KeyContext.builder();

try {

byte[] decoded = Base64.getDecoder().decode(privateKeyString);

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decoded);

KeyFactory kf = KeyFactory.getInstance("RSA");

PrivateKey privateKey = kf.generatePrivate(keySpec);

RSAPrivateCrtKey privk = (RSAPrivateCrtKey) privateKey;

RSAPublicKeySpec publicKeySpec = new java.security.spec.RSAPublicKeySpec(privk.getModulus(), privk.getPublicExponent());

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);

String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());

logger.info("Gen publicKey: {}", publicKeyStr);

builder.privateKeyStr(privateKeyString).privateKey(privateKey).publicKeyStr(publicKeyStr).publicKey(publicKey);

} catch (Exception e) {

logger.error("genPublicKey Error:", e);

}

return builder.build();

}

public String encrypt(PublicKey publicKey, String context) {

if (publicKey == null) {

logger.error("KeyUtil.encrypt--context:{}, publicKey is null", context);

return context;

}

try {

Cipher cipher = Cipher.getInstance("RSA", bouncyCastleProvider);

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

byte[] output = cipher.doFinal(context.getBytes());

return Base64.getEncoder().encodeToString(output);

} catch (Exception e) {

logger.error("KeyUtil.encrypt Exception:", e);

return context;

}

}

public String decrypt(PrivateKey privateKey, String context) {

if (privateKey == null) {

logger.error("KeyUtil.decrypt--context:{}, privateKey is null", context);

return context;

}

try {

Cipher cipher = Cipher.getInstance("RSA", bouncyCastleProvider);

cipher.init(Cipher.DECRYPT_MODE, privateKey);

byte[] output = cipher.doFinal(Base64.getDecoder().decode(context));

return new String(output);

} catch (Exception e) {

logger.error("KeyUtil.decrypt Exception:", e);

return context;

}

}

public static void main(String[] args) {

KeyUtil keyUtil = new KeyUtil();

String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKKUer0JPGmT6Q3KnpDS5nJO8eSMPBVNwrixd1s4bAYACGFxnzg1xT+TvhmLqxWfj0gX8w2dGKP1PGgwd3F69mTsC+Yn6pAqQOETgn7JqdFHp01YCV5beK0GC7Ev7QSHTVy7PeH3J5ppuOEEd+wOsoP9GztArjgMJfvBA01BL7DxAgMBAAECgYBjQRZ1lc/l/MDJBKwtajP6ESwoBV0g/Goma2GctSNtvlNfeghkPp9/IulpmxUFjHXi44wlAYVrg2oviXdCNnl5RiWUgNfKntoQ96MVZAaOY4HKD06sPZOM2jG8sAGcOk656FeL8KYlad7Kbk/a/Elbujdp3yHWuEgnpT9E7WX2gQJBANYqkYN4mmP5a7p0mMmfjEJmo/IHHFYO3vKcHhoHdOnOi5MOMoY5sE5hNGQAINRKDgfSZ8q+/C43paDYWZrYcPkCQQDCVlPfMYGJfWx0u8MSEja54NeP87k/UfY4m1V/BUHWN62gUDaF3Uc6oRz9DQwlOiYo9qT3Zs7gNAc8uXFplrW5AkEAznlFxrlsJ3xctusYLjIqmA26e2kNkY5OtRl8D94mgg8GEyV54lwVtMsUJmDVRbWLp1DbjeTo3Wn6vYI3iQioiQJAaLtLchJlBCrC41o5M6j7M0t4AI1RvU03i6Qy/ERiCcdx296+s3/gHjmrvLhmXj2rSRI7L1WJkgyYBeLOux/MiQJAUgk4Oml7T//xhhb+E3A2BBKkhnMuHHp18jHw31EqAzCQtzrcZg+cA4woISsH18sqo/iy8qeW00WCIVizVVdoRg==";

KeyContext keyContext = keyUtil.genPublicKey(privateKey);

String originStr = "thisisatest";

String encryptStr = keyUtil.encrypt(keyContext.getPublicKey(), originStr);

String decryptStr = keyUtil.decrypt(keyContext.getPrivateKey(), encryptStr);

System.out.println("~~~~~~~~~~originStr : " + originStr);

System.out.println("~~~~~~~~~~encryptStr : " + encryptStr);

System.out.println("~~~~~~~~~~decryptStr : " + decryptStr);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值