rsa算法笔记

写给自己看的,建议别看,因思维有些跳跃,容易误导,硬要看的话建议看这段

2023年9月18日
2023年9月25日

在这里插入图片描述

由欧拉a^φ(n)mod(n)余1得知
an两个数互质,如 a=3 n=7
3^(7-1)mod(7)
=3^6mod(7)
=729mod(7)
=1

拓展欧几里得
ax mod ( N)余1

也可以说是 a与x得乘积-1可以被p给整除
(ax-1)mod(N )结果无余

也可变形写为:
ax-pn=1
a与x得乘积 减去 p与n得乘积 结果为1

如果e=13 φ(n)=160
=160-12*13 余4
=13 - 3 * 4
=1

可以看作
1=13x-160n
1=13-3*(160-12*13)
1=没写完

a=e=13 x=37 p=160 n=3
(13x) / (160n+1)=0

13 * x-160 * 3
=481-160
=1

481mod160=1


e=13 初始d=37 φ(n)=160
d可以是=d±kφ(n)
————
模反(详见扩展欧几里得)
如果e与φ(n)互质,会有一个d,e*d-1可以被φ(n)整除

此处d就是模反

变形有:

ed mod(φ(n))=1
ed-1=(n)

如果d是e得模反元素

可以通过d±kφ(n)得到其他模反,不唯一

例如:

如果e=7 n=11 φ(n)=10
7*d-1=k*10
得到
d=3 k=2
带入
d+-(n)
k如果为5,d=3+50=53
验证
7*53=371
371-1=370
370可以被φ(n)=10整除

这部分参考https://www.bilibili.com/video/BV1YQ4y1a7n1
【RSA加密算法】| RSA加密过程详解 | 公钥加密| 密码学| 信息安全|
UP:可厉害的土豆

C=M^e mod(N)
M的拓展证明
M=Cd mod(N) = (Me mod(N))d mod(N)

(Me mod(N))d mod(N) = Med mod(N)

Med mod(N) = Mkφ(N)+1 mod(N)

Mkφ(N)+1 mod(N) =(Mkφ(n) *M)mod(N)

(Mkφ(n) *M)mod(N) = M

如果可以证明Mkφ(n) =1,就能证明(Mkφ(n) *M)mod(N) = M

设 如果a与n互质,则依照欧拉定理aφ(n) mod(n)=1
如果n是个极大整数,只有aφ(n)=1时 aφ(n) mod(n)=1才会成立

如果Mkφ(N)=1可以带入aφ(n)=1(这里Mk对应a,所以前提是Mk是与N互质)

而N作为pq的乘积只有(p,q,1,N自身)可以除开
M作为明文,其开幂次方k后也较小,其与p,q,N碰到一起的概率基本为0
于是Mk和N互质是可以成立的
所以Mkφ(N)=1可以带入aφ(n)=1

————
M=3
p=3 q=11
n=pq=33
φ(n)=2*10=20
e=1<e<20=7
d:d * 7 mod(20)=1=3(可以变形为de=kφ(n)-1,这个可以用扩展欧几里得求,下次写)
C=37mod(33)=9(密文)
M=93mod(33)=3(还原明文)

(具体为什么能还原。。我还是没搞明白)


扩展欧几里得计算方式

https://www.bilibili.com/video/BV1qg411S7W8
RSA算法 扩展欧几里得求逆元 超简单的方法 期末必看
UP:陈大陈女士

视频里up是求
1.79d-3220k=1

大的被小的mod
3220 mod(79) =60

2.79d-60k=1

79 mod(60) =19

3.19d-60k=1

60 mod(19) =3

4.19d-3k=1

19 mod(3) =1

5.1d-3k=1
d的系数或者k的系数为1即可,带入k=0,d=1
带回4.
191-3k=1
k=6
带回3.
19d-606=1
d=19
带回2.
7919-60k=1
在这里插入图片描述

k=25

带回1.
79d-322025=1
d=1019

于是d=1019


https://zhuanlan.zhihu.com/p/616185983
这里引用参考了知乎这位师傅的内容

在这里插入图片描述

有点怀疑最后的Medmod(N)=M可能是费马小定理实现的,因为长得和apmod§=a长得好像啊…
验证一下,费马的前提是a是一个整数,p是一个质数的情况下,而且ed要等于N,所以应该不是这么回事…

欸等等,如果是依照a不是p的倍数的情况的,那还有ap-1mod( p )=1呢,往下看
在这里插入图片描述


2023年9月18日

暂时感觉欧拉的(aφNmod(N)=1这里变换为) ed mod(N)=1 在与rsa的ed mod(φN)=1,两个模数mod(φN)和mod(N),这两个的区别,对其在最后实现M^ed mod(N)=M之间或许存在一定关系

依照欧拉定理a应当与N互质才可以实现aφN与N取模余1

(aφN 当a与N互质,a在它的x次方积后mod(N)余数会=1,这也延伸出一个定论:
当a与N互质,那a的乘积中会有一个x,ax 在mod(N)时会余1
变为拓展欧几里得也可以看作ax-kN=1)
上面是正常的欧拉定理

这里疑点是rsa中欧拉定理应用时,是将mod(N)替换为了mod(φN)

e可以看作是ax-kN=1中的a,而d则可以看作x,在正常欧拉中看是正常的,当前的疑点是rsa这里并非kN,而是φN,依据欧拉a需要和N互质,那这里就需要是e与φN实现互质关系

这时候就需要倒过来看e是如何选来的:1<e<φN,且与φN互质,由此e正满足了与φN互质的条件,达成了欧拉定理中a的前提。

然后是N,依照ed=mod(φN)+1作为拓展,φN作为N的欧拉数(小于N的正整数中与N互质的,数字的个数),由其φN-1得到了e与d,ed被应用到 Medmod(N)=M 加解密中,即M在ed次方之后mod(N)的余会变回M

这是咋实现的…,捋一下每一个出现的值的关系

1.选取了pq两个质数相乘得到N,pq=N
2.因欧拉,pq两个质数的φ值φN为(p-1)*(q-1)
3.选取e,e需要与φN互质(满足欧拉定理实现能找出4.d的前提,gcd(e,φN)=1)
4.选取d,d需要满足ed=1+kφN(ed-1=kφN、ed mod(φN)余1,这些变形都行),依照欧几里得计算出d
5.加密是明文Memod(N)=C
6.解密则为Cdmod(N)=M

这里5.和6.的M加密又解密,可以看作Medmod(N)=M

疑问是:为什么可以实现Med的积数在mod(N)时,它的余会还原回M?
1.首先我把ed进行替换,ed变换为4.的1+kφN,再带回M1+kφN同余Med
2.这就变成了M1+kφNmod(N)=M,继续拆解为(M·MkφN) mod(N)=M
3.(M·MkφN) mod(N)=M,到这里我们再将其拆解,单独拿出来看MkφNmod(N),是不是有些眼熟
4. MkφNmod(N)对应的正是欧拉定理中的:akφNmod(N),因N是由两个大质数pq乘积得出,所以明文通常M与N应当是互质的,且平常在使用rsa时M也不会大于N,所以这里M与N是互质的关系
5. 于是依照欧拉:akφNmod(N)=1同理MkφNmod(N)=1,这里在改一下将(M mod(N))*(MkφNmod(N))=M
6. 由于MkφNmod(N)=1,所以(M mod(N)) * (MkφNmod(N))=M可以看作(M mod(N)) * 1)=M
7. 只要 (M mod(N)) * 1)=M,M是不会大于N所以M mod(N)结果还是M,于是进一步换为(M * 1)=M
8. 所以成立了整个rsa解密还原的底层就是 (M * 1)=M

反过来倒推,思考该如何建立rsa的设计思路
1.首先我们有一个明文M我们如何将他逆向推导,这里利用 欧拉定理akφNmod(N)=1的特性,我们选取两个大素数pq乘积得到N,(p-1)(q-1)得到φN
2.将M带入欧拉之中:MkφNmod(N)=1,使其可以成立(N为什么会与M互质请参考上面的4.)
3.既然其kφN时mod(N)会=1那我们在让其kφN+1就可以实现将M藏匿其中(相当于让1 * M)
4.现在变成MkφN+1mod(N),我们可以考虑将kφN+1的部分进行拆解(k作为正整数可以kφN+1是代表实际上kφN+1的结果不是唯一的)
5.拆解部分,举个例子N=21,那φN=12,kφN的情况下k=2,2φN,24+1=25可以拆解为5和5(为了验证方便的话不拆也行…比如这里φN+1=13直接拿去M13也是ok的)
{这步对应的rsa正向的选d的那一步,即ed=kφN+1,在正向时候我们会首先选取一个与φN互质的e,这样欧拉成立,我们我们才能找到de=kφN+1的d}

6.这时我们可以简单给一个明文M试一下,先不拆解,验证这个MkφN+1mod(N)=M是否真的成立
假设M=2或者5,依照MkφN+1mod(N)代入一下替换为:2或者5的5*5mod(21)

下面是验证的两个例子:

一) 25*5mod(21) = 225mod(21) = 33554432 mod(21)=2 二)
55*5mod(21) = 525mod(21) = 298023223876953125 mod(21)=5

啊可能觉得俩k=2时kφN+1=212+1=25,拆俩5可能不太直观(xd,那就选一个代表d将其5+112{d±kφ(n)})
5和5变更为5和17(kφN,k=7时,M7φN+1mod(N)=M) 一)

25*17mod(21) = 285mod(21) = 38,685,626,227,668,133,590,597,632 mod(21)=2

55*17mod(21) = 585mod(21) = 2.5849394142282114839731521627186e+59 mod(21)=5

(太长了科学计数法都给整出来了)

7.验证完上面的M5*17mod(21)或者M5*5mod(21)可以还原M之后,到了这里5和17其实就可以作为e或者d
8.比如我们的rsa的公钥方收到的e=5 N=21

利用这个加密自己的讯息M=3
C=35mod(21)=12

然后解密有私钥d=17 N=21
M=1217mod(21)=3

于是一条龙就出来了,倒推结束

——————————————
p=3 q=7
N=pq=21
φN=(p-1)(q-1)=26=12
e=1<e<φN=5
d=ed-kφN=5
3-712=7
5
x-k12=1
5
x-12=1
1
3-k*2=1

53-2=1
15-7
2=1
5x-712=1
517-712=1

7*12=84
5 and 17


2023年9月25日
突然想到了更简单的rsa实现解释

rsa实现过程中选取了与φN互质e以及欧几里得推到出的d,以达到e*d=φN+1

M=Medmod(N)
正是利用了e与φN互质可以满足欧拉定理,以达到,会有一个d,在d*e时比φN多1
(M要比N小)
所以M=Medmod(N)=MφN+1mod(N)=MφN+1= (MφNmod(N)) * (M1mod(N) ) = 1(因欧拉MφNmod(N)=1) * M=M


2023年9月22日
做了道泄露dp、dq、q、p的题,意外发现两个有意思的解法

dp=d mod( p)
dq=d mod(q)

第一个解法
我本来看到有了pq就直接随便编了个e,在逆元一个d,反正最后结果都一样
在这里插入图片描述

第二个解法
dp不是dp=d mod(p-1)嘛 然后p既是构成n的因子直接拿来做还原m的n用也ok,同时又是个质数
所以我想利用cd%(p-1)%p符合费马小定理,这里可以分解为

cd%(p-1)=cd % c(p-1)

因费马小定理,p为质数
c(p-1)%p=1
故可以

( cd % c(p-1) ) % p = ( cd % 1 )%p = cd % p=M
不知道我理解的对不对…

2023年10月3日
第三个解法
参考的这位师傅的

作者:Paintrain
ctfshow crypto funnyrsa3 RSA之dp泄露
https://blog.csdn.net/m0_62506844/article/details/122539246

其实我不太明白是怎么想到dpe来推导的 (又笨经验又少,得再加把油
dp * e=d%(p-1)e
d * e=d%(p-1) * e+k * (p-1)
因为d
e≡1 mod(φN)又可以为d
e=1+k * (p-1)(q-1)
所以套到这里面
d * e=d%(p-1) * e+k * (p-1)
变成
1+k1 * (p-1)(q-1)=d%(p-1) * e+k2 * (p-1)=e*d
合并同类项(我都忘了咋合并了…百度了下小学数学,提取出都先(p-1)来,参与到乘法运算的丢到一起,然后那个+1因为没参与到乘法运算所以可以拿出来随便找个地方丢)
于是
1+k1 * (p-1)(q-1)=d%(p-1) * e+k2 * (p-1)
就变成
1+ (p-1) * (k1 *(q-1)-k2)=d%(p-1) * e
到这里如果不看wp的话我也看不出啥来…思路太僵了

这里因为右侧d%(p-1) 是绝对小于左侧的 (p-1) 的
因为他本就是d%(p-1)的余数可以看作减了k(p-1)剩下的。
这也就导致这个等式右侧d%(p-1) * e中,其e相较于左侧的(k1 *(q-1)-k2),e值在右侧的占比是比他大的,不然d%(p-1)本就比(p-1)小了,e再比(k1 *(q-1)-k2)小,那咋能和等式左边相等不是嘛

为了方便看就按照wp中师傅的X替换 (k1 *(q-1)-k2)这部分
1+ (p-1) * X = d%(p-1) * e
得知了e的占比更高就可以通过此来爆破X的值,我们先将d%(p-1) * e 的值-1
可以得到
(p-1) * X = d%(p-1) * e -1
至此我们看到其实只需要轮询1到e+1的值,看看哪个x值在x%(d%(p-1) * e - 1)时可以=0,就得到了x
然后拿去除(d%(p-1) * e -1)就可以得到(p-1)的值,将(p-1)+1就可以得到p,这里按照wp需要再和n%p=0,因为会有错值,所以需要加这个验证确定一下。


2023年9月25日
刷了个江苏工匠杯的rsarsa
看了其他wp的都有提到鹤城杯2021的babyrsa,但是我实在太菜了推导部分没看懂

自己研究两天才搞懂了…(笨导致的

首先举个例子

p=227561
q=397027
n=90347861147

n*(inverse_mod(q % (1000000),1000000) % 1000000
如果是q<1000000,比如q=397027
q%1000000得到的还是397027(xd
n*(inverse_mod(q,1000000) % 1000000

1. 在取q的模1000000的逆元,得到q0=469963(这里逆元,后面能实现还原与模逆元有很大关系)
q0 * q%1000000=1 ,q0=469963
n * q0 % 1000000

q0与n相乘得到nq0,当前看不出什么,但是如果再mod1000000,
nq0 % 1000000

正好满足了逆元,就抹去了q0在nq0的部分化为1,{(q0 * q)mod(1000000)=1}然后n*q0得到nq0,如下推导
q0n % 1000000
= ((p * q)q0) % 1000000
= (p * (q * q0)) % 1000000
=(p % 1000000 * (q * q0)% 1000000) {这里 (q * q0)% 1000000正是上面1. 的逆元所以=1
=(p% 1000000 * 1) {这里p因为也小于1000000所以p%1000000得到的还是p
=p*1
=p

攻防世界苏州工匠杯的真题rsarsa部分
这里的n * inverse_mod(q % (2 ** 265), 2 ** 265) % 2 ** 265 原理上也是一样的

首先将q取模得到其低265bit位我标做 q0 ,再将其模2 ** 265得到逆元q0a
q0 = q % (2 ** 265)
q0a = inverse_mod(q % (2 ** 265), 2**265)

然后继续往下走到 n * q0a % 2**265
n * q0a % 2**265
= nq0a % 2**265
=((p*q)q0a)% 2**265
= (p*(q* q0a)) % 2**265(小学数学)移位法,将q的低位265bit与他的模2** 265的逆元相乘
= (p % 2**265)*((q * q0a) % 2**265) 因q0a本就是q逆元模2 ** 265得到,(q * q0a)%2 ** 265=1所以等于1
=(p % 2**265)* 1 (下面p %265姑且写作p0了
=p0*1
=p0
所以还原了结果ct=p0,p的低位265bit位

2023年9月29日

这道题涉及到了coppersmith攻击 (我还是太菜了…这里先不谈其原理因为不会,只看他的实现的前置条件)
这里十分推荐看下这位师傅的文章

RSA中coppersmith定理的应用条件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_51999772/article/details/123620932

以及

ctfwiki-Coppersmith 相关攻击

https://ctf-wiki.org/crypto/asymmetric/rsa/rsa_coppersmith_attack/

首先借用第一个师傅的截图

在这里插入图片描述

要想实现 单变量 未知部分的 高位攻击需要满足以下条件:

n因子的p或q(这边借用文章里师傅的,统称为b),β需要满足 b ≥ nβ(0 < β ≤ 1),由此得知β是一个小数位
下面是简单的例子

p和q都是50位的

# getPrime(50)
# getPrime(50)
p=695679649317529
q=833270569596827
n=579689377643738249567233880483 #n=q*p

此处就需要 nβ ≤ p或者q,即要首先要确保 nβ会比目标因子小(是比q和p都小)

在这里插入图片描述

不过至少目前来看在n开次方根也就是n0.5时,比一个因数小

这里准备拿p做包含未知二进制位的例子,所以当前nβ需要比p小,根据师傅们的文章,这里我们将开根范围再缩小0.01,n0.49就可以找到当前最大,同时又符合场景的β
(会觉得是不是0.499可以,但其实0.49是个例子,真实情况只能用到小数点后一位,具体为啥后面会说,第一个师傅的文章后半段讲small_roots()也有提到)

验证一下,确实比p小了
p=695679649317529
n49=383676957677861
在这里插入图片描述

(第一个师傅文章里的)
在这里插入图片描述
在满足了β≤p或者q之后,就需要再满足上图的

需要p的未知bit位≤nβ**2

应该注意的是,理论上在符合nβ≤p的条件下,β给的越大,允许p未知的位数就越多,对我们也就越有利(当然这也只是理论上,实际情况往往是0.4)

我们算下在0.49的情况时容许p最大未知位会是多少(师傅的文章中也有这部分思路,这里简单带过一下,我用的时50位的bit生成,文章里时1024位的,更有参考价值,这里只做一下简单记录)
在这里插入图片描述
24bit位
24位
这是当前理论上得出的,当前p允许最多24未知bit位时可以被成功攻击,p的bit是50
占当前p的0.48,但是我们目前只是理论上

先缕清nβ在这个攻击中起到的关联性。

由上面内容得知,nβ得出的值是需要小于p及q的,然后再将β进行2计算得出它允许的未知位
那当前就得到了几个条件:

在这里插入图片描述

1.nβ <= p及q (0<β≤1)
2.β的值,直接影响允许未知的位数,如上图,β值越大允许的未知数也就越多,n0.48时是23位 n0.49时是24位,可见是nβ的数值越贴近目标包含未知位的目标变量的整体值时,当前nβ**2相对所支持的未知位就是最大的
(我这里是pq各50位,n是99位,真实情况时最大值不是固定的要视情况而定)

测了几个pq分别是:

pq各50bit
在这里插入图片描述

q 80bit和q 50bit
计算到β=0.38的时候值nβ会小于q或p中最小的值得到的 允许最大未知位数是<19,在这里插入图片描述
在这里插入图片描述

注意:small_roots(2**X,beta,epsilon)第二个bate在这里运算时只会取小数点后1位范围(我试了下这个值,如果是0.4的话,可能是从0.49到0.40?,因为我在这里给了个0.4和0.005结果并没有跑出来
在这里插入图片描述
上面的0.3和0.005倒是跑出来了,可能因为β是0.38的关系,所以取值是0.39-0.30?。。没太搞懂这块)

可以根据个人需求调整,的第三个epsilon值如果不给值,默认是0.05,如果遇到在允许的未知位置范围内的可以尝试调整一下,时间会边长,,当然有可能真的算不出来…那就另当别论了

2023年10月1日

发现一个师傅baby_rsa的wp

作者:M@ku1i
鹤城杯2021 Crypto Writes up
https://blog.csdn.net/weixin_56678592/article/details/120657746

mod=pow(2,265) 
for i in range(32):
    f=pbar+x*mod*32
    f=f.monic()
    pp=f.small_roots(X=2^454,beta=0.4)
    if(pp):
        break
    pbar+=mod

这部分一开始没看懂,我寻思i没有给 f=pbar+x*mod*32到这里面 是怎么填充的那5bit,然后发现下面有个pbar+=mod每次循环paber都会+mod = pow(2,265),也就是低位265bit,后位266bit开始爆破,每轮+1
justlike
在这里插入图片描述
还有个写法是直接填充的

mod=pow(2,265) 
for i in range(32):
    f=pbar+(x*32+i)*mod
    #f=pbar+x*32+i*mod
    f=f.monic()
    pp=f.small_roots(X=2^454,beta=0.4)
    if(pp):
        break
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值