公钥私钥?一文搞懂非对称加密

非对称加密

非对称加密:

  • 通信双方分别创建公钥和私钥,
  • 并且保证公钥所加密的信息,只有配对的私钥可以解密,
  • 接下来,双方公开交换公钥,通信时,使用对方的公钥进行加密,
  • 如此,就能确保对方能够通过自己的私钥解密
    在这里插入图片描述

在这里插入图片描述

加密算法RSA

按RSA的固定步骤:
在这里插入图片描述

  1. 选择素数

    • 随机选择两个大素数,通常表示为p和q。
  2. 计算乘积

    • 计算两个素数的乘积n,即n = p * q。
  3. 计算欧拉函数

    • 计算n的欧拉函数φ(n),其中φ(n) = (p-1) * (q-1)。
  4. 选择公钥

    • 选择一个整数e,满足1 < e < φ(n),并且e与φ(n)互质。通常,公钥是一个包含两个部分的数对(e, n)。
  5. 计算私钥

    • 计算私钥d,使得e * d ≡ 1 (mod φ(n))。通常,私钥是一个包含两个部分的数对(d, n)。
  6. 加密数据

    • 使用接收者的公钥(e, n),对要传输的数据进行加密。加密操作通常是将明文m的e次方,然后取模n,得到密文c:c = m^e mod n。
  7. 解密数据

    • 接收者使用自己的私钥(d, n)对密文进行解密。解密操作通常是将密文c的d次方,然后取模n,得到明文m:m = c^d mod n。
/*** RSA非对称加密算法客户端*/
@Slf4j
public class RSAClient {/*** 生成两个质数*/public List<Integer> getTwoPrime() {List<Integer> primes = new ArrayList<>();int len=0;while (len<2) {Random random = new Random();int num = random.nextInt(500);if (isPrime(num)) {primes.add(num);len++;}}log.info("(1)生成两个质数:{}", primes);return primes;}private boolean isPrime(int num) {for (int i = 2; i < Math.sqrt(num); i++) {if (num % i == 0) {return false;}}return true;}/*** 计算n,m*/public Map<String, Integer> getNAndM(List<Integer> primes) {if (primes.size() != 2) {throw new IllegalArgumentException("只接受两个质数");}Integer prime1 = primes.get(0);Integer prime2 = primes.get(1);Map<String, Integer> map = new HashMap<>();//核心算法map.put("n", prime1 * prime2);map.put("m", (prime1 - 1) * (prime2 - 1));log.info("n,m:{}", map);return map;}/*** 随机选出m的一个质数,该质数为正且小于m*/public Integer getPrime(Integer m) {while (true) {Random random = new Random();int e = random.nextInt(m);while (e == 0) {e = random.nextInt(m);}if (getGCD(e, m) == 1) {return e;}}}/*** 欧几里得算法:a,b最大公因数等于b,a%b的最大公因数,当两数的最大公因数是1时,两数互质,初始时,a<b*/private int getGCD(int a, int b) {if (b == 0) {return a;}return getGCD(b, a % b);}/*** 通过扩展欧几里得算法获得d,d满足:(d * e) % m =1*/public int getD(int e, int m) {int d = 1;while (true) {if ((d * e) % m == 1) {break;}d++;}return d;}/*** 加密*/public byte[] encrypt(String content,Integer n,Integer e) {//2.利用公钥加密//2.1原文转成数字串List<Integer> integers = new ArrayList<>();for (byte b : content.getBytes()) {integers.add(((int) b ^e) % n);}Byte[] bytes = integers.stream().map(integer -> (byte) integer.intValue()).toArray(Byte[]::new);byte[] result = new byte[bytes.length];for (int i = 0; i < bytes.length; i++) {result[i]= bytes[i];}return result;}/*** 解密* */public String decrypt(byte[] bytes,Integer n,Integer m,Integer e){//获取私钥int d = getD(e, m);log.info("私钥:({},{})",d,n);byte[] result = new byte[bytes.length];for (int i = 0; i < bytes.length; i++) {int num = bytes[i];result[i]= (byte) ((num^e)%n);}return new String(result);}public static void main(String[] args) {RSAClient rsaClient = new RSAClient();//计算公钥Map<String, Integer> nAndM = rsaClient.getNAndM(rsaClient.getTwoPrime());Integer n = nAndM.get("n");Integer m = nAndM.get("m");Integer e = rsaClient.getPrime(m);log.info("公钥:({},{})", e, n);//加密byte[] bytes = rsaClient.encrypt("hello world",n,e);log.info("密文:{}", new String(bytes));//解密String decrypt = rsaClient.decrypt(bytes, n, m, e);log.info("解密:{}",decrypt);}}

效果:

2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] (1)生成两个质数:[4, 127]
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] n,m:{m=378, n=508}
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] 公钥:(85508)
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] 密文:=099:u":'91
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] 私钥:(169,508)
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] 解密:hello world

RSA原理

在这里插入图片描述

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

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

相关文章

java 内部类理解

一、简介 在Java中&#xff0c;可以将一个类定义在另一个类里面或者一个方法里面&#xff0c;这样的类称为内部类。广泛意义上的内部类一般来说包括这四种&#xff1a;成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。 二、成员内部…

代码随想录day55 | 动态规划P15 | ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的…

国内小白用什么方法充值使用ChatGPT4.0?

首先说一下IOS礼品卡订阅&#xff0c;目前最经济实惠的订阅方式&#xff0c;具体操作步骤 使用IOS设备充值&#xff0c;用 App Stroe 兑换券 1、支付宝地址切换旧金山&#xff0c;在里面买app store 的兑换卷 2、美区Apple ID登陆app store &#xff0c;充值兑换券 3、IOS设…

JavaScript中的事件模型

JavaScript中的事件模型分为&#xff1a;事件和事件流、原始事件、标准事件和IE事件。 事件与事件流 JavaScript中的事件&#xff0c;可以理解为HTML文档或者浏览器中发生的一种交互操作&#xff0c;让网页有互动的功能。常见的事件就是加载事件、鼠标事件和自定义事件。 因…

Find My资讯|苹果设备在修复期间可以保持启用“Find My“功能

iOS 17.5 中有一项名为"维修状态"的新功能&#xff0c;可让送修的设备保持启用"查找我的"&#xff08;Find My&#xff09;功能。此前&#xff0c;用户在送修设备时必须禁用跟踪设备位置的"查找我的"功能&#xff0c;但iOS 17.5发布后&#xff0…

vscode远程免密ssh原理与实操方法

什么是SSH SSH是一种加密协议&#xff0c;全称为Secure Shell&#xff0c;用于安全地远程登录到服务器或其他远程设备上执行命令或传输文件。它提供了一种安全的加密通信机制&#xff0c;使得远程登录和文件传输等操作不会被恶意攻击者窃取或篡改&#xff0c;确保了数据的保密…

Jackson系统开发方法

1、Jackson分析方法是面向数据流的分析方法。这一方法从目标系统的输入、输出数据结构入手&#xff0c;导出程序框架结构&#xff0c;再补充其它细节&#xff0c;就可得到完整的程序结构图。 2、应用场景&#xff1a;这一方法对输入、输出数据结构明确的中小型系统特别有效&am…

数据库(MySQL)—— 初识和创建用户

数据库&#xff08;MySQL&#xff09;—— 初识 什么是数据库数据库的种类创建用户mysql -h 主机名或IP地址 -u 用户名 -p 登录mysqlSELECT USER(); 查看当前用户切换用户GRANT ALL PRIVILEGES ON 赋予用户权限 REVOKE 撤销权限示例注意事项 MySQL的图形化界面工具查看所有用户…

【oracle数据库安装篇三】Linux6.8单机环境oracle11g容灾ADG搭建

说明 DataGuard 是在主节点与备用节点间通过日志同步来保证数据的同步&#xff0c;可以实现数据库快速切换与灾难性恢复。用户能够在对主数据库影响很小的情况下&#xff0c;实现主备数据库的同步。 关联文章 【oracle数据库安装篇一】Linux5.6基于LVM安装oracle11gR2单机 【…

追踪攻击数据包中的真实IP地址:方法与技巧

在网络安全领域&#xff0c;追踪攻击数据包中的真实IP地址是一项至关重要的任务。通过确定攻击者的真实IP地址&#xff0c;可以有效地识别和阻止网络攻击行为&#xff0c;提高网络安全防御水平。IP数据云IP地址查询将介绍几种常用的方法和技巧&#xff0c;帮助安全人员有效追踪…

嵌入式C语言教程:实现气压监测系统

气压监测在气象学、航空和户外活动装备中非常重要。本教程将介绍如何在STM32微控制器上使用数字气压传感器实现实时气压监测系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32L476RG&#xff0c;具备低功耗特性和足够的处理能力。开发板&#xff1a;STM32L4 Disc…

CAXA 3D实体设计2024:塑造未来的创新引擎

在数字化时代的浪潮中&#xff0c;3D CAD实体建模设计正成为推动工业创新的核心动力。CAXA 3D实体设计2024&#xff0c;以其卓越的性能和丰富的功能&#xff0c;为企业和个人用户带来了前所未有的设计体验。 CAXA 3D实体设计2024不仅拥有直观易用的界面&#xff0c;还配备了强…

【Osek网络管理测试】[TG4_TC5]唤醒条件

&#x1f64b;‍♂️ 【Osek网络管理测试】系列&#x1f481;‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果 1.环境搭建 硬件&#xff1a;VN1630 软件&#xff1a;CANoe 2.测试目的 验证DUT验证DUT睡眠后被唤醒&#xff0c;并再次睡眠能否…

LINQ 提供了两种主要的查询语法:方法语法和查询表达式

LINQ 提供了两种主要的查询语法&#xff1a;方法语法和查询表达式。这两种语法在功能上是等价的&#xff0c;只是语法形式不同&#xff0c;开发人员可以根据个人偏好选择使用哪种。下面分别介绍这两种语法&#xff1a; 1. 方法语法&#xff1a; 方法语法是使用 LINQ 扩展方法来…

第七十三章 Apache (UNIX® Linux macOS) 的替代选项 - 替代选项 2:带有 NSD 的 CGI 模块 (nph-CSPcgi)

文章目录 第七十三章 Apache (UNIX Linux macOS) 的替代选项 - 替代选项 2&#xff1a;带有 NSD 的 CGI 模块 (nph-CSPcgi)替代选项 2&#xff1a;带有 NSD 的 CGI 模块 (nph-CSPcgi)映射其他文件类型使用 CGI 和 NSD 操作和管理 Web 网关 第七十三章 Apache (UNIX Linux macOS…

ZoomIt快捷键

ZoomIt快捷键 ZoomIt是一款非常实用的屏幕放大镜软件&#xff0c;可以帮助用户更好地查看电脑屏幕上的细节。一些主要功能包括: 放大镜功能 - 可以实时放大屏幕的任何部分&#xff0c;并支持多种视图模式如正常、灰度、反色等。取色器 - 可以精确获取屏幕上任何颜色的RGB值。…

关于二手车系统学习--登录模块

1.样式1-17行 <div class"cheader"><div style"width: 80%;margin: 0 auto;line-height: 50px;padding-top: 10px"><el-row><el-col:span"5"style"font-size: 20px;cursor: pointer;color: #00ae66;font-weight: bold…

typescript 不是特别常用,容易忘的知识点

1、花括号对象通过方括号字符串形式取值 let obj { name: asd, age: 21, salary: 400, desc: "asdasd", op: [asd, as, qwe] };for (let i in obj) {console.log(obj[i as keyof typeof obj]); }let key name; console.log(obj[key as name]); console.log(obj[ke…

富格林:正确杜绝欺诈实现出金

富格林悉知&#xff0c;现货黄金一直以来都是投资者们追逐的热门品种之一。其安全性和避险特性吸引着广大投资者。但在现货黄金市场中要想实现出金其实并不简单&#xff0c;是需要我们通过一定的技巧和方法去正确杜绝欺诈套路。下面为了帮助广大投资者正确杜绝欺诈实现出金&…

九、redis过期策略

目录 一、设置redis键的过期时间 1、删除过期时间 2、查看过期时间 二、过期删除策略 1、定时删除&#xff1a; 2、惰性删除&#xff1a; 3、定期删除&#xff1a; 4、惰性删除和定期删除配合使用 三、 1、设置redis最大内存 2、设置内存的淘汰方式 总结&#xff1…