2022-03-09

d3factor

(来源:AntCTF & Dˆ3CTF 2022)

from Crypto.Util.number import bytes_to_long, getPrime
from secret import msg
from sympy import nextprime
from gmpy2 import invert
from hashlib import md5

flag = 'd3ctf{'+md5(msg).hexdigest()+'}'
p = getPrime(256)
q = getPrime(256)
assert p > q
n = p * q
e = 0x10001
m = bytes_to_long(msg)
c = pow(m, e, n)

N = pow(p, 7) * q
phi = pow(p, 6) * (p - 1) * (q - 1)
d1 = getPrime(2000)
d2 = nextprime(d1 + getPrime(1000))
e1 = invert(d1, phi)
e2 = invert(d2, phi)

print(f'c = {c}')
print(f'N = {N}')
print(f'e1 = {e1}')
print(f'e2 = {e2}')
'''
c = 2420624631315473673388732074340410215657378096737020976722603529598864338532404224879219059105950005655100728361198499550862405660043591919681568611707967
N = 1476751427633071977599571983301151063258376731102955975364111147037204614220376883752032253407881568290520059515340434632858734689439268479399482315506043425541162646523388437842149125178447800616137044219916586942207838674001004007237861470176454543718752182312318068466051713087927370670177514666860822341380494154077020472814706123209865769048722380888175401791873273850281384147394075054950169002165357490796510950852631287689747360436384163758289159710264469722036320819123313773301072777844457895388797742631541101152819089150281489897683508400098693808473542212963868834485233858128220055727804326451310080791
e1 = 425735006018518321920113858371691046233291394270779139216531379266829453665704656868245884309574741300746121946724344532456337490492263690989727904837374279175606623404025598533405400677329916633307585813849635071097268989906426771864410852556381279117588496262787146588414873723983855041415476840445850171457530977221981125006107741100779529209163446405585696682186452013669643507275620439492021019544922913941472624874102604249376990616323884331293660116156782891935217575308895791623826306100692059131945495084654854521834016181452508329430102813663713333608459898915361745215871305547069325129687311358338082029
e2 = 1004512650658647383814190582513307789549094672255033373245432814519573537648997991452158231923692387604945039180687417026069655569594454408690445879849410118502279459189421806132654131287284719070037134752526923855821229397612868419416851456578505341237256609343187666849045678291935806441844686439591365338539029504178066823886051731466788474438373839803448380498800384597878814991008672054436093542513518012957106825842251155935855375353004898840663429274565622024673235081082222394015174831078190299524112112571718817712276118850981261489528540025810396786605197437842655180663611669918785635193552649262904644919
'''

由于
e 1 ∗ d 1 m o d p h i = 1 e1*d1\quad mod\quad phi=1 e1d1modphi=1
e 2 ∗ d 2 m o d p h i = 1 e2*d2\quad mod\quad phi=1 e2d2modphi=1

e 1 ∗ e 2 ∗ ( d 1 − d 2 ) = e 2 − e 1 m o d p h i e1*e2*(d1-d2)=e2-e1 \quad mod \quad phi e1e2(d1d2)=e2e1modphi

d 1 − d 2 = ( e 2 − e 1 ) ∗ i n v e r t ( e 1 ∗ e 2 , p h i ) d1-d2 =(e2-e1)*invert(e1*e2,phi) d1d2=(e2e1)invert(e1e2,phi)

搜到W&M的WP
在这里插入图片描述
但是还是不明白为啥invert(e1*e2,N)可以直接用N,而不是phi

等官方WP

好的,搞明白了
有篇描述这类问题的文章

理论如下
在这里插入图片描述
还有个例子
在这里插入图片描述弄明白了
代码如下

sage: c = 24206246313154736733887320743404102156573780967370209767226035295988643385324042248792190591
....: 05950005655100728361198499550862405660043591919681568611707967
....: N = 14767514276330719775995719833011510632583767311029559753641111470372046142203768837520322534
....: 078815682905200595153404346328587346894392684793994823155060434255411626465233884378421491251784
....: 478006161370442199165869422078386740010040072378614701764545437187521823123180684660517130879273
....: 706701775146668608223413804941540770204728147061232098657690487223808881754017918732738502813841
....: 473940750549501690021653574907965109508526312876897473604363841637582891597102644697220363208191
....: 233137733010727778444578953887977426315411011528190891502814898976835084000986938084735422129638
....: 68834485233858128220055727804326451310080791
....: e1 = 4257350060185183219201138583716910462332913942707791392165313792668294536657046568682458843
....: 095747413007461219467243445324563374904922636909897279048373742791756066234040255985334054006773
....: 299166333075858138496350710972689899064267718644108525563812791175884962627871465884148737239838
....: 550414154768404458501714575309772219811250061077411007795292091634464055856966821864520136696435
....: 072756204394920210195449229139414726248741026042493769906163238843312936601161567828919352175753
....: 088957916238263061006920591319454950846548545218340161814525083294301028136637133336084598989153
....: 61745215871305547069325129687311358338082029
....: e2 = 1004512650658647383814190582513307789549094672255033373245432814519573537648997991452158231
....: 923692387604945039180687417026069655569594454408690445879849410118502279459189421806132654131287
....: 284719070037134752526923855821229397612868419416851456578505341237256609343187666849045678291935
....: 806441844686439591365338539029504178066823886051731466788474438373839803448380498800384597878814
....: 991008672054436093542513518012957106825842251155935855375353004898840663429274565622024673235081
....: 082222394015174831078190299524112112571718817712276118850981261489528540025810396786605197437842
....: 655180663611669918785635193552649262904644919
sage: a = (e2-e1)*inverse_mod(e1*e2,N)
sage: ZmodN = Zmod(N)
sage: p.<x> = PolynomialRing(ZmodN)
sage: f = x-a
sage: x0 = f.small_roots(X = 2^1000,beta = 0.4)
sage: d1_d2 = x0[0]
sage: p = gcd(x0[0]*e1*e2 - (e2-e1),N)
sage: p
302041005420039804788837973713898327221537364540217123524277085489425015387406302827931741511110799839253993542589980437030294737549654496720894473925249726898113670841165053274897225331487693822448903890664321018179858685020471572484115220669783927170647297629616743131628132318835058700355916820746650505209238111625956099990183829787016000154371928717007922683297772484179270642107118214144502646097942422343431687478702790785714060858198343943546186776012201

然后我就卡了,卡到了
在这里插入图片描述
不太明白为啥iroot()不能用

啊,我知道了,这是gmpy2里的函数,忘记导入库了
继续

sage: from gmpy2 import *
sage: p = iroot(int(p),6)[0]
sage: q = N//(p**7)
sage: p**7*q==N
True
sage: phi = (p-1)*(q-1)
sage: n = p*q
sage: e = 0x10001
sage: d = inverse_mod(e,phi)
sage: pow(c,d,n)
241315145717868965507118897136682379087725777007508595870730075127504766444100339916188490986308417023257111991510218526173748364840319314752531758
sage:

然后就出来了
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值