首页 > 其他分享 >Hutool 实现非对称加密

Hutool 实现非对称加密

时间:2025-01-16 13:43:12浏览次数:1  
标签:公钥 加密 Hutool pem key import 私钥 非对称 public

目录
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

标签:公钥,加密,Hutool,pem,key,import,私钥,非对称,public
From: https://www.cnblogs.com/vipsoft/p/18674812

相关文章

  • 加密狗复制方法的探究
    在数字版权保护日益重要的今天,加密狗作为一种常见的硬件加密手段,被广泛应用于各类软件产品中,以防止软件被非法复制和使用。然而,在技术不断发展的背景下,对于加密狗复制方法的探讨也随之而来。一、硬件克隆方式芯片级克隆原理:这种方法是直接对加密狗内部的芯片进行分析和复制......
  • HTTP 与 HTTPS:从明文传输到安全加密的全面解析
    下面这篇博客旨在全方位解读HTTP与HTTPS的来龙去脉、核心原理以及在现代网络中的广泛应用。为了帮助读者真正理解这两种协议如何支撑互联网生态,本篇文章不仅会介绍HTTP的发展历程,也会深入浅出地阐述HTTPS如何在安全层面保护用户数据,并展望未来网络的演化趋势。希望这篇......
  • 【Ansible运维】让Ansible更安全:使用Vault进行加密
    管理目标节点时,有些操作需要使用密码才允许访问,但Ansible是一个自动化配置管理工具,在自动化操作的阶段中要求交互式输入密码的行为应该是一件让人败兴的事。通常,实现非交互式的方案有:(1)将敏感数据写入文件(比如写入变量文件),然后读取,这种方案不安全;(2)定义敏感数据对应的环境......
  • 编译原理笔记第一篇_天书_(加密的)
    小序Abstract余闻,古有大贤能者,怀大神通,俱玄妙幽深之大法也。若晓习之,可使铁石通得人言。尝想往之,然不知其所在,故不得往,不知其名号,故不得访。或问曰:何不问旁人矣?呜呼哀哉!今人者,多搬来搬去之徒,目光短浅之辈,生性愚钝,盲然自大,罔识大法,问之空徒劳矣!某日夜中,余寐,飘飘乎神往,往而遇一......
  • 学习 - Nginx -浅谈非对称加密的理解
    浅谈非对称加密的理解1、客户端首次访问服务器的时候,先访问443接口后获取到“公钥”并保存在客户端。2、客户端通过通过80端口在发送请求的时候,报文中的明文信息通过(公钥+算法)加密成密位进行发送。3、服务器端获取到密文以后,通过(私钥+算法)解密,获取到请求报文中原有的明......
  • 如何获取该网站特有的加密函数
    免责声明,只是记录学习中的笔记,也是为了方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。在渗透测试的过程中,很多网站都有自己特有的加密方式,我们要插入payload时缺因为不知道该网站的加密方式而卡住。学习过程中偶然间发......
  • 实战自动化加解密&加密场景下的暴力破解,黑客技术零基础入门到精通实战教程!
    场景拿到一个站,请求和响应中的数据均经过加密,但是我们想在测试中看到明文数据并可以修改前两天看到有个师傅的使用双层mitmproxy代理实现自动化加解密的思路,今天来实现一下。顺便回忆一下该场景下使用Yakit热加载进行数据暴力破解。思路请求:设置下游代理捕获浏览器......
  • C语言小作业——电话号码加密器
        请你设计一个电话号码程序:它可以接收用户输入的11位电话号码字符串(假设输入已经符合要求,因此不进行输入验证),并按照指定的加密规则对电话号码进行加密,然后输出加密后的虚拟号码。加密规则是:电话号码的前3位数字不变,从第4位开始,每一位数字的ASCII码值加上一个固定的......
  • 【Docker】Docker搭建一款开源的加密货币量化交易平台
    项目介绍Freqtrade是一个开源的加密货币量化交易平台,它允许用户通过编写和配置交易策略来自动化交易过程。功能特点开源性:Freqtrade的代码是开源的,这意味着用户可以查看、修改和扩展平台的功能。自动化交易:通过配置交易策略,Freqtrade可以自动执行买卖操作,无需人工干预。多交......
  • ZIP伪加密解析
    ZIP伪加密解析1、zip组成一个ZIP文件由三个部分组成:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志。一个zip文件由这样三个部分组成_zip文件结构_一只独孤的程序猿的博客-CSDN博客2、实例压缩源文件数据区:504B0304:这是头文件标记(0x04034b50)1400:解压文......