Hutool 实现非对称加密(RSA)

news/2025/1/16 13:44:31/文章来源:https://www.cnblogs.com/vipsoft/p/18674812

目录
  • 思路
    • 生成RAS密钥
    • 消息公钥加密、私钥解密
  • 代码Demo
    • 生成 A 的密钥
    • 生成 B 的密钥
    • A 发送消息给 B
    • B 解密 A 消息

image
对称加密中,我们只需要一个密钥,通信双方同时持有。而非对称加密需要4个密钥。通信双方各自准备一对公钥和私钥。其中公钥是公开的,由信息接受方提供给信息发送方。公钥用来对信息加密。私钥由信息接受方保留,用来解密。既然公钥是公开的,就不存在保密问题。也就是说非对称加密完全不存在密钥配送问题!

公钥只能用做数据加密。公钥加密的数据,只能用对应的私钥才能解密。

思路

生成RAS密钥

  • A 生成 A 的 私钥(private_key_A.pem)、公钥(public_key_A.pem)
  • B 生成 B 的 私钥(private_key_B.pem)、公钥(public_key_B.pem)
  • A 将公钥(public_key_A.pem) 交给 B
  • B 将公钥(public_key_B.pem) 交给 A

消息公钥加密、私钥解密

A 发消息给 B

  • A 用 B 的 公钥(public_key_B.pem),将消息加密,发给 B
  • B 收到消息后,用 私钥(private_key_B.pem),将消息进行解密

B 发消息给 A

  • B 用 A 的 公钥(public_key_A.pem),将消息加密,发给 A
  • A 收到消息后,用 A的私钥(private_key_A.pem),将消息进行解密

代码Demo

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import com.alibaba.fastjson.JSON;
import com.thoth.his.base.util.FileUtil;
import org.junit.jupiter.api.Test;import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.HashMap;
import java.util.Map;

生成 A 的密钥

/*** 生成 A 的公钥、私钥*/
@Test
public void generateKeyA() {KeyPair pair = SecureUtil.generateKeyPair(AsymmetricAlgorithm.RSA.getValue());PrivateKey privateKey = pair.getPrivate();PublicKey publicKey = pair.getPublic();//获得私钥String privateKeyStr = Base64.encode(privateKey.getEncoded());System.out.println("A私钥:" + privateKeyStr);FileUtil.writeString(privateKeyStr, "D:\\RAS\\private_key_A.pem");//获得公钥 -- 发给对方String publicKeyStr = Base64.encode(publicKey.getEncoded());System.out.println("A公钥:" + publicKeyStr);FileUtil.writeString(publicKeyStr, "D:\\RAS\\public_key_A.pem");
}

生成 B 的密钥

/*** 生成 B 的公钥、私钥*/
@Test
public void generateKeyB() {KeyPair pair = SecureUtil.generateKeyPair(AsymmetricAlgorithm.RSA.getValue());PrivateKey privateKey = pair.getPrivate();PublicKey publicKey = pair.getPublic();//获得私钥String privateKeyStr = Base64.encode(privateKey.getEncoded());System.out.println("B私钥:" + privateKeyStr);FileUtil.writeString(privateKeyStr, "D:\\RAS\\private_key_B.pem");//获得公钥 -- 发给对方String publicKeyStr = Base64.encode(publicKey.getEncoded());System.out.println("B公钥:" + publicKeyStr);FileUtil.writeString(publicKeyStr, "D:\\RAS\\public_key_B.pem");
}

A 发送消息给 B

/*** A 发消息给B ,用 B 的公钥进行加密*/
@Test
public void sendMsg() {String privateKeyStr = FileUtil.readUtf8String("D:\\RAS\\private_key_A.pem");String publicKeyStr = FileUtil.readUtf8String("D:\\RAS\\public_key_B.pem");RSA rsa = new RSA(privateKeyStr, publicKeyStr);System.out.println(rsa);Map<String, String> map = new HashMap<>();map.put("Name", "张三");map.put("Age", "30");String json = JSON.toJSONString(map);//公钥加密,私钥解密byte[] encrypt = rsa.encrypt(StrUtil.bytes(json, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);String msg = Base64.encode(encrypt);//将消息存文件,模拟HTTP传送,供B去解密FileUtil.writeString(msg, "D:\\RAS\\msg_A.txt");System.out.println("A 公钥加密后的内容:" + msg);
}

B 解密 A 消息

/*** B 收到 A 的消息,用 B 的私钥进行解密*/
@Test
public void receiveMsg() {String privateKeyStr = FileUtil.readUtf8String("D:\\RAS\\private_key_B.pem");String publicKeyStr = FileUtil.readUtf8String("D:\\RAS\\public_key_A.pem");//RSA rsa = new RSA(privateKeyStr, publicKeyStr);RSA rsa = new RSA(privateKeyStr, null); //单纯解密的话,可以不需要 A 的公钥String msgAStr = FileUtil.readUtf8String("D:\\RAS\\msg_A.txt");byte[] decrypt = rsa.decrypt(msgAStr, KeyType.PrivateKey);//把解密的结果转换成String字符串输出System.out.println("私钥解密:" + StrUtil.str(decrypt, StandardCharsets.UTF_8));
}

image

参考:https://zhuanlan.zhihu.com/p/436455172

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870098.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Node.js渗透】提取和分析 .asar 文件

#Electron 免责声明 ⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!书接上回以及上上回,在了解了操作系统上基于 Electron 的应用程序的安装和识别过程后,我们将探讨提取…

大模型微调基本概念指北

本文主要分享一下大模型微调相关的基本概念,包括大模型(GPT)训练流程、微调(SFT)方法&分类&框架&最佳实践、强化学习(RLHF),最后则是分享了如何训练垂直领域大模型。本文是参考网上博客、文章后进行总结而成,旨在让刚接触大模型的同学阅读后能对大模型训练的各个…

看了一个关于linux platform的好视频

视频地址: 《嵌入式Linux platform总线驱动与设备匹配的三种方式》 https://www.bilibili.com/video/BV134CFYqEki?buvid=YC4D5AC32B076A51424FACFDDBD3BD15822A&from_spmid=tm.recommend.0.0&is_story_h5=false&mid=PbeiH8sfJs5bwGp1257AQw%3D%3D&plat_id=1…

学习 - 人工智能- 大模型的演变和训练

大模型的演变和训练 大模型训练整体上分为三个阶段: 预训练、 SFT(监督微调)以及RLHF(基于人类反馈的强化学习)一、预训练 预训练的过程类似从婴儿成长成中学生的阶段,在这个阶段我们会学习各种各样的知识,我们的语言习惯、知识体系等重要部分都会形成;对于大模型来讲,在这…

RFID基础——概念与分类

RFID 的全称是射频识别技术(Radio Frequency Identification)。是一项利用射频信号通过空间耦合(交变磁场或电磁场)实现无接触信息传递并通过所传递的信息达到识别目的的技术。这项技术在日常生活中应用广泛,例如我国的第二代身份证、门禁卡、图书标签。 RFID与NFC的区别 …

(未完工)「学习笔记」二维数点问题

0.0 前言 看了一个晚上,加上同桌的讲解,大致了解了二维数点问题的基本思路。 0.1 前置知识可持久化线段树树状数组1.0 概述 二维数点问题的一般形式是形如“给定平面上 \(n\) 个点,每次询问给定一个矩形,求该位于矩形内的点的个数”一类问题,模板题为 P2163 [SHOI2007] 园…

CentOS扩容boot分区并升级内核

本文作者CVE-柠檬i:https://www.cnblogs.com/CVE-Lemon 前言 由于安装k8s需要升级内核,但我自己的的boot分区只有200M大小,无法安装新内核,所以干脆把swap分区分给boot了。在此期间关于grub的操作踩了好多坑,所以特此记录一下正确操作。 使用rpm安装新内核,下载链接:htt…

陨石的秘密

题目链接: https://www.acwing.com/problem/content/319/ 题目描述提取题目大意: 构造 L1对{},L2对[],L3对() 组成的深度为D的括号序列,求方案数。 并且中括号里不能有大括号,小括号里不能有中括号和大括号。 思路:考虑“第一段”括号序列(它作为一个整体,只能是{} []…

Xorto

给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为0。暴力,每次找一个中点,找左右两边异或值一样的区间 #include<bits/stdc++.h> #define int long long #define TEST #define TESTS int _; cin >> _; while(_--) using…

【OAuth2框架】理解和实战 OAuth2 认证授权

你知道互联网大厂最怕的是什么吗?但凡有点这样的风吹草动,我们就要花费大量的时间进行修复和上线。一点都不敢耽误,对于紧急类型的,基本当天发现,当天就要升级上线。那是什么问题呢?🤔 其实最怕的就是各类组件漏洞! 有这么一个东西,13scan - 安全漏洞扫描 它可以扫描…