RSA算法

news2024/11/15 7:20:48

什么是RSA算法?

1976年以前,所有的加密方法都是同一种模式:

  • 甲方选择某一种加密规则,对信息进行加密;

  • 乙方使用同一种规则,对信息进行解密。

由于加密和解密使用同样规则(简称"密钥"),这被称为"对称加密算法"

这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。

如果能在加密信息的途中,让加密密钥解密密钥不同,就可以很好的克服对称加密算法的弱点,这种加密模式被称为“非对称加密算法”

甲要传密信给乙,乙先根据某种算法得出本次与甲通信的公钥与私钥
乙将公钥传给甲(公钥可以让任何人知道,即使泄露也没有任何关系)
甲使用乙传给的公钥加密要发送的信息原文,发送给乙密文c;
乙使用自己的私钥解密密文c,得到信息原文m.

非对称加密算法,从始至终,私钥一直都在信息接收方乙处

如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的

1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)三位一起实现“非对称加密算法”。就是他们三人姓氏开头字母拼在一起组成的 RSA算法

RSA算法非常可靠,密钥越长,它就越难破解,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全

RSA数论知识

质数与互质

质数(素数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,否则称为合数。

如7 除了= 1 * 7 以外不能表示为其它任何两个整数的乘积,所以是一个质数

15 = 1 * 15 = 3 * 5 所以15不是一个质数而是合数

如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系

关于互质关系可以得到以下结论

  • 任意两个质数构成互质数(如3与11、7与19);

  • 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57;

  • 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10、5与26;

  • 1和任何一个自然数在一起都是互质数,比如1和99。;

  • 相邻的两个自然数是互质数

  • p是大于1的整数,则p和p-1构成互质关系,比如57和56。;

  • 相邻的两个奇数是互质数(如49与51)。

  • p是大于1的奇数,则p和p-2构成互质关系,比如17和15。

同余

“≡”是数论中表示同余的符号(mod就是取余的意思,一下用%代替)

定义:

给定一个正整数m, 如果两个整数a和b满足a-b能被m整除,即(a - b) % m = 0
那么就称整数a与b对模m同余,记作a ≡ b( mod m),同时可成立a % m = b
再次提醒注意,同余与模运算是不同的
a ≡ b( % m)仅可推出b = a % m

欧拉函数

如果任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?

求这个值的方法就欧拉函数,即φ(n),表示的是小于等于 n 的正整数中,和 n 互质的数的个数。

例如:φ(7)中与7是互质关系的有1,2,3,4,5,6所以φ(7) = 6

欧拉函数φ(n)求值有以下几种情况:

  1. 如果n = 1,则φ(n) = 1 ,因为1对任何数(包括本身)都是互质关系

  1. 如果n是质数,则 φ(n) = n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。

  1. 如果n可以分解成两个互质的整数之积,即n = p × q,则有:φ(n) = φ(pq) = φ(p) φ(q);

  1. 根据“如果两个数之中,较大的那个数是质数,则两者构成互质关系”和求值第2点可以知道:

一个数如果是质数,则小于它的所有正整数与它都是互质数;
所以如果一个数p是质数,则有: φ(p) = p-1
若我们知道一个数n可以分解为两个互质数p和q的乘积,则有
φ(n) = (p-1) (q-1)

欧拉定理和模反函数

欧拉函数的用处,在于欧拉定理

“欧拉定理”指的是如果两个正整数a和n互质,则n的欧拉函数φ(n)可以让下面的等式成立:

a^φ(n) ≡ 1( mod n) 等同于 a^φ(n) % n = 1

也就是说a的φ(n)次方向n取余的余数为1

模反元素的推导过程如下:

根据欧拉定理,有:

a^φ(n) = a × a^φ(n)−1 ≡ 1 (mod n)

b = a^φ(n)-1,得:

ab ≡ 1(mod n) 也就是 ab % n = 1

b就是a的模反元素

如果两个正整数a和n互质,那么一定可以找到整数b

使得ab-1被n整除,或者说ab被n除的余数是1

也就是说

ab - 1 % n = 0 ab - 1 = kn

总结

以上就是RSA算法的前置知识,是我从大佬们的文章学习得来的,其实引用了许多原话,理解下来后RSA算法也不是很难,只是需要更多的练习,熟悉

RSA算法实例

假如说甲要发送一串密文cxk给乙

  1. 首先我们确定两个不相等的质数p和q

实际运用中质数越大越难破解(乙选择了67和31)

  1. 计算p和q的乘积n

n = 67 * 31 = 2077
n的长度就是密钥的长度,将2077写成二进制= 1000 0001 1101,一共有12位,所以这个密钥就是12位,实际应用中RSA密钥越长越难破解,一般是1024或者2048位
  1. 计算n的欧拉函数φ(n)

根据公式 φ(n) = (p-1) (q-1)
φ(2077) = (67-1) (31-1) = 1980
  1. 随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。

乙在2到1980的整数里选择了选择了7

因为1980与7不是倍数关系,并且7是一个质数,满足条件

  1. 计算e对于φ(n)的模反元素d。

所谓"模反元素"就是指有一个整数d,可以使得ed向φ(n)取余的余数为1或者说ed - 1能够被φ(n)整除

ed ≡ 1 (mod φ(n))
这个式子等价于(k为任意正整数)
ed - 1 = kφ(n)
ed - kφ(n) = 1
已知e= 7 φ(n) = 1980 带入数据得
7d - 1980k = 1接下来就是求这个二元一次方程组的结果
最后求得
(d,k) =( 283, 1)

d = kφ(n) + 1 / e

欧几里得算法

  1. 然后将n和e封装成公钥,n和d封装成私钥

n = 2077 e = 7 d = 233
公钥:
(2077,7)
私钥:
(2077,283)
  1. 将公钥发送给甲

甲根据以下公式及公钥对原文xk(下面用m代替)加密成密文c

因为如果直接使用字符转十进制形式太大了,所以采用26个字母顺序分别代表密文字符

m^e ≡ c(mod n)

m^e % n = c

代入得

x = 11^7 % 2077 = 19487171 % 2077 = 757

k = 24^7 & 2077 = 4,586,471,424 % 2077 = 561

解密:

x = 757 ^283 % 2077 = 11

k = 561^283 % 2077 = 24

密钥组成与加解密公式

公钥KU(n,e)

n:质数p和质数q的乘积(p和q必须保密)

e:与(p-1)×(q-1)互质

私钥KR(n,d)

n:同公钥n

d:e-1(mod(p-1)(q-1))

加密

密文c = m^e % n

解密

原文m = c^d % n

参考文献

RSA算法基础详解 - 黄映焜 - 博客园 (cnblogs.com)

https://www.bilibili.com/video/BV14y4y1272w/?spm_id_from=333.337.search-card.all.click&vd_source=57570933f1fff4afb052f1b8a0d1ed9e

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

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

相关文章

C语言/C++ 之 打飞机游戏

【项目简介】 1、设计思想&#xff1a;本项目主要是为了实现打飞机游戏&#xff0c;主要包括5个函数模块&#xff0c;和1个主函数框架。分别是chu_shi_hua();、you_cao_zuo&#xff1b;、wu_cao_zuo();、show()&#xff1b;、main();等。项目完成过程中主要运用了C/C中的输入输…

蛋黄肉粽子

蛋黄肉粽子 一、蛋黄肉粽子 作为中国的传统美食之一&#xff0c;蛋黄肉粽子是端午节期间必不可少的特色食品。 我在今年的端午节期间品尝了这种美食&#xff0c;不仅让我感受到了它的美味&#xff0c;也让我领略到了它背后的历史和文化底蕴。 一、蛋黄肉粽子 首先&#xff0c;就…

第三方库介绍——nanomsg(高性能通信库)

一、nanomsg介绍 NanoMsg是一个Socket的通讯库&#xff0c;使用C语言编写实现的&#xff0c;这样就可以适用于多种操作系统&#xff0c;而且几乎不需要什么依赖&#xff0c;可扩展并且能易于使用。Nanomsg提供了几种常见的通信模式 &#xff08; 也称为“可扩展性协议” &#…

C++ 第一弹入门基础

目录 目录 1.关键字 2.命名空间 3.标准IO输入输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 1.关键字 c98的关键字一共有63个 在之后用的时候都会再次详细介绍 2.命名空间 2.1什么是命名空间&#xff0c;为什么要有他&#xff1f; 在c中为了避免相同名字的变量&am…

torchvision.utils.save_image()保存tensor显示图片异常问题解决

用torchvision.utils.save_image()保存图片时出现异常 有些像素点会显示为全黑&#xff08;灰度图&#xff09;&#xff0c;如下图所示&#xff0c;第一张和第三张图 刚开始以为是图像数据分布范围的问题&#xff0c;在保存之前输出图像tensor的最大max和最小min值&#xff0c;…

【Python 基础篇】Python 模块与包

文章目录 引言一、模块与包概述二、模块的导入和使用三、包的组织和导入四、实际应用场景五、总结 引言 在Python编程中&#xff0c;模块和包是组织和复用代码的重要工具。随着项目规模的增长&#xff0c;将代码按照功能模块化并组织成包&#xff0c;可以提高代码的可读性、可…

吴恩达ChatGPT《Building Systems with the ChatGPT API》笔记

1. 课程介绍 使用ChatGPT搭建端到端的LLM系统 本课程将演示使用ChatGPT API搭建一个端到端的客户服务辅助系统&#xff0c;其将多个调用链接到语言模型&#xff0c;根据前一个调用的输出来决定使用不同的指令&#xff0c;有时也可以从外部来源查找信息。 课程链接&#xff1a…

设计模式之桥接模式笔记

设计模式之桥接模式笔记 说明Bridge(桥接)目录桥接模式示例类图视频文件接口avi视频文件类rmvb视频文件类抽象的操作系统类windows类mac类测试类 说明 记录下学习设计模式-桥接模式的写法。JDK使用版本为1.8版本。 Bridge(桥接) 意图:将抽象部分与其实现部分分离&#xff0c…

用微分方程描述的连续时间滤波器举例

用微分方程描述的连续时间滤波器举例 在许多应用中&#xff0c;频率选择性滤波器是用线性常系数微分或差分方程描述的线性时不变系统来实现的。这有许多理由&#xff0c;例如很多具有滤波作用的物理系统都是由微分或差分方程表征的。这方面的一个很好的例子就是在后续将研究的汽…

消息中间件相关知识简介

一、消息中间件相关知识 1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&am…

Python 基础(十五):模块

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、什么是模块二、自定义模块三、引用其它模块3.1、使用 import 引用模块3.2、使用 f…

揭秘Java 8的新特性:Stream API的使用和实践

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 集合处理数据的弊端 2. Stream流式思想概述…

VN8911/VN8912(A)/VN8914/VN8910(A)上安装驱动

问题&#xff1a; 如何在 VN8911、VN8912(A) 或 VN8914 设备上安装驱动程序&#xff1f; 背景&#xff1a; VN8911、VN8912(A) 或 VN8914 设备 [下面概括为 VN8900 系列&#xff0c;不包括 VN8910(A)] 与 CANoe 一起使用时作为分布式实时系统运行 [参见下面的 CANoe 11.0 和 V…

vue插槽概念解释

官方文档 https://cn.vuejs.org/guide/introduction.html 什么是插槽 在 Vue.js 中&#xff0c;插槽&#xff08;Slots&#xff09;是一项非常有效的功能&#xff0c;它允许我们在组件中预留一个占位符&#xff0c;供父组件插入自定义的内容。 具体来说&#xff0c;当一个组件…

Linux和Shell:开源力量与命令行之美

目录 一、概述二、Linux的简单介绍三、Shell的简单介绍四、Linux和Shell的应用领域五、Shell编程结语&#xff1a; 一、概述 Linux和Shell是开源世界中不可或缺的两个重要组成部分。Linux作为一种自由和开放的操作系统&#xff0c;以其稳定性、安全性和可定制性而备受推崇。而S…

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统;实现NoC的RTL设计

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统&#xff1b;实现NoC的RTL设计 0. NoC多核片上网络生成器ProNoCProNoC的功能实现 1. 生成一个叫做Mor1kx SoC的单个Tile&#xff08;包含NI网络接口&#xff09;1.1 打开ProNoC用于生成Tile的GUI界面1.2 为Tile添加时钟…

Python基础篇(四):基本数据类型的学习和示例

Python基础篇(三)&#xff1a;基本语句的示例和说明 基本数据类型的学习和操作 1. 数值类型1.1 整数&#xff08;int&#xff09;1.2 浮点数&#xff08;float&#xff09;1.3 复数&#xff08;complex&#xff09; 2. 字符串类型2.1 字符串的定义2.2 转义字符2.3 多行字符串2…

Vue-几种插槽(slot)的使用

插槽(slot) 插槽在vue中是一种很常见的写法&#xff0c;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式 一共有三种分类&#xff1a;默认插槽、具名插槽、作用域插槽&#xff0c;下面一一根据案例改造说明 1 基本案例 首先编写一个基本的案…

12.1 物业管理项目中的新知识点

1.RESTful 2.雪花ID 3.mybatis的动态sql 很多时候需要实现多条件查询&#xff0c;手动判断拼接sql有些麻烦 mybatis提供了一个动态sql实现多条件查询的方法 3.1 if元素 使用if元素可以根据条件来包含或排除某个SQL片段 <select id"search" resultType"Hous…

OpenCV——实验结果输出《图像金字塔》和《图像轮廓》

1.高斯金字塔 img cv2.imread(./AM.png) print(img.shape) upcv2.pyrUp(img) cv_show(up,up)#只是将图片的大小改变了,并且是2倍2倍的增长。 print (up.shape) downcv2.pyrDown(img) cv_show(down,down) print(down.shape) up_downcv2.pyrDown(up) cv_show(up_down,np.hstack…