`
buddie
  • 浏览: 185290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

根据PrivateKey生成PublicKey

    博客分类:
  • Java
 
阅读更多

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

}

 

 

分享到:
评论

相关推荐

    使用public/private key让putty(ssh)自动登录

    标题中的“使用public/private key让putty(ssh)自动登录”指的是通过SSH(Secure Shell)协议,使用公钥/私钥对实现Putty的无密码自动登录。这是一项提高远程服务器访问安全性和便利性的技术。 在SSH连接中,通常有...

    putty key 生成器

    可以生成public key和private key

    Public Key RSA Encryption in C# .NET

    Console.WriteLine("Private Key: " + privateKey); // 加密数据 byte[] dataToEncrypt = File.ReadAllBytes("plaintext.txt"); byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false); // 保存加密数据...

    模拟private key加密算法的ssl通信

    在这个过程中,private key(私钥)扮演着至关重要的角色,它用于解密由public key(公钥)加密的数据,确保只有预期的接收者才能读取信息。以下是对"模拟private key加密算法的SSL通信"这一主题的详细解释: 1. **...

    RSA生成公钥私钥和使用公钥私钥加密解密demo

    - `saveKeys(PublicKey publicKey, PrivateKey privateKey, String fileName)`: 保存公钥和私钥到文件。 - `loadKeys(String publicKeyFile, String privateKeyFile)`: 从文件加载公钥和私钥。 7. **安全性考虑**...

    获取RSA公钥+私钥

    5. **加载和使用密钥**:在需要时,可以反编码并解析回PublicKey和PrivateKey对象。 ```java byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyString); byte[] privateKeyBytes = Base64.getDecoder()...

    c语言实现DH算法加密

    A系统构建密钥:构建一对公私密钥Private Key1和Public Key1; A系统向B系统公布自己的公钥(Public Key1); B系统使用A公布的公钥(Public Key1)建立一对密钥:Private Key2和Public Key2; B系统向A系统公布...

    Go-非对称密钥生成

    publicKey := &privateKey.PublicKey publicPEM := pem.EncodeToMemory(&pem.Block{ Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(publicKey), }) // 保存到文件 err = ioutil.WriteFile(...

    支付宝生成私钥公钥工具

    在使用支付宝进行支付接口开发时,开发者需要生成一对密钥——私钥(Private Key)和公钥(Public Key),这就是“支付宝生成私钥公钥工具”所涉及的核心概念。 私钥是用于解密和签名的密钥,必须严格保密,只有...

    根据PEM(PKCS#8格式)文件生成DSA对象的项目源代码

    用OpenSSL 生成了公钥和私钥文件,格式为PEM的,现在用C#想要从文件中读取公钥和私钥。 生成公钥和私钥方式如下: DSA公私钥可以使用OpenSSL ...openssl dsa -in dsa_private_key.pem -pubout -out dsa_public_key.pem

    ecc的序列号生成代码

    publicKey = privateKey.GetPublic(); ``` 3. **序列号生成**:序列号可以是任何与产品相关的唯一标识,如产品ID加上时间戳。将其转换为字节数组,然后使用私钥对其进行签名。 ```cpp std::string serialNumber = ...

    模仿json,根据对象生成json字符串,根据字符串生成对象

    本文将深入探讨如何模仿JSON,根据对象生成JSON字符串,以及如何根据JSON字符串反向生成对象。 首先,我们要理解JSON的基本结构。一个JSON对象以大括号`{}`包围,其内部由键值对组成,键用双引号`""`包裹,值可以是...

    x25519-key-agreement-key-2019:X25519(Curve25519)DH密钥实现可与crypto-ld LDKeyPair API一起使用

    这是一个低级库,用于生成和序列化X25519(Curve25519)密钥对(使用nacl.box )。 另请参阅(相关规格):安装需要Node.js 12+ 要在本地安装(用于开发): git clone ...

    java的ElGamal算法实现

    方法生成公钥和私钥,公钥文件为publicKey,私钥文件为privateKey。 加密:String miwen = ElGamalCoder.decrypt("这里传入明文", "publicKey"); //publicKey是公钥文件所在的路径(包括文件名) 解密:String ...

    Java 生成RSA密钥进行数据加密解密 支持超长字符分区

    public void saveKeys(PublicKey publicKey, PrivateKey privateKey, String publicKeyPath, String privateKeyPath) { try { FileOutputStream publicKeyOut = new FileOutputStream(publicKeyPath); ...

    php生成秘钥和公钥,以及秘钥和公钥签名验证

    上述代码会生成一个2048位的RSA密钥对,私钥存储在$privateKey变量中,公钥存储在$publicKey变量中。 数字签名和验证: 数字签名是一种用于验证数据完整性和发送者身份的技术。在PHP中,我们可以使用私钥对数据进行...

    java生成及验证android签名文件源码及生成签名文件

    PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); // 存储到keystore KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(null, ...

    本地生成RSA密钥对工具包,RSA加密解密

    本地生成RSA密钥对工具包,运行直接生成,1024和2048位都可以,修改配置文件config.properties中的参数即可,运行后本目录下生成4个文件:privateKey.txt,publicKey.txt,privateKey.pem,publicKey.pem

    MyEclipse2017ci9破解补丁(内含说明)

    请勿用于商业用途!请勿用作非法用途!官方版本有30天的免费试用期,请大家支持正版,此版本仅供个人学习交流,对于造成的问题,本作者概不负责! ...privateKey.bytes publicKey.bytes readme.txt

    java实现非对称加密

    public static byte[] privateDecrypt(byte[] data, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); return cipher....

Global site tag (gtag.js) - Google Analytics