首页 > 其他分享 >RSAUtils 非对称加密hutool

RSAUtils 非对称加密hutool

时间:2024-05-30 15:47:57浏览次数:14  
标签:String hutool rsa static RSAUtils new import 非对称 byte

1、

使用hutool的rsa加解密工具,自定义公钥私钥字符串

2、

import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.CN;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

@Slf4j
public class RSAUtils {
    private static RSA rsa;

    static {
        try {
            rsa = new RSA();
            rsa.setPublicKey(getPublicKeyFromPem("pem/public.pem"));
            rsa.setPrivateKey(getPrivateKeyFromPem("pem/private.pem"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String s1 = "大概和我说fadg`12@$%&+%";
        String s2 = encrypt(s1);
        String s3 = decrypt(s2);
        System.out.printf("======== \ns1=%s \ns2=%s \ns3=%s \ns1.equals(s3)=%s \n", s1, s2, s3, s1.equals(s3));
    }

    public static String encrypt(String data) {
        String cc = rsa.encryptBase64(data, KeyType.PublicKey);
        return cc;
    }

    public static String decrypt(String data) {
        String cc = rsa.decryptStr(data, KeyType.PrivateKey);
        return cc;
    }

    public static byte[] encrypt(byte[] data) {
        byte[] bytes = rsa.encrypt(data, KeyType.PublicKey);
        return bytes;
    }

    public static byte[] decrypt(byte[] data) {
        byte[] bytes = rsa.decrypt(data, KeyType.PrivateKey);
        return bytes;
    }

    private static PrivateKey getPrivateKeyFromPem(String fileName) {
        try {
            String str = getResourceFileContent(fileName);
            byte[] b = Base64Decoder.decode(str);
            KeyFactory kf = KeyFactory.getInstance("RSA");
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(b);
            PrivateKey privateKey = kf.generatePrivate(keySpec);
            return privateKey;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static PublicKey getPublicKeyFromPem(String fileName) {
        try {
            String str = getResourceFileContent(fileName);
            byte[] b = Base64Decoder.decode(str);
            KeyFactory kf = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(b);
            PublicKey pubKey = kf.generatePublic(keySpec);
            return pubKey;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static String getResourceFileContent(String fileName) {
        InputStream publicKeyStream = RSAUtils.class.getClassLoader().getResourceAsStream(fileName);
        try (BufferedReader br = new BufferedReader(new InputStreamReader(publicKeyStream))) {
            String line;
            StringBuilder str = new StringBuilder();
            while (CN.isNotEmpty((line = br.readLine()))) {
                if (line.startsWith("-")) {
                    continue;
                }
                str.append(line);
            }
            return str.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

标签:String,hutool,rsa,static,RSAUtils,new,import,非对称,byte
From: https://www.cnblogs.com/kikyoqiang/p/18222495

相关文章

  • JSON里包含的数组中的值 (List数组或对象)转换出来并读取, 通过 hutool 中的API 方法
    hutool 是一个Java工具包,它提供了很多实用的功能,包括JSON的处理。在 hutool 中,你可以使用 cn.hutool.json.JSONUtil 类来解析和处理JSON数据。如果你想要获取JSON中的数组(JSONArray),并遍历读取其中的值(无论是基本类型还是对象),你可以按照以下步骤操作:首先,确保你的项目......
  • 关于SpringBoot项目使用Hutool工具进行json序列化时出现Null值过滤或者丢失的问题(转
    ##问题描述:SpringBoot项目中,一直使用的时Hutool的json转换工具,被强制要求不能使用fastJson工具;之前都没什么问题,突然有一次使用parseObj()进行json字符串转换json对象时,突然报错:Noserializerfoundforclasscn.hutool.json.JSONNullandnopropertiesdiscoveredtocreate......
  • 三种非对称加密算法比较,以及JWT中的对应
    非对称密钥加密算法RSA:RSA是一种非对称加密算法,它需要使用两个密钥:公开密钥(publickey)和私有密钥(privatekey)。如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;反之,如果用私有密钥对数据进行加密,则只有用对应的公开密钥才能解密。DSA:DSA(DigitalSignature......
  • Hutool 只复制不为空的属性
    在使用Hutool的工具类进行复制时,有时候需要只复制不为空的属性。比如在修改时,先把数据库中的数据查出来:SysAreasysArea=getById(dto.getId());此时再以传入值复制到数据库表对象中,但如果传入值中有属性为null,会将数据库表对象的属性也设为null,修改时这些属性就会被清空,......
  • 非对称加密中,加解密和签名
    在非对称加密中,加解密使用的密钥取决于具体的用途:加密:通常情况下,当想要确保数据的机密性,即希望只有特定接收方能够读取信息时,发送方会使用接收方的公钥对数据进行加密。这样一来,只有拥有对应私钥的接收方才能够解密并查看原始信息。解密:对应地,接收方收到加密后的数据后,......
  • 使用非对称加密加密文件
    概述通常,非对称加密有较低的性能,如果对大文件直接使用非对称加密可能导致高负载和高耗时(过大的文件还有可能出现报错RSA_padding_add_PKCS1_type_2:datatoolargeforkeysize)。因此对于大文件的加密,一般使用密码短语(passphrase)进行加密,然后使用非对称加密来加密密码短语(pas......
  • 国密 SM2 的非对称加密解密过程
    国密SM2的非对称加密解密过程椭圆曲线椭圆曲线是由一组方程描述的点的集合:y2=x3+ax+b其中a,b满足(4a3+27b2≠0)SM2定义了一个sm2p256v1的椭圆曲线方程各种参数BigIntegerp=FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFF......
  • 国密 SM2 的非对称签名验签过程
    国密SM2的非对称签名验签过程介绍非对称加密确保了消息传输中的保密性,但是由于使用公钥加密,而公钥是分发出去的,可能泄露,谁都可以使用公钥加密发送消息。因此为了保证收到的消息是由对应的发送者发出的,就需要用到非对称签名和验签逻辑,发送者通过自己的私钥进行对消息进行签名,......
  • hutool发送请求
    get请求Stringbody=HttpUtil.createGet("www.baidu.com").execute().body();post请求//构建表单POST请求HttpRequestrequest=HttpRequest.post(url).header("Content-Type","application/x-www-form-urlencoded")//表单类型的Content-......
  • 如何用加密技术守护你的数字世界(4):非对称加密
    该文章Github地址:https://github.com/AntonyCheng/encryption-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况......