cryptohack_rsa_Infinite_Descent

一道有趣的题,知识点:因数分解(费马的方法):

(1)待分解的数n=10379。计算√n(指n的开平方,下同)。它不是整数,否则10379就是一个平方数了,而平方数已完成了至少一步因数分解。

(2)取大于等于√n的正整数N。可写成N=[√n]+1,其中[  ]是取整函数。显然,N^2>n。

(3)求N^2-n。然后考察它是不是平方数。注意,N^2-n应该不是很大,所以,比较容易判断它是不是平方数。若是,则问题基本解决:可设这个平方数为M^2,则有M^2=N^2-n,即n=N^2-M^2。所以根据平方差公式便得到n=(N+M)(N-M)。若不是,则继续算(N+1)^2-n,看它是不是平方数,······一直进行下去,直到出现平方数为止,或根本不出现平方数(文后会讨论这种情况)。

(4)具体来说,√10379=101.877···。取N=102,则N^2=10404,于是

N^2-n=10404-10379=25

本地题解脚本:

n = 383347712330877040452238619329524841763392526146840572232926924642094891453979246383798913394114305368360426867021623649667024217266529000859703542590316063318592391925062014229671423777796679798747131250552455356061834719512365575593221216339005132464338847195248627639623487124025890693416305788160905762011825079336880567461033322240015771102929696350161937950387427696385850443727777996483584464610046380722736790790188061964311222153985614287276995741553706506834906746892708903948496564047090014307484054609862129530262108669567834726352078060081889712109412073731026030466300060341737504223822014714056413752165841749368159510588178604096191956750941078391415634472219765129561622344109769892244712668402761549412177892054051266761597330660545704317210567759828757156904778495608968785747998059857467440128156068391746919684258227682866083662345263659558066864109212457286114506228470930775092735385388316268663664139056183180238043386636254075940621543717531670995823417070666005930452836389812129462051771646048498397195157405386923446893886593048680984896989809135802276892911038588008701926729269812453226891776546037663583893625479252643042517196958990266376741676514631089466493864064316127648074609662749196545969926051

n0=iroot(n,2)[0]+1
mm=0
for i in range(100000):
    nn=(n0+i)**2-n
    if iroot(nn,2)[1]:
        print(i)
        mm=(iroot(nn,2)[0])
        break
print(gcd(n0+mm,n))

p=gcd(n0+mm,n)
q=n//p
e = 65537
c = 98280456757136766244944891987028935843441533415613592591358482906016439563076150526116369842213103333480506705993633901994107281890187248495507270868621384652207697607019899166492132408348789252555196428608661320671877412710489782358282011364127799563335562917707783563681920786994453004763755404510541574502176243896756839917991848428091594919111448023948527766368304503100650379914153058191140072528095898576018893829830104362124927140555107994114143042266758709328068902664037870075742542194318059191313468675939426810988239079424823495317464035252325521917592045198152643533223015952702649249494753395100973534541766285551891859649320371178562200252228779395393974169736998523394598517174182142007480526603025578004665936854657294541338697513521007818552254811797566860763442604365744596444735991732790926343720102293453429936734206246109968817158815749927063561835274636195149702317415680401987150336994583752062565237605953153790371155918439941193401473271753038180560129784192800351649724465553733201451581525173536731674524145027931923204961274369826379325051601238308635192540223484055096203293400419816024111797903442864181965959247745006822690967920957905188441550106930799896292835287867403979631824085790047851383294389
phi=(p-1)*(q-1)
d=invert(e,phi)
m=pow(c,d,n)
print(pow(c,d,n))
print(long_to_bytes(m))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值