RSA 公私钥加解密Java实现

这篇具有很好参考价值的文章主要介绍了RSA 公私钥加解密Java实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.简单快速集成,饮用hutool工具包实现

1)引入hutool包

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.8</version>
        </dependency>

2) 制作好自己的rsa公私钥文件,通过openssl实现即可,直接放到resources下面 

java使用rsa公钥私钥加密解密,java,java

3)读取rsa文件,进行加解密实现,公钥加密,私钥解密,注意点都在里面注释了。

package com.shebao.controller.wechat;

import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class HutoolRSATest {

    public static void main(String[] args) throws IOException {
        String en = testEncrypt();
        testDecrypt(en);
    }

    /**
     * 私钥解密
     * @param content 加密了的内容
     * @throws IOException
     */
    public static void testDecrypt(String content) throws IOException {
        Resource resource = new ClassPathResource("rsa_private_key.pem");
        System.out.println(resource.getFile().getPath());
        BufferedReader br = new BufferedReader(new FileReader(resource.getFile().getPath()));
        /**
         * 这个巨重要,会筛选掉密钥内容中的首行标识字段
         */
        String s = br.readLine();
        String str = "";
        s = br.readLine();
        while (s.charAt(0) != '-') {
            str += s + "\r";
            s = br.readLine();
        }
        RSA rsa = new RSA(str,null);
        String s1 = rsa.decryptStr(content, KeyType.PrivateKey);
        System.out.println(s1);
    }

    /**
     * 公钥加密
     * @return
     * @throws IOException
     */
    public static String testEncrypt() throws IOException {
        String content = "这是糊涂工具包hutool";
        Resource resource = new ClassPathResource("rsa_public_key.pem");
        System.out.println(resource.getFile().getPath());
        BufferedReader br = new BufferedReader(new FileReader(resource.getFile().getPath()));
        String s = br.readLine();
        String str = "";
        s = br.readLine();
        while (s.charAt(0) != '-') {
            str += s + "\r";
            s = br.readLine();
        }

        RSA rsa = new RSA(null,str);
        String result = rsa.encryptBase64(content, KeyType.PublicKey);
        System.out.println(result);
        return result;
    }
}

2.不借助工具,直接引用java security包实现功能

1)公私钥依然放在resources下

2)公钥加密,私钥解密

3)java.security.Security.addProvider( new org.bouncycastle.jce.provider.BouncyCastleProvider() );这句话很重要,不过别乱用,容易导致内存泄漏:可以参看如下文章

每次New一个BouncyCastleProvider导致的内存泄漏_shenhaiwen的博客-CSDN博客

我的实例改良了这里

4)要注意base64的解码和编码文章来源地址https://www.toymoban.com/news/detail-694905.html

package com.shebao.controller.wechat;


import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import javax.crypto.Cipher;
import java.io.BufferedReader;
import java.io.FileReader;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Security;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class TestRSA {

    private static String content = "你好呀RSA";


    public static void main(String[] args) throws Exception {
        PublicKey publicKey = getPublicKey();
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] bytes = cipher.doFinal(content.getBytes());
        byte[] bytes1 = Base64.encodeBase64(bytes);
        String result = new String(bytes1,"utf-8");
        System.out.println(result);
        test(result);

    }

    public static void test(String en) throws Exception {
        PrivateKey privateKey = getPrivate();
        KeyFactory keyFactory1 = KeyFactory.getInstance("RSA");
        Cipher cipher = Cipher.getInstance(keyFactory1.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] bytes2 = cipher.doFinal(Base64.decodeBase64(en));
        System.out.println(new String(bytes2, StandardCharsets.UTF_8));
    }

    public static PrivateKey getPrivate() throws Exception {
        Resource resource = new ClassPathResource("rsa_private_key.pem");
        System.out.println(resource.getFile().getPath());
        BufferedReader br = new BufferedReader(new FileReader(resource.getFile().getPath()));
        /**
         * 这个巨重要,会筛选掉密钥内容中的首行标识字段
         */
        String s = br.readLine();
        /**
         * 这里是读取的私钥文件
         */
        String str = "";
        s = br.readLine();
        while (s.charAt(0) != '-') {
            str += s + "\r";
            s = br.readLine();
        }

        Base64 base64 = new Base64();
        byte[] b = base64.decode(str);
        /**
         * 这个也是巨重要的,不信可以去了试试,也有另一种方式去解决这个问题,没试
         */
        BouncyCastleProvider instance = getInstance();
        if (Security.getProvider(instance.getName()) == null) {
            java.security.Security.addProvider(
                    instance
            ); 
        }

        // 生成私匙
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(b);
        PrivateKey privateKey = kf.generatePrivate(keySpec);
        return privateKey;
    }

    public static PublicKey getPublicKey() throws Exception {
        Resource resource = new ClassPathResource("rsa_public_key.pem");
        System.out.println(resource.getFile().getPath());
        BufferedReader br = new BufferedReader(new FileReader(resource.getFile().getPath()));
        String s = br.readLine();
        /**
         * 这里是读取的公钥文件
         */
        String public_key = "";
        s = br.readLine();
        while (s.charAt(0) != '-') {
            public_key += s + "\r";
            s = br.readLine();
        }

        Base64 base64 = new Base64();
        byte[] decode = base64.decode(public_key);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decode);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
    }

    private static org.bouncycastle.jce.provider.BouncyCastleProvider bouncyCastleProvider = null;

    public static synchronized org.bouncycastle.jce.provider.BouncyCastleProvider getInstance() {
        if (bouncyCastleProvider == null) {
            bouncyCastleProvider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
        }
        return bouncyCastleProvider;
    }
}

到了这里,关于RSA 公私钥加解密Java实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RSA双向加解密(公钥加密-私钥解密;私钥加密-公钥解密)

            非对称加密算法中,提供一个公钥一个私钥。一般情况下,采用公钥加密、私钥解密的方式。         假设有这样一个场景:服务A与服务B需要通信,通信内容为了安全需要进行加密传输,并且服务A与服务B不能互相持有对方的钥匙。         我首先想到的是

    2024年02月11日
    浏览(67)
  • Java代码实现RSA算法加密解密文件功能

    底层算法不做赘述,想要了解自行百度。 RSA属于非对称加密,非对称加密有公钥和私钥两个概念,私钥自己拥有,不能给别人,公钥公开。根据应用的不同,我们可以选择使用不同的密钥加密: 签名:使用私钥加密,公钥解密。用于让所有公钥所有者验证私钥所有者的身份

    2024年02月12日
    浏览(56)
  • 若依ruoyi前端vue使用jsencrypt.js加密后端java进行RSA解密(前后端交互RSA加解密)

    目录 1、前后端RSA加解密实现思路 2、前端 3、后端 按照约定来说公钥一般用来加密,大家都可以获取得到,私钥用来解密,当然你也可以混着用,以下示例是前端通过加密,后端解密.  -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ81AMIIBCgKCAQEA1+05vAf7m5NcLNLkRtsm gp+QdzcW6MVdayGTGBJG0v

    2024年02月06日
    浏览(76)
  • JAVA+Node/JavaScript 前后端通讯 RSA 加解密实现

    实际项目中,前后端或跨语言加密通讯的场景十分常见。这里以 Java 和 Node.js (兼容 浏览器 )两种开发语言为例,实现 RSA 加解密通讯。 此代码采用分段加解密,理论上支持无限长度的文本内容 使用示例:

    2024年02月07日
    浏览(48)
  • 前端js使用jsrsasign,生成RSA秘钥,获取一系列信息(公钥,私钥,模数,指数等)进行加密解密

    前言: 之前的项目里用的RSA加解密的时候是生成固定的公钥(模数,指数)和私钥放在代码里进行数据的解密。现在要修改成前端自己生成(模数和指数)传给后台。后台加密数据返回给我。我在用私钥解密。 后面查了很多,开始的window.crypto里的方法可以生成公钥和私钥,

    2024年02月16日
    浏览(84)
  • RSA加密解密(无数据大小限制,php、go、java互通实现)

    RSA加解密中必须考虑到的**长度、明文长度和密文长度问题。明文长度需要小于**长度,而密文长度则等于**长度。因此当加密内容长度大于**长度时,有效的RSA加解密就需要对内容进行分段。 这是因为,RSA算法本身要求加密内容也就是明文长度m必须0m**长度n。如果小于这个长

    2024年02月15日
    浏览(78)
  • C#.NET Framework RSA 公钥加密 私钥解密 ver:20230609

    C#.NET Framework RSA 公钥加密 私钥解密 ver:20230609   环境说明: .NET Framework 4.6 的控制台程序 。   .NET Framework 对于RSA的支持: 1. .NET Framework 内置只支持XML格式的私钥/公钥。如果要用PKCS1,PKCS8格式的,要用到三方库BouncyCastle。 2. .NET 中默认加密算法为“RSA/ECB/PKCS1Padding” ,要和

    2024年02月08日
    浏览(72)
  • RSA加解密工具类(PKCS8公钥加密,PKCS1私钥解密)

    场景 :如果项目上生成的秘钥,公钥是PKCS8格式,私钥却是PKCS1格式。需要在这种场景加解密的话可以直接使用下面工具类。 特殊说明:私钥解密的时候必须把私钥源文件内容整个传入,不能删除私钥的文件头和文件尾,并且不能删除换行。

    2024年02月11日
    浏览(67)
  • C# .NET CORE .NET6 RSA 公钥加密 私钥解密

    环境说明: .NET CORE 版本:.NET 6 。   .NET CORE 对于RSA的支持: 1. .NET 6 中内置了对 PKCS1,PKCS8 2种私钥格式的支持。 2. 如果你要部署在Linux,docker ,k8s 中;一定要用 “RSA”这个类,不能是 .NET FRAMEWORK 的 RSACryptoServiceProvider。 3. .NET 中默认加密算法为“RSA/ECB/PKCS1Padding” ,要和JAVA互通

    2024年02月08日
    浏览(94)
  • Python(30):非对称加密算法RSA的使用(openssl生成RSA公私钥对)

    1.1、生成RSA公私钥对命令 1.2、公钥 -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfNHu9aoeNUTAZH3GCP2CQaSOg XNx0tImsIaCWBEQK3/fvUx8f17hIOtttCMrrTPWefUdcUxLIZ+xzqeU/eISsz9Ym kguImd1+bMkGIYiHBKmF5Uww2jGSU738c+AUuRKpixZP+VPekLY+KbOH7NkE2U/L XGbDeMXeiqQ22UmOSQIDAQAB -----END PUBLIC KEY----- 1.3、私钥 -----BEGIN RSA PRIVATE KEY--

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包