RSA java加密解密验签

一:Java测试

二:pom

复制代码
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15to18</artifactId>
    <version>1.66</version>
</dependency>

三:工具类

复制代码
public class RsaUtils {
    static {
        Security.addProvider(new BouncyCastleProvider());
    }
    public KeyPair genePublicPrivate() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        // 初始化密码生感器
        keyPairGenerator.initialize(512, new SecureRandom());
        //生成密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //获公钥
        PublicKey publicKey = keyPair.getPublic();
        // 获私钥
        PrivateKey privateKey = keyPair.getPrivate();
        System.out.println(getPublicKeyStr(publicKey));//公钥字符串
        System.err.println(getPrivateKeyStr(privateKey));//私钥字符串
        return keyPair;
    }

    public static PublicKey getPublicKey(String key) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(key);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
    }

    public static PrivateKey getPrivateKey(String key) throws Exception {
        byte[] keyBytes;
        keyBytes = Base64.getDecoder().decode(key);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
        return privateKey;
    }

    public static byte[] encrypt(byte[] bt_plaintext,String pubkey) throws Exception {
        PublicKey publicKey = getPublicKey(pubkey);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] bt_encrypted = cipher.doFinal(bt_plaintext);
        return bt_encrypted;
    }

    public static byte[] decrypt(byte[] bt_encrypted,String prikey) throws Exception {
        PrivateKey privateKey = getPrivateKey(prikey);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] bt_original = cipher.doFinal(bt_encrypted);
        return bt_original;
    }

    /**
     * 获取私钥字符串
     *
     * @return 当前的私钥字符串
     */
    public static String getPrivateKeyStr(PrivateKey privateKey) {
        KeyFactory keyFactory = null;
        String privateKeyStr = null;
        try {
            keyFactory = KeyFactory.getInstance("RSA");
            PKCS8EncodedKeySpec keySpec = keyFactory.getKeySpec(privateKey, PKCS8EncodedKeySpec.class);
            byte[] buffer = keySpec.getEncoded();
            privateKeyStr = Base64.getEncoder().encodeToString(buffer);
        } catch (NoSuchAlgorithmException e) {
            System.err.println(e);
        } catch (InvalidKeySpecException e) {
            System.err.println(e);
        }
        return privateKeyStr;
    }

    /**
     * 获取公钥字符串
     *
     * @return 当前的公钥字符串
     */
    public static String getPublicKeyStr(PublicKey publicKey) {
        KeyFactory keyFactory = null;
        String publicKeyStr = null;
        try {
            keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = keyFactory.getKeySpec(publicKey, X509EncodedKeySpec.class);
            byte[] buffer = keySpec.getEncoded();
            publicKeyStr = Base64.getEncoder().encodeToString(buffer);
        } catch (NoSuchAlgorithmException e) {
            System.err.println(e);
        } catch (InvalidKeySpecException e) {
            System.err.println(e);
        }
        return publicKeyStr;
    }

}
相关推荐
特立独行的猫A13 分钟前
13MB 单文件、一条命令变服务:把仓颉写的 cjh 内嵌进你的应用,当它的 AI 大脑
java·后端·python
Brookty20 分钟前
Java博客项目实战|工程环境与构建:工程目录、PowerShell命令调用与JDK/IDEA/Maven工作机制
java·项目实战
octopus_c33 分钟前
STL 之 string:auto 与范围 for、常用接口、模拟实现与深浅拷贝
开发语言·c++·算法
养军博客44 分钟前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
TeamDev1 小时前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
J.YA1 小时前
String字符串[面试题]
java·开发语言
金銀銅鐵10 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
文丑颜不良啊12 小时前
LeetCode1941~1960题目解析
java·leetcode
txxzjmzlh12 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj52014 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试