Triode的RSA学习笔记(1)
在进行RSA解密之前,我们先要理解RSA的加密原理:
已知明文$a$,公钥对$(n,e)$,加密过程如下:
若要对已知的密文进行解密,我们就需要得到私钥(Private Key):
设对于上述加密过程所得出的私钥为$d$,则:
很明显:
所以:
一般情况下,$gcd(n,b)=1$,故先对这种情况进行考虑
由欧拉定理:我们知道
很显然:
可以看出:
所以:
已知n,e,c在一般情况下(n可通过软件进行质因数分解)的解密
此时,我们有:
此时,由欧拉函数的性质,我们有:
$\varphi(n)=\varphi(p_1^{\alpha_1}) \varphi(p_2^{\alpha_2}) \varphi(p_3^{\alpha_3}) \cdots \varphi(p_k^{\alpha_k})(p_1,p_2,p_3,\cdots p_k是n的不同质因数,且有p_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}\cdots p_k^{\alpha_k}=n)$
由欧拉函数的计算公式我们可以知道:
所以对于$n$,有:
特别的,对于质数$p$,有:
若$n$为$k$个不相同质数相乘,即:
有:
在一般情况下$n$只有两个质因数$p$和$q$,例如下题:
from Crypto.Util.number import getPrime,bytes_to_long,long_to_bytes |
这题直接给出了$p$和$q$,故我们只需要写出如下代码即可解决:
from Crypto.Util.number import * |
运行即可得出flag:
flag{how_excellent_you_are!} |
这就是最基本的RSA类型了。
在已知e以及e组(n,c)的广播攻击
此类型攻击属于CRT(Chinese remainder theorem,中国剩余定理,又称孙子定理)类型。
原理不赘述,实质上即为已知$e$组$(n,c)$时利用CRT在不对任何一个$n$进行分解的情况下求解明文
在这里,我们设明文为$m$,有:
再通过CRT求解出$m^e$后对其开$e$次方根即可得到明文$m$
例题
[鹤城杯 2021]Crazy_Rsa_Tech
题目代码:
from Crypto.Util.number import * |
这里很容易可以知道$e=9$(显而易见,$n$和$c$也有九组),所以很显然,这题要用到$e=9$的广播攻击
将上面给出的n_list和c_list用sagemath利用CRT求解得出:
m9=3678337284039442047026947312380394506988284605153398380909870598085147736828709178219597429308046538374273111663234962853201175297522552444068549756304348183089003998584929250444862897734669616839072634559776823068102560978738392642133409979083241310818961120830565330801827594023873873703163937572703881578432281109467318674533265052430906776650900523035132668203491899352234368836316318216812572637893433384928785981896373747430646617935503364537613820302679656375356094380483213814869276308187497478084540603362678580814022322799191778371368875742773945120383365613028633102737056410926701477700008313642639347163933146129361496566648131161287075292980980083166106192999528561889437021539352391671756010617540361596164032486633114877739259434431765044242037641759566659268290619705700083536966807192023377334915872207418596226819579720241509860110741821630775501873143209229299530346706612248414951753383716954165108266753409813119293227854442685830689203424064786691447734948037502729127922328149002842971722645909768174575776908113523451541199095073733017029558396658874593357205426105429760517295964966905772455366037986657671195106462661190327510507460112791663031458690187525393979689469548319821181450874331998372947479866557921497942728807505035932385939931524294822439633516457845581452433022749099648076725811489217888688273759202726271093237450290814247396662589614216704#m9为m的9次方 |
再对$m9$开9次方根可得:
m=5364346700993245916083351542951836466599376039702798829478182513243184146028312538778801523615449405915572188751896617305936540801999004614344621214275094 |
再通过Crypto库中long_to_bytes函数可得:
flag{H0w_Fun_13_HAstads_broadca5t_AtTack!} |
gcd类型
这种类型主要考察数学推导的能力,直接上例题。
[GKCTF 2021]RRRRsa 1(部分)
题目代码:
pbits = 512 |
我们可以知道:
我们要从上面两个方程中求解$p$和$q$,下面进行数学推导:
首先观察hint1,由二项式定理有:
显然的,右式除$(2020p)^{202020}$与$q^{202020}$两项外均能被$n$整除
所以有:
进一步的,有:
现在看到hint2,有:
由费马小定理,可以得到:
所以:
对于hint1:
故:
所以有:
由于$n=pq$
所以$gcd(kq,n)=$
代码如下:
from Crypto.Util.number import * |
这样就得出了$q$,由此我们就可以顺带求出$p$了。
(还有道题是Geek Challenge 2023的Poly_RSA,但是在写笔记的时候比赛还没结束,就不放出来了,后面写wp的时候再讲推导过程)