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

非对称加密

非对称加密:

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

在这里插入图片描述

加密算法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://xiahunao.cn/news/3014786.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

PCB仿真:如何模拟PCB设计

当有人在学习如何驾驶汽车时,驾校老师会在模拟器上对他们进行培训,然后教他们如何在路上驾驶真正的汽车。在制造或使用产品或机器之前了解或测试其行为总是很好的。这样可以知道产品的外观和行为,如果它没有按照期望工作,总是可以做出改变。当不当操作的成本很高时,实际控…

ASP.NET MVC(三) 路由问题(一)

如果是int数据类型不传递id&#xff0c;则会报错&#xff0c;可以改成string id

电脑(爱好者) :基础知识1 了解你的电脑

读懂cpu 您想了解关于您的电脑的信息吗&#xff1f;CPuz是一款常用的系统信息工具&#xff0c;可以提供关于CPU、主板、内存等硬件信息的详细情况。您可以下载并运行该软件&#xff0c;然后查看您的电脑硬件配置信息。 图片来源于网络 CPU-Z 简介 CPU-Z 是一款功能强大且易于使…

flask网站开发计划

我想写一个flask开发网站的合集文章&#xff0c;该网站主要是采集网络上的文章&#xff08;不同站点&#xff0c;用Python识别出正文内容&#xff09;&#xff0c;然后做成长图形式&#xff0c;发布到flask站点&#xff0c;并提供“下载”按钮&#xff0c;点击下载按钮&#xf…

python-正则表达试-实践1

匹配html标签中的任意标签内数据 匹配所有包含’oo’的单词 import re text "JGood is a handsome boy, he is cool, clever, and so on..." re.findall(r\w*oo\w*, text) 匹配 html中title里面的内容 原文&#xff1a; import re file r./202304.html f open(…

Java设计模式 _结构型模式_享元模式

一、享元模式 1、享元模式 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型模式。主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。主要解决有大量对象时&#xff0c;有可能会造成内存溢出&#xff0c;我们把其中共同的部分抽象出来&#x…

洛谷 P3391:文艺平衡树 ← Splay树模板题

【题目来源】https://www.luogu.com.cn/problem/P3391【题目描述】 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一个有序数列。 其中需要提供以下操作&#xff1a;翻转一个区间&#xff0c;例如原有序序列是 5 4 3 2 1&#xff0c;翻转区间…

录屏软件哪个好用?这4款不容错过!

在现代社会中&#xff0c;信息的传递和分享变得越来越重要。一个好的录屏软件能够帮助我们将想要分享的信息快速直观地展示给他人。 通过下文推荐的4款录屏软件&#xff0c;我们可以轻松地分享自己的知识、经验和见解&#xff0c;让更多的人受益。 方法一&#xff1a;QQ软件进…

创意自我介绍视频制作软件有哪些?

创意自我介绍视频制作软件 在制作创意自我介绍视频时&#xff0c;有许多软件可供选择。以下是一些推荐的软件&#xff1a; 乐秀视频剪辑&#xff1a;这是一个被8亿用户选择的视频剪辑、视频制作与Vlog剪辑工具。它提供了丰富的视频编辑功能&#xff0c;帮助用户制作出高质量的…

Android iw 工具

代码位置:Android/external/iw 查看支持的命令: console:/ # iw help Usage: iw [options] command Options:--debug enable netlink debugging--version show version (4.1) Commands:help [command]Print usage for all or a specific command, e.g."…

长难句打卡5.7

In December 2010 America’s Federal Trade Commission (FTC) proposed adding a “do not track” (DNT) option to Internet browsers, so that users could tell advertisers that they did not want to be followed. 2010年12月&#xff0c;美国美国联邦贸易委员会(FTC)提…

(双指针)移动零 复写零 快乐数 盛水最多的容器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、移动零 1.1、题目 1.2、讲解算法原理 1.3、编写代码 二、复写零 2.1、题目 2.2、讲解算法原理 2.3、编写代码 三、快乐数 3.1、题目 3.…

如何应对访问国外服务器缓慢的问题?SDWAN组网是性价比之选

访问国外服务器缓慢通常由以下原因造成&#xff1a; 1、政策限制&#xff1a;我国管理互联网&#xff0c;限制部分国外网站和服务器&#xff0c;以维护国家安全稳定。 2、技术障碍&#xff1a;国内与国际互联网的网络架构和协议存在差异&#xff0c;可能导致数据传输不兼容。 …

XMall-Front:基于Vue.js的XMall商城前台页面的开发实践

XMall-Front&#xff1a;基于Vue.js的XMall商城前台页面的开发实践 摘要 随着电子商务的蓬勃发展&#xff0c;用户体验逐渐成为决定电商平台成功与否的关键因素。作为XMall商城项目的一部分&#xff0c;XMall-Front是基于Vue.js的前端页面开发&#xff0c;其目标是为用户提供…

【数据结构】带你轻松掌握算法的复杂度

引入&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

iPhone查看本机号码只需要这3招,不再为号码忘记犯愁!

在日常生活中&#xff0c;我们经常需要使用手机号码进行各种通讯活动&#xff0c;但有时候会忘记自己的手机号码&#xff0c;让人感到非常尴尬。不过&#xff0c;如果您是iPhone用户&#xff0c;那么您可以放心了&#xff01;因为在iphone查看本机号码只需要简单的几个步骤&…

“A”分心得:我的云计算HCIE学习之路

大家好&#xff0c;我是誉天云计算HCIE周末班梁同学&#xff0c;在誉天老师和同学们的帮助下&#xff0c;我终于在4月24日顺利通过了云计算3.0 HCIE的认证考试&#xff0c;而且获得了A&#xff0c;这是让我特别惊喜的&#xff0c;功夫不负有心人。 我日常的工作是网络运维&…

海云安受邀参加诸子云 4.27南京「金融互联网」私董会

4月27日&#xff0c;“安在新媒体网安用户行业活动”第四期私董会在南京顺利举办。活动以“金融&互联网”为主题&#xff0c;邀请十余位业内资深的甲方用户以及典型厂商代表。摒弃传统的议题分享&#xff0c;采取“随时问答&#xff0c;自由讨论”的形式&#xff0c;提问题…

环保访谈|浙江双视专注红外机器视觉及智能化应用,保障安全生产

近期&#xff0c;中联环保圈希姐采访了浙江双视科技股份有限公司环保行业销售总监孙波&#xff0c;深入了解了双视科技的发展历程、产品和解决方案、合作流程、核心竞争力以及未来规划。 双视于2014年创立&#xff0c;专注于红外机器视觉、人工智能技术与应用开发&#xff0c;…

新代数控Syntec网络IP配置设定教程

点击面板【维护】→【网络设定】→【IP地址取得方法&#xff1a;直接指定IP地址】→【IP地址&#xff1a;输入采集需要设定的IP】→【子网掩码&#xff1a;255.255.255.0】→【预设网关】 输入方法&#xff1a;点击面板上的【ENTER】输入键&#xff0c;输入相关参数即可。