[NPUCTF2020]EzRSA e和phi_n不互素怎么找d

  • 题目
from gmpy2 import lcm , powmod , invert , gcd , mpz
from Crypto.Util.number import getPrime
from sympy import nextprime
from random import randint
p = getPrime(1024)
q = getPrime(1024)
n = p * q
gift = lcm(p - 1 , q - 1)
e = 54722
flag = b'NPUCTF{******************}'
m = int.from_bytes(flag , 'big')
c = powmod(m , e , n)
print('n: ' , n)
print('gift: ' , gift)
print('c: ' , c)

#n:  17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121
#gift:  2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104
#c:  3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319
  • 分析

本题涉及到一个gmpy2的函数lcm(Least Common Multiple)求最小公倍数
φ ( n ) = ( q − 1 ) ( p − 1 ) \varphi(n)=(q-1)(p-1) φ(n)=(q1)(p1)
这里涉及一个概念:两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即:
a ∗ b = ( a ,   b ) ∗ [ a ,   b ] a*b=(a,\ b)*[a,\ b] ab=(a, b)[a, b]
φ ( n ) = g i f t ∗ [ q − 1 ,   p − 1 ] \varphi(n)=gift*[q-1,\ p-1] φ(n)=gift[q1, p1]
已知 n \textcolor{red}n n的值
n = p ∗ q n=p*q n=pq
l e n ( φ ( n ) ) = l e n ( n ) len(\varphi(n))=len(n) len(φ(n))=len(n)
这里也可能是
l e n ( b i n ( φ ( n ) ) ) = l e n ( b i n ( n ) ) len(bin(\varphi(n)))=len(bin(n)) len(bin(φ(n)))=len(bin(n))
总之这两个值的位数是一样的,那那就可以猜测出 [ q − 1 ,   p − 1 ] [q-1,\ p-1] [q1, p1]的值
如果是 l e n ( φ ( n ) ) = l e n ( n ) len(\varphi(n))=len(n) len(φ(n))=len(n)可以求出 [ q − 1 ,   p − 1 ] = 8 [q-1,\ p-1]=8 [q1, p1]=8
如果是 l e n ( b i n ( φ ( n ) ) ) = l e n ( b i n ( n ) ) len(bin(\varphi(n)))=len(bin(n)) len(bin(φ(n)))=len(bin(n))可以求出 [ q − 1 ,   p − 1 ] = [ 4 ,   9 ] [q-1,\ p-1]=[4,\ 9] [q1, p1]=[4, 9]
最后求出来是8
最后求出 φ ( n ) \varphi(n) φ(n)的值
φ ( n ) = g i f t ∗ 8 \varphi(n)=gift*8 φ(n)=gift8
这里通过逆元求 d d d是求不出的
e = 54722 e=54722 e=54722
e e e不是素数,也不和 φ ( n ) \varphi(n) φ(n)互素
e   / /   [ e ,   φ ( n ) ] e\ //\ [e,\ \varphi(n)] e // [e, φ(n)]的值和 φ ( n )   / /   [ e ,   φ ( n ) ] \varphi(n)\ //\ [e,\ \varphi(n)] φ(n) // [e, φ(n)]的质互素
d d d的值就是求逆元
d ∗ e = 1   m o d   φ ( n ) d*e=1\bmod \varphi(n) de=1modφ(n)

  • 重点来了,这里我们要做的是将 e 进行一次变形,来得到逆元 d \textcolor{red}{重点来了,这里我们要做的是将e进行一次变形,来得到逆元d} 重点来了,这里我们要做的是将e进行一次变形,来得到逆元d
  • [ e ,   φ ( n ) ] = 2 \textcolor{red}{[e,\ \varphi(n)]=2} [e, φ(n)]=2
  • 变形的 e 我们这时把他叫作 e _ 2 ,下面就是一系列的变形过程 \textcolor{red}{变形的e我们这时把他叫作e\_2,下面就是一系列的变形过程} 变形的e我们这时把他叫作e_2,下面就是一系列的变形过程

e _ 2 = e   / /   [ e ,   φ ( n ) ] e\_2=e\ //\ [e,\ \varphi(n)] e_2=e // [e, φ(n)]
e _ 2 = e   / /   2 e\_2=e\ //\ 2 e_2=e // 2
因为
c = m e   m o d   n c=m^e\bmod n c=memodn
c = ( m 2 ) e / 2   m o d   n c=(m^2)^{e/2}\bmod n c=(m2)e/2modn
e 进行了变形, m 也要变,指数的乘除 {e进行了变形,m也要变,指数的乘除} e进行了变形,m也要变,指数的乘除
现在可以用逆元 d d d求出 m 2 m^2 m2的值,
最后开根号就可以求出m的值,
这里要注意, [ e ,   φ ( n ) ] [e,\ \varphi(n)] [e, φ(n)]的值可能不是2
剩下的就是解密的基本操作了
代码如下:

>>> from gmpy2 import mpz, invert, powmod, iroot
>>> n = mpz(17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121)
>>> gift = mpz(2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104)
>>> phi_n = gift * 8
>>> e = mpz(54722)
>>> e_2 = e // 2
>>> e_2
mpz(27361)
>>> c = mpz(3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319)
>>> d_2 = invert(e_2, phi_n)
>>> d_2
mpz(3623960926141555287499586936002588830496079841917313026194295760800408709320214823092595120348106137096187643430943490188125460015267714721383831801228978459738147422443015519352272682374528861550878044580645701539157928346749225751507239116578270629886685872725950227888153727090008690323645748696039492535572413478695359833744058610421607613148611079294300359070562314131322943755528912767514805442203168837293463002592529171033395324433632351223302828794321356947273613442834088890412435561603072808318967737183818601065838683683047315620557667562640144050484413871241100000176857555556621331996774524057292473889)
>>> m_2 = powmod(c, d_2, n)
>>> m_2
mpz(4457739276450750973807362088089319606097011997747961409022906575971021744219518190210017002304776543765491793897149413559709081776139101961)
>>> m = iroot(m_2, 2)
>>> m
(mpz(2111335898536931279306810443240820489664022670971730129629668753766781), True)
>>> flag = bytes.fromhex(hex(int(m[0]))[2:])
>>> flag
b'NPUCTF{diff1cult_rsa_1s_e@sy}'
  • e和 φ ( n ) \varphi(n) φ(n)不互质

[ e ,   φ ( n ) ] ≠ 1 d ∗ e [ e ,   φ ( n ) ] = 1   m o d   φ ( n ) c = ( m [ e ,   φ ( n ) ] ) e / [ e ,   [ e ,   φ ( n ) ]   m o d   n \begin{align} [e,\ \varphi(n)]\ne 1\\ d * \cfrac{e}{[e,\ \varphi(n)]}=1\bmod \varphi(n)\\ c = (m^{[e,\ \varphi(n)]})^{e/{[e,\ [e,\ \varphi(n)]}}\bmod n \end{align} [e, φ(n)]=1d[e, φ(n)]e=1modφ(n)c=(m[e, φ(n)])e/[e, [e, φ(n)]modn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值