首页 > 其他分享 >生成公钥和私钥

生成公钥和私钥

时间:2023-10-30 14:22:34浏览次数:23  
标签:公钥 return String throws bytes 生成 私钥 byte public

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.io.IOException;
import java.math.BigInteger;
import java.security.*;
import java.security.spec.*;

/**
 * RSA生成公钥、私钥工具类
/
public class RSAUtil {

    /**
     * 生成秘钥对
     * 
     * @return
     * @throws Exception
     */
    public static KeyPair getKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        return keyPair;
    }

    /**
     * 获取公钥(Base64编码)
     * 
     * @param keyPair
     * @return
     */
    public static String getPublicKey(KeyPair keyPair) {
        PublicKey publicKey = keyPair.getPublic();
        byte[] bytes = publicKey.getEncoded();
        return byte2Base64(bytes);
    }

    /**
     * 获取私钥(Base64编码)
     * 
     * @param keyPair
     * @return
     */
    public static String getPrivateKey(KeyPair keyPair) {
        PrivateKey privateKey = keyPair.getPrivate();
        byte[] bytes = privateKey.getEncoded();
        return byte2Base64(bytes);
    }

    /**
     * 将Base64编码后的公钥转换成PublicKey对象
     * 
     * @param pubStr
     * @return
     * @throws Exception
     */
    public static PublicKey string2PublicKey(String pubStr) throws Exception {
        byte[] keyBytes = base642Byte(pubStr);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
    }

    /**
     * 将Base64编码后的私钥转换成PrivateKey对象
     * 
     * @param priStr
     * @return
     * @throws Exception
     */
    public static PrivateKey string2PrivateKey(String priStr) throws Exception {
        byte[] keyBytes = base642Byte(priStr);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
        return privateKey;
    }

    /**
     * 公钥加密
     * 
     * @param content
     * @param publicKey
     * @return
     * @throws Exception
     */
    public static byte[] publicEncrypt(byte[] content, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] bytes = cipher.doFinal(content);
        return bytes;
    }

    /**
     * 私钥解密
     * 
     * @param content
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static byte[] privateDecrypt(byte[] content, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] bytes = cipher.doFinal(content);
        return bytes;
    }

    /**
     * 字节数组转Base64编码
     * 
     * @param bytes
     * @return
     */
    public static String byte2Base64(byte[] bytes) {
        return Base64.encodeBase64String(bytes);
    }

    /**
     * Base64编码转字节数组
     * 
     * @param base64Key
     * @return
     * @throws IOException
     */
    public static byte[] base642Byte(String base64Key) throws IOException {
        return Base64.decodeBase64(base64Key);
    }

    /**
     * 通过私钥获取公钥
     * 
     * @param privateKey
     * @return
     */
    public static String getPublicKeyByPrivateKey(String privateKey) {
        try {
            KeyFactory kf = KeyFactory.getInstance("RSA");
            RSAPrivateKeySpec priv = kf.getKeySpec(string2PrivateKey(privateKey), RSAPrivateKeySpec.class);

            RSAPublicKeySpec keySpec = new RSAPublicKeySpec(priv.getModulus(), BigInteger.valueOf(65537));
            PublicKey publicKey = kf.generatePublic(keySpec);
            byte[] bytes = publicKey.getEncoded();
            return byte2Base64(bytes);
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    public static void main(String[] orgs) {
        try {
            // ===============生成公钥和私钥,公钥传给客户端,私钥服务端保留==================
            // 生成RSA公钥和私钥,并Base64编码
            KeyPair keyPair = RSAUtil.getKeyPair();
            String publicKeyStr = RSAUtil.getPublicKey(keyPair);
            String privateKeyStr = RSAUtil.getPrivateKey(keyPair);
            System.out.println("RSA公钥Base64编码:" + publicKeyStr);
            System.out.println("RSA私钥Base64编码:" + privateKeyStr);

            String publicKeyByPrivateKey = getPublicKeyByPrivateKey(privateKeyStr);
            System.out.println("publicKeyByPrivateKey:" + publicKeyByPrivateKey);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

 

标签:公钥,return,String,throws,bytes,生成,私钥,byte,public
From: https://www.cnblogs.com/junjun1578/p/17797760.html

相关文章

  • 使用Lombok@Builder、@Data(没有生成无参构造方法)这个坑要注意,使用@Builder时配合@NoAr
    使用Lombok@Builder、@Data(没有生成无参构造方法)这个坑要注意,,使用@Builder时配合@NoArgsConstructor和@AllArgsConstructor一起使用Lombok为我们开发带来了极大便利,特别是在想要使用建造者模式的时候只需要在类上加@Builder注解即可。但是不小心也会引发隐藏的bug。我们来看......
  • Stable Diffusion新玩法火了!给几个词就能生成动图,连动图人物的表情和动作都能随意控制
    作者|小戏单说大模型AI的发展对人们想象力释放的助力,基于StableDiffusion模型的方法首当其冲。透过文本描述到图像生成技术,大模型为我们的想象力打开了一个恢弘的梦幻世界。透过点滴文字,就有可能重现禁锢在我们脑海中无法释放的光怪陆离。而最近,StableDiffusion持续进化,......
  • Python生成词云
    一、词云生成的基本原理词云是一种可视化展示文本内容的工具,用于显示文本中出现次数较高的关键词。其主要思想是将文本中频繁出现的词汇以视觉化的方式展现出来,可以很快地帮助人们了解文本的主要内容和关键信息。生成词云的基本原理是,首先需要解析文本中的关键词,统计其出现频率,然后......
  • 生成 eps 的四种方法(总有一款适合你)
    有四个办法。1、将visio图另存为eps步骤:visio->文件->导出->创建PDF/XPS文档->成功导出为pdf文件。2、AdobeDC将pdf导出为eps步骤:打开AdobeDC软件,在软件中打开pdf文件,文件->导出到->内嵌式PostScript->成功导出为eps文件。3、将ps的psd图导出到eps步......
  • 使用IBM ART库生成交通信号牌的攻击样本
    目标:生成对抗样本,扰动图像,让原本是“停”的信号牌识别为“禁止驶入”: 代码如下(注意,因为我找的cnn原始模型支持的是灰度图像,所以彩色的对抗样本还需要修改代码):importcv2,osimportnumpyasnpimportnumpyasnpimporttensorflowastffromkeras.modelsimportload_......
  • 根据内容生成二维码
    importcom.google.zxing.BarcodeFormat;importcom.google.zxing.EncodeHintType;importcom.google.zxing.MultiFormatWriter;importcom.google.zxing.WriterException;importcom.google.zxing.common.BitMatrix;importcom.google.zxing.qrcode.decoder.ErrorCorrec......
  • 生成算式并将他永久的保存到文件中
    packageupdate;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.PrintStream;importjava.util.Scanner;publicclasscomplex{publicstaticvoidmain(Stringargs[])throwsIOException{......
  • java基础漏洞学习----整数溢出漏洞+硬编码漏洞+不安全的随机数生成器
    java基础漏洞学习----整数溢出漏洞+硬编码漏洞+不安全的随机数生成器整数溢出漏洞publicclassNumberLearning{publicstaticvoidmain(String[]args){System.out.println(Integer.MAX_VALUE+1);System.out.println(Integer.MIN_VALUE-1);}}......
  • js 生成随机数(含随机颜色)
    生成0-1之间的随机数Math.random()生成0-x之间的随机整数:Math.round(Math.random()*x)生成min-max之间的随机整数:Math.round(Math.random()*(max-min)+min)生成N位随机数/***函数--生成N位随机数*@param{*}N数字的长度*/functionrandomNum(N){returnString......
  • 【Python】用Python生成图像特效
    1.引用本文重点介绍如何使用python进行图像处理,生成各式各样的图像特效。闲话少说,我们直接开始吧!2.读入图像首先我们来读取我们的样例图像,并尝试打印图像中相应元素的像素值。为了实现这一点,我们使用Python中的Pillow子模块进行实现,代码如下:fromPILimportImageimg=Image.o......