Java实现RSA加解密

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

Java实现RSA加解密

需要引入的依赖

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

RSA密钥对生成工具类

package cn.demo.rsa;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;

import java.io.File;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;

public class RSAKeyGenUtil {

    /**
     * 密钥大小,单位bit
     */
    private static final int KEY_SIZE = 1024;

    private static HashMap<String, String> createBase64RSAKey() throws NoSuchAlgorithmException {

        HashMap<String, String> ssMap = new HashMap<>();

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(KEY_SIZE);

        //生成密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();

        String pub = new String(Base64.getEncoder().encode(pubKey.getEncoded()));
        String pri = new String(Base64.getEncoder().encode(priKey.getEncoded()));
        System.out.println("公钥:" + pub);
        System.out.println("私钥:" + pri);

        ssMap.put("publicKey",pub);
        ssMap.put("privateKey",pri);
        return ssMap;
    }

    /**
     * 生成的公钥和私钥文件,最好放到项目的classpath下,以便app读取
     */
    private static void  genRSAKeyFile(){
        HashMap<String, String> ssMap = new HashMap<>();
        try {
            ssMap = createBase64RSAKey();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        if (CollUtil.isNotEmpty(ssMap)){
            File pubKeyFile = FileUtil.writeBytes(ssMap.get("publicKey").getBytes(),
                    "D:/rsa2/rsa_public.key");
            System.out.println(pubKeyFile.getAbsolutePath());

            File priKeyFile = FileUtil.writeBytes(ssMap.get("privateKey").getBytes(),
                    "D:/rsa2/rsa_private.key");
            System.out.println(priKeyFile.getAbsolutePath());

        }

    }

    public static void main(String[] args) {
        genRSAKeyFile();
    }



}

RSA加解密工具类

package cn.demo.rsa;

import cn.hutool.core.io.FileUtil;

import javax.crypto.Cipher;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class RSAjjmUtils {

    /**
     * rsa加密
     * @param yw  原文
     * @param rsaPublicKeyFilePath  rsa公钥文件路径
     * @return 密文
     * @throws Exception
     */
    public static String encrypt(String yw,String rsaPublicKeyFilePath) throws Exception {
        String utf8StringPubk = FileUtil.readUtf8String(rsaPublicKeyFilePath);
        byte[] publicKeyBytes = utf8StringPubk.getBytes();
        X509EncodedKeySpec x =
                new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyBytes));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey pubKey = keyFactory.generatePublic(x);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);

        byte[] result = cipher.doFinal(yw.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(result);
    }


    /**
     * rsa解密
     * @param mw  密文
     * @param rsaPrivateKeyFilePath rsa私钥文件路径
     * @return 原文
     * @throws Exception
     */
    public static String decrypt(String mw,String rsaPrivateKeyFilePath) throws Exception{
        String utf8StringPrik = FileUtil.readUtf8String(rsaPrivateKeyFilePath);
        byte[] privateKeyBytes = utf8StringPrik.getBytes();
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec =
                new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyBytes));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey priKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);

        byte[] result = cipher.doFinal(Base64.getDecoder().decode(mw));
        return new String(result);

    }


    public static void main(String[] args) throws Exception {
//        File pubKeyFile = FileUtil.file("D:/rsa2/rsa_public.key");
        File pubKeyFile = FileUtil.file("classpath:rsa_public.key");
        String encryptStr = encrypt("20230609", pubKeyFile.getPath());
        System.err.println(encryptStr); //密文每次都不一样

//        File filePrk = FileUtil.file("D:/rsa2/rsa_private.key");
        File filePrk = FileUtil.file("classpath:rsa_private.key");
        String decryptStr = decrypt(encryptStr, filePrk.getPath());
        System.err.println(decryptStr); //解出的明文都是 20230609
    }



}


文章来源地址https://www.toymoban.com/news/detail-615298.html

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

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

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

相关文章

  • 从加密到签名:如何使用Java实现高效、安全的RSA加解密算法?

    目录 1. 接下来让小编给您们编写实现代码!请躺好 ☺ 1.1 配置application.yml文件 1.2 RSA算法签名工具类 1.3  RSA算法生成签名以及效验签名测试 1.4 RSA算法生成公钥私钥、加密、解密工具类 1.5 RSA算法加解密测试 我们为什么要使用RSA算法来进行加解密?  RSA 加密算法是一种非对

    2024年02月12日
    浏览(55)
  • 前后端RSA互相加解密、加签验签、密钥对生成(Java)

    最近有一些安全性要求比较高的场景,我们提供API给第三方商户用于收单,其中有几个功能是绑卡、ATM/POS密码变更。 出于合规和监管要求,第三方商户不能保存卡号、CVV、密码等敏感信息,所以相关的敏感操作必须在接口提供方H5页面中完成。为了最大程度保证安全性,我们

    2024年02月02日
    浏览(51)
  • Java加解密(四)非对称加密

    非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 也称公开密钥加密

    2024年02月10日
    浏览(48)
  • 4.Java开源RSA/SM2非对称加密算法对比介绍

    前期内容导读: Java开源RSA/AES/SHA1/PGP/SM2/SM3/SM4加密算法介绍 Java开源AES/SM4/3DES对称加密算法介绍及其实现 Java开源AES/SM4/3DES对称加密算法的验证说明 非对称加密 主要是指 秘钥对 是非对称的(相对于 对称加密 而言),简单理解就是加密秘钥和解密秘钥不同,一般叫做公钥和私

    2024年02月14日
    浏览(46)
  • 国密SM4对称加密Java加解密

    提示:国密SM4对称加密Java加解密 国家密码管理局 参考博文 SM4.0(原名SMS4.0)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布。相关标准为“GM/T 0002-2012《SM4分组密码算法》(原SMS4分组密码算法)”。 SM4 代码如下(示例): 在密码学中

    2024年02月11日
    浏览(54)
  • vue前端RSA加密java后端解密的方法

    最近安全测试的总是测出安全漏洞来,让开发改。 想了想干脆把请求参数都加密下,前端加密后端解密,这样总差不多了。 看了下AES加密,是对称的,前后端用这个不太行。 于是想到用RSA加密,是非对称的,可以前端加密后端解密。 1.前端是vue项目,使用时,需要先执行:

    2023年04月21日
    浏览(48)
  • springboot + vue 前后端加密传输 RSA互相加解密、加签验签、密钥对生成

    参考 由于Java非对称加解密、加验签都是采用PKCS#8格式的密钥,PKCS#1格式的密钥跑不通,这里先简单介绍一下两者的区别。 PKCS#1和PKCS#8是两个不同的数字证书标准。 PKCS#1是一个公钥加密标准,它定义了使用RSA算法进行加密和签名的格式。主要用于对数字签名、加密以及数字签

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

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

    2024年02月06日
    浏览(76)
  • 【RSA加密/解密】PKCS1_OAEP和PKCS1_v1_5两种填充方案【python RSA密钥对生成、密码加密、密文解密、pycharm安装Crypto】

    一、PKCS1_OAEP和PKCS1_v1_5是公钥加密标准中的两种填充方案。 PKCS1_OAEP(Optimal Asymmetric Encryption Padding)是一种更安全的填充方案,它提供了更好的安全性和抗攻击性。它使用随机数进行填充,并引入了哈希函数来增加安全性。 PKCS1_v1_5是较旧的填充方案,它使用固定的填充字节序

    2024年02月06日
    浏览(61)
  • C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现

    一种既简单速度又快的加密方式,加密与解密使用的都是同一个密钥,别名又叫做:单密钥加密;对称加密有很多公开算法,并且因为它效率很高,所以适用于加密大量数据的场合;但其密钥的传输过程是不安全的,并且容易被破解,密钥管理起来也相对麻烦。 需要两个密钥

    2024年02月09日
    浏览(68)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包