例题

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

攻击条件

已知dp,dq,p,q,c

其中:

dp=d%(p-1)

dq=d%(q-1)

原理

正常来说,解密用到是这个公式:m≡cd(modn)m \equiv c^{d} \pmod{n}mcd(modn)。但是由于n=pqn=pqn=pq,所以刚刚那个式子可以化为{m1≡cd(modp)(1)m2≡cd(modq)(2)\left\{\begin{matrix}m_{1} \equiv c^{d} \pmod{p} & (1) \\ m_{2} \equiv c^{d} \pmod{q} & (2) \end{matrix}\right.{m1cd(modp)m2cd(modq)(1)(2)。证明过程如下:

对于公式m≡cd(modn)m \equiv c^{d} \pmod{n}mcd(modn)我们可以这样理解:mmm除以nnn得到某个商kkk和余数cdc^{d}cd
于是可以转化成等式:m=cd+knm=c^{d} +knm=cd+kn。而n=p∗qn=p*qn=pq,所以可以进一步写成m=cd+kn=cd+kpqm=c^{d} +kn=c^{d} +kpqm=cd+kn=cd+kpq,其中kkk为假设的商。
然后两边分别同时对ppp,qqq取余,kpqkpqkpq那一项就被消去了,就得到{m1≡cd(modp)m2≡cd(modq)\left\{\begin{matrix}m_{1} \equiv c^{d} \pmod{p} \\ m_{2} \equiv c^{d} \pmod{q} \end{matrix}\right.{m1cd(modp)m2cd(modq)

由于dp=d(modp−1)dp= d \pmod {p-1}dp=d(modp1),dq=d(modq−1)dq= d \pmod {q-1}dq=d(modq1),再结合欧拉定理(或费马小定理),上面的同余式组可以进一步化为{m1≡cdp(modp)(3)m2≡cdq(modq)(4)\left\{\begin{matrix}m_{1} \equiv c^{dp} \pmod{p} & (3) \\ m_{2} \equiv c^{dq} \pmod{q} & (4) \end{matrix}\right.{m1cdp(modp)m2cdq(modq)(3)(4).

由式(1)可得m1+kp=cdm_{1}+kp=c^{d}m1+kp=cd(这里的kkk和上面证明中的kkk没有关系),不妨将其记为(5)式,然后代入(2)式可得kp≡(m2−m1)(modq)kp \equiv (m_{2}-m_{1}) \pmod{q}kp(m2m1)(modq)

又因为gcd(p,q)=1gcd(p,q)=1gcd(p,q)=1,即ppp,qqq互素,所以可以在刚刚得到式子两边同时乘上ppp的逆元,得到k≡p′(m2−m1)(modq)k \equiv p'(m_{2}-m_{1}) \pmod{q}kp(m2m1)(modq),其中p′p'pppp关于qqq的逆元。

将这个kkk的表达式代入(5)式,得到cd=m1+[p′(m2−m1)(modq)]∗pc^{d}=m_{1} +\left [ p'(m_{2}-m_{1}) \pmod {q}\right ]*pcd=m1+[p(m2m1)(modq)]p。其中的m1m_{1}m1m2m_{2}m2可以通过上面的式(3)(4)计算得到。最后就可以得到cdc^{d}cd的值从而解出明文mmm

脚本

from gmpy2 import *
from Crypto.Util.number import *

# dp+dq+p+q+c => m

def rsa(dp,dq,p,q,c):
    m1=pow(c,dp,p)
    m2=pow(c,dq,q)
    p_q=invert(p,q)
    m=m1+p_q*((m2-m1)%q)*p
    print(long_to_bytes(m))



if __name__ == "__main__":
    p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
    q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 
    dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 
    dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 
    c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

    rsa(dp,dq,p,q,c)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐