对称加密中,我们只需要一个密钥,通信双方同时持有。而非对称加密需要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));
}

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

Hutool 实现非对称加密(RSA)的更多相关文章

  1. Crypto++应用:非对称加密RSA

    1,非对称加密RSA: (1)乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥则是保密的. (2)甲方获取乙方的公钥,然后用它对信息加密. (3)乙方得到加密后的信息,用私钥解密. ...

  2. 非对称加密RSA的应用及在C#中的实现

    quote: http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html   一说到数据的加密,常常会涉及到这几个单词: ...

  3. 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法

          非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密:如果用私 ...

  4. Asp.Net 常用工具类之加密——非对称加密RSA算法

    踏入程序员这个行业也有几年了,几年中有收获(技术加强),有付出(时间和亚健康状态).当然喏,并不后悔,代码路还长!!! On The Way,永不止步!!! 开发过程中也积累了一些自己的经验.代码块和 ...

  5. 非对称加密RSA的C#实现

    1.对称加密算法 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). 对称加密有很多种算法,由于它效率很高,所 ...

  6. 加密算法之非对称加密RSA

    一:非对称加密的由来 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有 ...

  7. python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA

    加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...

  8. PHP非对称加密-RSA

    对称加密算法是在加密和解密时使用同一个密钥.与对称加密算法不同,非对称加密算法需要两个密钥--公开密钥(public key)和私有密钥(private key)进行加密和解密.公钥和密钥是一对,如果 ...

  9. openssl 非对称加密 RSA 加密解密以及签名验证签名

    1. 简介 openssl  rsa.h 提供了密码学中公钥加密体系的一些接口, 本文主要讨论利用rsa.h接口开发以下功能 公钥私钥的生成 公钥加密,私钥解密 私钥加密,公钥解密 签名:私钥签名 验 ...

  10. javascript版前端页面RSA非对称加密解密

    最近由于项目需要做一个url传参,并在页面显示参数内容的需求,这样就会遇到一个url地址可能会被假冒, 并传递非法内容显示在页面的尴尬情况 比如xxx.shtml?server=xxx是坏人& ...

随机推荐

  1. 问题:深度学习时代的初期最为火热的AI安全问题已经很少有人讨论了,那么是不是已经解决该问题了呢?

    答案: 先说结果,该问题并没有被解决. 之所以该问题已经不是最初的那么火热的讨论和研究热点了,其主要原因是大家发现这个神经网络在深度学习时代是十分的work的,虽然AI安全问题一直没有解决,但是比较发 ...

  2. 干货分享:Air700ECQ的硬件设计,第二部分

    ​ 接下来分享第二部分. 3.10. 功能管脚 3.10.1. MAIN_RI 管脚名 类型 序号 电压域 作用 MAIN_RI DO 5 LDOAON 振铃信号,唤醒输出管脚,用于唤醒AP 表格 1 ...

  3. vue前端分页多条件搜索

    vue前端分页多条件搜索 fliterData() { if (this.query_syscode || this.query_version || this.query_group || Stri ...

  4. PHP开源项目之YOURLS

    YOURLS是一个开源的PHP的程序,可以利用它来构建属于自己的URL缩短服务,YOURLS还可以集成到WordPress博客中使用. YOURLS 的主要功能: 公开的(Public 任何人都可以用 ...

  5. 销讯通CRM客户关系管理系统的功能拆分

    随着技术的发展,CRM系统(客户关系管理)成为企业不可或缺的工具,本文从医药行业角度简要谈谈CRM系统的功能. 从业务的理解来说,从医药行业来说,CRM客户管理系统的有以下几部分功能: 01 客户的分 ...

  6. WPF下,控件未响应鼠标属性触发器

    WPF下,控件未响应鼠标属性触发器 记一次自定义控件调试 问题现象 问题分析 解决方式 记一次自定义控件调试 使用WPF写了个自定义控件,其中有个Button按钮,重写了样式模板 <Button ...

  7. 【原创】ARM64 实时linux操作系xenomai4(EVL)构建安装简述

    目录 0 环境说明 1 内核构建 2 库编译 方式1 交叉编译 方式2 本地编译 3 测试 单元测试 hectic:EVL 上下文切换 latmus:latency测试 4 RK3588 xenoma ...

  8. Mplus数据分析:分段潜增长模型,看jama如何玩转纵向数据的轨迹

    今天给大家介绍分段潜增长模型的原理和做法,之前我有给大家写增长混合和潜增长,它们的主要的局限在于轨迹都是连续的不能分段,在于对phasic的现象把握其实还是不够的,比如儿童认知的发展,按照理论,它是可 ...

  9. Dart代码混淆

    Dart代码混淆 代码混淆是修改应用程序的二进制文件以使其更难被人类理解的过程.混淆会在编译后的 Dart 代码中隐藏函数和类名称,将每个符号替换为另一个符号. Flutter 的代码混淆仅适用于re ...

  10. PHP 简易的BASE64加密

    有这样一个有趣的公式:x<100;  (x*53*17)%100 = x;这个公司的原理:53*17=901,x*901,的数后2位数还是x:任何符合 a * b = 100 * n +1 的值 ...