首页 > 编程语言 >RSA算法详解

RSA算法详解

时间:2022-10-30 17:35:44浏览次数:47  
标签:3233 公钥 RSA 算法 分解 详解 mod

基础知识

RSA设计

\(m^{ed} \equiv 1 \: (mod\: n)\)

RSA密钥生成

第一步,随机选择两个不相等的质数p和q。
如61和53。(质数越大越安全。)
第二步,计算p和q的乘积n。
把61和53相乘:
  n = 61×53 = 3233
n的长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。
RSA密钥一般是1024位和2048位。
第三步,计算n的欧拉函数φ(n)。
根据公式:
  φ(n) = (p-1)(q-1)
算出φ(3233)等于60×52,即3120。
第四步,随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。
在1到3120之间,随机选择了17。(应用中,可选择65537。)
第五步,计算e对于φ(n)的模反元素d。
所谓”模反元素”就是指有一个整数d,可以使得ed被φ(n)除的余数为1。
  ed ≡ 1 (mod φ(n))
这个式子等价于
  ed - 1 = kφ(n)
于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。
  ex + φ(n)y = 1
已知 e=17, φ(n)=3120,
  17x + 3120y = 1
这个方程可以用扩展欧几里得算法(辗转相除法)求解:(这里求解过程图片待传)

    算出一组整数解为 (x,y)=(2753,-15),即 d=2753。

第六步,将n和e封装成公钥,n和d封装成私钥。
在例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。

RSA加密

小红有了公钥和私钥这样就可以进行加解密了,于是小红拉着小明一起来测试一下!
加密要用公钥 (n,e)
假设小明先测试性的给小红发一个字母m=“A”,我们都知道在通信传输中只能传输0和1,所以我们先将“A”转ascii码为65,所以m=65,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
所谓”加密”,就是使用下面的加密公式算出下式的密文c:
me ≡ c ( m o d n ) m^e ≡ c (mod n)
me ≡c(modn)
小明得到的公钥是(n,e)=(3233, 17),m=65,那么得到下面的等式:
65 17 ≡ c ( mod 3233 ) 65^17 ≡ c (mod 3233)
6517≡c(mod3233)
小明通过计算器一算c=2790,所以他就把2790发给小红了。

RSA解密

RSA关键

首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。

除此之外这样找到的p和q还要满足一定的要求,首先它们不能太靠近,此外p-1或q-1的因子不能太小,否则的话N也可以被很快地分解。

此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。要求是随机和不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出p和q一半的位的话,那么他们就已经可以轻而易举地推算出另一半。

此外密钥d必须足够大,1990年有人证明假如p大于q而小于2q(这是一个很经常的情况)而\({d < N(1/4)/3}\),(1/4)是N的上标,那么从N 和 e可以很有效地推算出d。此外e = 2永远不应该被使用。

RSA安全分析

密钥中一共生成了六个数字:p q n φ(n) e d,这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。

那么,有无可能在已知n和e的情况下,推导出d?

ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d
φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)
n=pq。只有将n因数分解,才能算出p和q

结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。

假设偷听者乙获得了甲的公钥N和e以及丙的加密消息c,但她无法直接获得甲的密钥d。要获得d,最简单的方法是将N分解为p和q,这样她可以计算(p-1)(q-1)并从而由e推算出d。至今为止还没有人找到一个多项式时间的计算方法来分解一个大的整数的因子,但至今为止也还没有人能够证明这种算法不存在。

RSA破解

针对RSA最流行的攻击一般是基于大数因数分解。

1999年,RSA-155(512 bits)被成功分解,花了五个月时间(约8000 MIPS 年)和224 CPU hours 在一台有3.2G中央内存的Cray C916计算机上完成 。

2002年,RSA-158也被成功因数分解。

RSA-158表示如下:

39505874583265144526419767800614481996020776460304936454139376051579355626529450683609
727842468219535093544305870490251995655335710209799226484977949442955603
= 3388495837466721394368393204672181522815830368604993048084925840555281177×
11658823406671259903148376558383270818131012258146392600439520994131344334162924536139

2009年12月12日,编号为 RSA-768 (768 bits, 232 digits)数也被成功分解[1]。这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。

RSA-768 =

     123018668453011775513049495838496272077285356959533479219732245215172640050726
     365751874520219978646938995647494277406384592519255732630345373154826850791702
     6122142913461670429214311602221240479274737794080665351419597459856902143413

=

     3347807169895689878604416984821269081770479498371376856891
     2431388982883793878002287614711652531743087737814467999489

×

     3674604366679959042824463379962795263227915816434308764267
     6032283815739666511279233373417143396810270092798736308917

RSA的选择密文攻击
  RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装( Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:
  ( XM )^d = X^d *M^d mod n
  这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。
但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-Way HashFunction 对文档作HASH处理。

RSA的公共模数攻击
  若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则:
  C1 = P^e1 mod n
  C2 = P^e2 mod n
  密码分析者知道n、e1、e2、C1和C2,就能得到P。
  因为e1和e2互质,故用Euclidean算法能找到r和s,满足:
  r * e1 + s * e2 = 1
  假设r为负数,需再用Euclidean算法计算C1^(-1),则
  ( C1^(-1) )^(-r) * C2^s = P mod n
  另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无需分解模数。解决办法只有一个,那就是不要共享模数n。

RSA的小指数攻击。
有一种提高 RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。但这样作是不安全的,对付办法就是e和d都取较大的值。
  RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

另外,RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

秀尔算法

基于Shor算法攻击RSA

量子计算里的秀尔算法能使穷举的效率大大的提高。由于RSA算法是基于大数分解(无法抵抗穷举攻击),因此在未来量子计算能对RSA算法构成较大的威胁。一个拥有N量子比特的量子计算机,每次可进行2^N次运算,理论上讲,密钥为1024位长的RSA算法,用一台512量子比特位的量子计算机在1秒内即可破解。

Shor算法具有随机性,导致破解RSA公钥密码体制成功率不高,根据RSA公钥密码体制特点和Shor计算结果分析,发现量子函数式f(x)=axmod n 对a值的随机选取是有规律的.结果是:随机数a取完全平方数,所求周期r很可能不满足Shor算法要求;a取非完全平方数可以提高Shor算法破解RSA的成功率.

利用RSA不动点性质,基于量子Fourier变换和变量代换,提出了一种新的攻击RSA的量子算法.该算法不需要分解n,而是从RSA密文C中直接恢复其明文M.该算法与Shor算法相比,需要的量子位更少,且成功概率大于1/2.最后将新算法的资源消耗情况与Shor算法的进行了对比.

Shor算法能够在多项式时间内求解整数分解问题和离散对数问题,解决整数分解问题是Shor算法攻击RSA的核心思想,但攻破RSA并非一定要从解决整数分解问题人手。针对RSA公钥密码体制的特点,通过量子傅里叶变换求出RSA密文c模n的e次根进而得到RSA的明文M.即不通过整数分解问题攻破了RSA.与以往密码分析者通过分解模数n试图恢复私钥的做法不同,直接从恢复明文消息人手,给出一个对抗RSA密码体制的唯密文攻击算法.即不通过解决整数分解问题实现攻破RSA,且避开了密文C模n的阶为偶数这一限制.

标签:3233,公钥,RSA,算法,分解,详解,mod
From: https://www.cnblogs.com/chenjiaxuan/p/15885305.html

相关文章

  • 代码随想录算法训练营第四天|24、两两交换链表中的节点|19、删除链表的倒数第N个节点|
    24、两两交换链表中的节点·模拟节点交换题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/思路:循环中两两交换   手写模拟一下交换的过程就比较容易......
  • 【Vue】Vuex详解
     【前言】本博客系统的讲诉了Vuex的安装、搭建。以及Actions、Mutations、State、Getters的使用,为什么使用mapState、mapGetters以及一些细节的解释Vuex原理讲解 编辑Acti......
  • 实验一:决策树算法实验
    【实验目的】理解决策树算法原理,掌握决策树算法框架;理解决策树学习算法的特征选择、树的生成和树的剪枝;能根据不同的数据类型,选择不同的决策树算法;针对特定应......
  • 实验一:决策树算法实验
    【实验目的】理解决策树算法原理,掌握决策树算法框架;理解决策树学习算法的特征选择、树的生成和树的剪枝;能根据不同的数据类型,选择不同的决策树算法;针对特定应用场景......
  • 类变量(类对象变量)和实例对象变量详解
    类变量总结:第一:作为类对象的变量每次创建一个新的实例对象时,类对象变量就多一个引用指向它通过实例对象来修改类对象变量的取值,实际上是让实例对象的data指向了另外......
  • Matlab实现K-Means聚类算法
    招募大量matlab技术人员,有大量matlab需求订单,均为个人短期可以完成,有时间的朋友可以加我微信  : Ahxyz6666人生如戏!!!!一、理论准备     聚类算法,不是分类算法。分......
  • Matlab的regionprops详解
    招募大量matlab技术人员,有大量matlab需求订单,均为个人短期可以完成,有时间的朋友可以加我微信  :Ahxyz6666 matlab函数_连通区域1、matlab函数bwareaopen──删除小面......
  • 实验一:决策树算法实验
    【实验目的】1、理解决策树算法原理,掌握决策树算法框架;2、理解决策树学习算法的特征选择、树的生成和树的剪枝;3、能根据不同的数据类型,选择不同的决策树算法;4、针对特......
  • 【博学谷学习记录】超强总结,用心分享|Python容器详解
    一、Python中容器的介绍容器:也可以称为是数据序列,或者高级数据类型,也是Python中的数据类型。容器中可以存放多个数据。Python中常用的容器有4种:list(列表)、......
  • np.clip()的用法和python,numpy中np.random.choice()的用法详解
    np.clip()的用法 numpy.clip(a,a_min,a_max,out=None)Clip(limit)thevaluesinanarray.Givenaninterval,valuesoutsidetheintervalareclippedtoth......