java使用RSA工具进行信息加解密

 更新时间:2023年12月17日 11:32:34   作者:大白猫~  
我们在开发中需要对用户敏感数据进行加解密,比如密码等信息,这篇文章主要为大家详细介绍了java如何使用RSA工具进行信息加解密,感兴趣的小伙伴可以了解下

我们在开发中需要对用户敏感数据进行加解密,比如密码

这边科普一下RSA算法

RSA是非对称加密算法,与对称加密算法不同;在对称加密中,相同的密钥用于加密和解密数据,因此密钥的安全性至关重要;而在RSA非对称加密中,有两个密钥,一个是公钥,用于加密数据,另一个是私钥,用于解密数据;这意味着公钥可以公开分发,而私钥必须保持秘密;

RSA非对称加密的主要应用包括:

数据加密:使用接收者的公钥加密数据,只有拥有相应私钥的接收者才能解密;

数字签名:使用发送者的私钥对数据签名,接收者可以使用发送者的公钥验证签名,确保数据的完整性和来源的真实性;

密钥协商:RSA也用于安全协议中,如TLS/SSL,用于安全地交换对称加密密钥,从而实现保密通信;

非对称加密算法提供了更高的安全性,因为加密和解密使用不同的密钥,攻击者无法从公钥推导出私钥;但由于非对称加密计算成本高昂,通常不用于大规模数据的加密,而是用于安全协商和数字签名等场景

今天就实现了一个RSA工具类,可以很轻松的对数据进行加解密

不需要加依赖,代码如下

public class RSAUtils {
 
    /**
     * @param plaintext 要加密的字符串
     * @param publicKeyStr 传入的公钥,是一个字符串
     * @return 加密后的字符串, 以Base64编码的形式返回
     * @throws Exception 异常
     * 这个方法接受一个要加密的字符串和一个公钥字符串,使用公钥进行加密,然后返回加密后的字符串
     */
    public static String encrypt(String plaintext, String publicKeyStr) throws Exception {
        PublicKey publicKey = getPublicKeyFromString(publicKeyStr);
 
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
 
        byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }
 
 
    /**
     * @param encryptedText 要解密的字符串
     * @param privateKeyStr 传入的私钥,是一个字符串
     * @return 解密后的原始字符串
     * @throws Exception 异常
     * 这个方法接受一个要解密的字符串和一个私钥字符串,使用私钥进行解密,然后返回解密后的原始字符串
     */
    public static String decrypt(String encryptedText, String privateKeyStr) throws Exception {
        PrivateKey privateKey = getPrivateKeyFromString(privateKeyStr);
 
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
 
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes);
    }
 
    /**
     * @return
     * @throws Exception
     * 随机生成一个长度为2048的RSA公私钥对
     */
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        return keyPairGenerator.generateKeyPair();
    }
 
    /**
     * @param publicKey
     * @return
     * 拿出刚生成Base64格式的私钥对的公钥字符串
     */
    public static String publicKeyToString(PublicKey publicKey) {
        return Base64.getEncoder().encodeToString(publicKey.getEncoded());
    }
 
    /**
     * @param privateKey
     * @return
     * 拿出刚生成Base64格式的私钥对的私钥字符串
     */
    public static String privateKeyToString(PrivateKey privateKey) {
        return Base64.getEncoder().encodeToString(privateKey.getEncoded());
    }
 
    /**
     * @param publicKeyStr
     * @return 公钥私钥对象
     * @throws Exception
     * 将刚拿出的Base64格式的私钥对的私钥字符串生成公钥对象
     */
    public static PublicKey getPublicKeyFromString(String publicKeyStr) throws Exception {
        byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
        X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePublic(spec);
    }
 
    /**
     * @param privateKeyStr
     * @return
     * @throws Exception
     * 将刚拿出的Base64格式的私钥对的私钥字符串生成私钥对象
     */
    public static PrivateKey getPrivateKeyFromString(String privateKeyStr) throws Exception {
        byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privateKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(spec);
    }
 
    public static void main(String[] args) throws Exception {
        // 生成RSA密钥对
        KeyPair keyPair = generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
 
        // 将公钥和私钥转换为字符串
        String publicKeyStr = publicKeyToString(publicKey);
        String privateKeyStr = privateKeyToString(privateKey);
 
        System.out.println("公钥: " + publicKeyStr);
        System.out.println("私钥: " + privateKeyStr);
 
        // 加密和解密测试
        String plaintext = "大白猫真厉害";
        String encryptedText = encrypt(plaintext, publicKeyStr);
        System.out.println("加密后的子串: " + encryptedText);
 
        String decryptedText = decrypt(encryptedText, privateKeyStr);
        System.out.println("解密后的子串: " + decryptedText);
    }
}

结果如下

将数据用公钥加密,用私钥解密,这样就可以了

到此这篇关于java使用RSA工具进行信息加解密的文章就介绍到这了,更多相关java RSA信息加解密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot如何读取resources目录下的文件

    SpringBoot如何读取resources目录下的文件

    这篇文章主要介绍了SpringBoot如何读取resources目录下的文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式为ZIP模式)

    基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式为ZIP模式)

    Maven是一个插件执行框架,所有工作都由插件完成,同时 Maven 基于构建生命周期的核心概念,明确定义了构建和分发特定工件(项目)的过程,接下来通过本文给大家介绍下基于spring-boot-maven-plugin插件打包lib文件外置(layout模式为ZIP模式),需要的朋友可以参考下
    2022-09-09
  • MyBatis中的自定义TypeHandler详解

    MyBatis中的自定义TypeHandler详解

    这篇文章主要介绍了MyBatis中的自定义TypeHandler详解,定义的 typeHandler 泛型为 String,显然我们要把数据库的数据类型转化为 String 型,然后实现设置参数和获取结果集的方法,需要的朋友可以参考下
    2023-07-07
  • Java学习之异常处理的新特性详解

    Java学习之异常处理的新特性详解

    异常处理机制是Java很早时就搞出来的技术,但在实际应用中,我们发现这个异常处理也有一些不完善的地方,接下来主要给大家介绍一下Java异常处理的一些新特性,需要的朋友可以参考下
    2023-08-08
  • Java获取上月份最后一天日期8位的示例代码

    Java获取上月份最后一天日期8位的示例代码

    这篇文章主要介绍了Java获取上月份最后一天日期8位,需要的朋友可以参考下
    2022-09-09
  • 完美解决Java中的线程安全问题

    完美解决Java中的线程安全问题

    下面小编就为大家带来一篇完美解决Java中的线程安全问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • spring boot学习笔记之操作ActiveMQ指南

    spring boot学习笔记之操作ActiveMQ指南

    ActiveMQ是一种开源的基于JMS规范的一种消息中间件的实现,ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件,这篇文章主要给大家介绍了关于spring boot学习笔记之操作ActiveMQ指南的相关资料,需要的朋友可以参考下
    2021-11-11
  • Maven实战之搭建Maven私服和镜像的方法(图文)

    Maven实战之搭建Maven私服和镜像的方法(图文)

    本篇文章主要介绍了搭建Maven私服和镜像的方法(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java实现短信验证码详细过程

    Java实现短信验证码详细过程

    这篇文章主要给大家介绍了关于Java实现短信验证码的相关资料, 在业务需求中我们经常会用到短信验证码,比如手机号登录、绑定手机号、忘记密码、敏感操作等,需要的朋友可以参考下
    2023-09-09
  • springboot简单接入websocket的操作方法

    springboot简单接入websocket的操作方法

    这篇文章主要介绍了springboot简单接入websocket的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05

最新评论