连分数

概念

连分数(continued fraction)是特殊繁分数。如果$a_0,a_1,a_2,\dots,a_n,\dots$都是整数,则将分别称为无限连分数和有限连分数。可简记为$a_0,a_1,a_2,\dots,a_n,\dots$和$a_0,a_1,a_2,\dots,a_n$。一般一个有限连分数表示一个有理数,一个无限连分数表示一个无理数。如果$a_0,a_1,a_2,\dots,a_n,\dots$都是实数,可将上述形式连分数分别叫无限连分数和有限连分数 。

有理数的连分数展开

一个有理数总能有整数经过有限步代数运算得到,那么在连分数里就意味着,有理数可以表示成有限项连分数。

举个例子:

$$\frac{67}{29}=2+\frac{1}{3+\frac{1}{4+\frac{1}{2}}}=[2,3,4,2]$$

当项数为有限项时,可以简写为:$[a_1,a_2,a_3,\dots,a_n]$

有理数连分数展开代码

# sage
n1=
n2=
c = continued_fraction(Integer(n1) / Integer(n2))

基于连分数的攻击

Legendre定理

根据Legendre定理,只要满足上式不等式,则$\frac{a}{b}$是$\xi$连分数近似,也就是说对$\xi$连分数展开可以得到某项为$a_i= \frac{a}{b}$。

维纳攻击原理

适用条件:$N,e$已知,在$e$过大或过小的情况下,可以快速推断出$d$的值,解决$q<p<2q,d< \frac{1}{3}N^{\frac{1}{4}}$的问题。

现用Legendre定理证明使用连分数方式可以求解。

$proof:$

$设\lambda(N)=lcm(p-1,q-1)= \frac{(p-1)*(q-1)}{G}= \frac{\varphi(N)}{G}$,其中$G=gcd(p-1,q-1)$。

由$$ed≡1(mod \space \lambda(N))$$

故存在$k$使得$$ed=k\lambda(N)+1=k\frac{\varphi(N)}{G}+1$$

等式两边同除$dG\lambda(N)$得

$$|\frac{e}{\varphi(N)}-\frac{k}{Gd}|=\frac{1}{d\varphi(N)}$$

由于$N \approx \varphi(N)$,上式变为

$$|\frac{e}{N}-\frac{k}{Gd}|=|\frac{1-\frac{k}{G}(N-\varphi(N))}{Nd}|$$

则根据已知条件得到

$$|\frac{e}{N}-\frac{k}{Gd}|<\frac{3k}{d\sqrt{N}}<\frac{1}{dN^{\frac{1}{4}}}<\frac{1}{2d^2}$$

则根据Legendre定理,将$\frac{e}{N}$连分数展开可以得到$d$。

维纳攻击实现

from Crypto.Util.number import *

N=
e=
enc=

c = continued_fraction(Integer(e) / Integer(N))

for i in range(1, len(c)):
    d = c.denominator(i)
    k = c.numerator(i)
    if (e*d-1)%k==0:
        m=pow(enc,d,N)
        print(long_to_bytes(m))

[强网杯 2022]factor

题目第一部分如下:

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

def gen1():
	r = 2
	while True:
		p2 = getPrime(1792)
		p1 = getPrime(1792)

		q1 = getPrime(512)
		q2 = getPrime(512)

		if (abs(p1-p2) < (p1//(2*r*q1*q2))):
			n1, n2 = (p1**r)*q1, (p2**r)*q2
			break

	phi1 = (p1**(r-1))*(p1-1)*(q1-1)
	phi2 = (p2**(r-1))*(p2-1)*(q2-1)
	while True:
		e1 = randint(5, (p1-1)*(q1-1))
		e2 = randint(5, (p2-1)*(q2-1))
		if gcd(e1, e2) == 1 and gcd(phi1, e1) == 1 and gcd(phi2, e2) == 1:
			break
	return n11, n12, e11, e12

n11, n12, e11, e12 = gen1()
c11 = powmod(m1, e11, n11)
c12 = powmod(m2, e12, n12)

'''
n11=801049932940568005269978912396585741498810389425615966036828877784238116634177290247194019425111606811005728521368879065336038221361037062407029836155148874719789714345603547779284558101833801155509762818376470874215789574939002212274399950433269775325144015468620263028557804618774240232988157961712628677901130814703917513004114547234375629747176834581166306552311075522669403347828095831520693563291249869832390698646691647204371133362254846234990175138047928703289833460734235302093916147489509206061923877623300596194317059884824322527532662470348274079800781120104946546063500763852622187404608639542858285661288293918912184354236687975919510300221932074135531028314170475917110204254042336116619335841213418990605590620842511615815443114612333881430920769002933370887494558640833005339906706603497809846863863967391543647049224309556936909768179259581851520214669904560467640473144481633920438487615788689262961741053146610554997224861331949716721056553499531186695425439163222802917813140266513735841447717418846360096652592844940362932171019143434080184728093326143821165097895058935372215708948088248596585127475770021962501262915274497478428868130455122612016408381607561200802267038869516896665387576895570245272035575637
n12=635401970340205725139325006504978344512744926958688031423448003992072769931808217486709574151492230879374574313457662436423263437792389711379687512056391117410807565492548718691166183372633151644917135272259770997096195518489056319350258673723095417922153182423913759272893696867426193704479752772511081457729513843682588951499551132432923147997238597538055902932123792252593514225328196541483451747314048080824405530742533473914329294346486691684904100406972073037050089861816604505650042953778360621934380815999541183067585498606053857125775979915077329566722531830089714823979965934190338538564188253271016367299890015449611141166780048763403252309160517164569110740561584100839212138661881615351382946813818078899882595313362934594951895560189003438775450675343590147821186953526262224973333962454561275321925151619178204499342339749637758100126893330994252902926509705617882239610380420830791088907378397226817514095468815228186716220057075095711894070032344613244803934541318573847029365563159918970404057137270884587905766828750387753130065274147902379993224780149663600462492281891320702134153853359393588902750423972068679293373333869389393970353760507436913233657422185531482023237384247535554666481760197851108297145147371
e11=1898839980562048754607069073527844852132536432440793106124181406514770178066775988232362054809850074774981836898118651469424148725970708199461113088705044905633592578936333918328544505910996746428679299419879472444790941363558025887620570856598548320246426354974395765243741646121743413447132297230365355148066914830856904433750379114692122900723772114991199979638987571559860550883470977246459523068862898859694461427148626628283198896659337135438506574799585378178678790308410266713256003479022699264568844505977513537013529212961573269494683740987283682608189406719573301573662696753903050991812884192192569737274321828986847640839813424701894578472933385727757445011291134961124822612239865
e12=1262647419018930022617189608995712260095623047273893811529510754596636390255564988827821761126917976430978175522450277907063247981106405519094560616378241247111698915199999363948015703788616554657275147338766805289909261129165025156078136718573006479030827585347458143645738353716189131209398056741864848486818076440355778886993462012533397208330925057305502653219173629466948635110352752162442552541812665607516753186595817376029707777599029040724727499952161261179707271814405907165207904499722122779096230563548011491932378429654764486855147873135769116637484240454596231092684424572258119768093562747249251518965380465994055049411715353547147466711949391814550591591830515262296556050946881
c11=18979511327426975645936984732782737165217332092805655747550406443960209507493506811471688957217003792679188427155591583024966608843371190136274378868083075515877811693937328204553788450031542610082653080302874606750443090466407543829279067099563572849101374714795279414177737277837595409805721290786607138569322435729584574023597293220443351227559400618351504654781318871214405850541820427562291662456382362148698864044961814456827646881685994720468255382299912036854657082505810206237294593538092338544641919051145900715456411365065867357857347860000894624247098719102875782712030938806816332901861114078070638796157513248160442185781635520426230183818695937457557248160135402734489627723104008584934936245208116232179751448263136309595931691285743580695792601141363221346329077184688857290503770641398917586422369221744736905117499140140651493031622040723274355292502182795605723573863581253354922291984335841915632076694172921289489383700174864888664946302588049384130628381766560976143458735712162489811693014419190718601945154153130272620025118408017441490090252674737105557818759190934585829634273698371996797545908125156282869589331913665938038870431655063063535672001112420959158339261862052308986374193671007982914711432579
c12=336587005671304527566745948355290412636261748969581976214239578621816863343117433524033533838636941679300497270909696775021031004312477997130741361709262822736904340641138652359632950455651920464042448022467664596484055174270895170499076347333381222768518599018520948098943626229061996126260154604038101543546588917619576702866444998578555907070990331574722135141778182631559802154493815687284077524469331290249057291163803290619701104007028836609832847351748020354798788508790258935718399783002069490123663345156902440501507117289747695510266461539019431610123351176227443612317037899257774045751487135646052309277098939919088029284437221840182769808850184827681307611389353392683707516141736067793897378911235819049432542758429901945202632117089595899280390575706266239252841152490534353760118231918190110043319877744119083811214707593122757409240645257409097436061825613686773916466122693168971062418046703969144004779270391320645495586024342668002497155358623795942692477164489475917351003149045087283510728981096449890130735055015075557614253867698702479920619299919816768972581273507837309179450374634916567083251630203067065663910073926990517108921490442919372774170201239734064819301693527366233007925670043499415100789027665

'''

题目给了两个$n$,首先判断有没有公因数,若有公因数则可直接分解,在尝试之后发现并没有公因子。此时发现$n$中的因子位数相差比较大,并且给出了$p_1-p_2$的上界,联想到连分数近似。尝试$\frac{n_{12}}{n_{11}}$连分数展开,找到$q_1,q_2$。其实这是必然的。

$$|\frac{n_{12}}{n_{11}}-\frac{q_2}{q_1}|=|\frac{({p_2}^2-{p_1}^2)*q_2}{{p_1}^2*q_1}|$$

$$<\frac{(p_1+p_2)* \frac{p_1}{4q_1q_2}*q_2}{{p_1}^2*q_1}$$

$$=\frac{p_1+p_2}{4{p_1}{q_1}^2}$$

要使Legendre定理成立则只需要满足$\frac{p_1+p_2}{4{p_2}}<1$即可,显然成立,因此连分数展开。

我的解答

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

n11=801049932940568005269978912396585741498810389425615966036828877784238116634177290247194019425111606811005728521368879065336038221361037062407029836155148874719789714345603547779284558101833801155509762818376470874215789574939002212274399950433269775325144015468620263028557804618774240232988157961712628677901130814703917513004114547234375629747176834581166306552311075522669403347828095831520693563291249869832390698646691647204371133362254846234990175138047928703289833460734235302093916147489509206061923877623300596194317059884824322527532662470348274079800781120104946546063500763852622187404608639542858285661288293918912184354236687975919510300221932074135531028314170475917110204254042336116619335841213418990605590620842511615815443114612333881430920769002933370887494558640833005339906706603497809846863863967391543647049224309556936909768179259581851520214669904560467640473144481633920438487615788689262961741053146610554997224861331949716721056553499531186695425439163222802917813140266513735841447717418846360096652592844940362932171019143434080184728093326143821165097895058935372215708948088248596585127475770021962501262915274497478428868130455122612016408381607561200802267038869516896665387576895570245272035575637
n12=635401970340205725139325006504978344512744926958688031423448003992072769931808217486709574151492230879374574313457662436423263437792389711379687512056391117410807565492548718691166183372633151644917135272259770997096195518489056319350258673723095417922153182423913759272893696867426193704479752772511081457729513843682588951499551132432923147997238597538055902932123792252593514225328196541483451747314048080824405530742533473914329294346486691684904100406972073037050089861816604505650042953778360621934380815999541183067585498606053857125775979915077329566722531830089714823979965934190338538564188253271016367299890015449611141166780048763403252309160517164569110740561584100839212138661881615351382946813818078899882595313362934594951895560189003438775450675343590147821186953526262224973333962454561275321925151619178204499342339749637758100126893330994252902926509705617882239610380420830791088907378397226817514095468815228186716220057075095711894070032344613244803934541318573847029365563159918970404057137270884587905766828750387753130065274147902379993224780149663600462492281891320702134153853359393588902750423972068679293373333869389393970353760507436913233657422185531482023237384247535554666481760197851108297145147371
e11=1898839980562048754607069073527844852132536432440793106124181406514770178066775988232362054809850074774981836898118651469424148725970708199461113088705044905633592578936333918328544505910996746428679299419879472444790941363558025887620570856598548320246426354974395765243741646121743413447132297230365355148066914830856904433750379114692122900723772114991199979638987571559860550883470977246459523068862898859694461427148626628283198896659337135438506574799585378178678790308410266713256003479022699264568844505977513537013529212961573269494683740987283682608189406719573301573662696753903050991812884192192569737274321828986847640839813424701894578472933385727757445011291134961124822612239865
e12=1262647419018930022617189608995712260095623047273893811529510754596636390255564988827821761126917976430978175522450277907063247981106405519094560616378241247111698915199999363948015703788616554657275147338766805289909261129165025156078136718573006479030827585347458143645738353716189131209398056741864848486818076440355778886993462012533397208330925057305502653219173629466948635110352752162442552541812665607516753186595817376029707777599029040724727499952161261179707271814405907165207904499722122779096230563548011491932378429654764486855147873135769116637484240454596231092684424572258119768093562747249251518965380465994055049411715353547147466711949391814550591591830515262296556050946881
c11=18979511327426975645936984732782737165217332092805655747550406443960209507493506811471688957217003792679188427155591583024966608843371190136274378868083075515877811693937328204553788450031542610082653080302874606750443090466407543829279067099563572849101374714795279414177737277837595409805721290786607138569322435729584574023597293220443351227559400618351504654781318871214405850541820427562291662456382362148698864044961814456827646881685994720468255382299912036854657082505810206237294593538092338544641919051145900715456411365065867357857347860000894624247098719102875782712030938806816332901861114078070638796157513248160442185781635520426230183818695937457557248160135402734489627723104008584934936245208116232179751448263136309595931691285743580695792601141363221346329077184688857290503770641398917586422369221744736905117499140140651493031622040723274355292502182795605723573863581253354922291984335841915632076694172921289489383700174864888664946302588049384130628381766560976143458735712162489811693014419190718601945154153130272620025118408017441490090252674737105557818759190934585829634273698371996797545908125156282869589331913665938038870431655063063535672001112420959158339261862052308986374193671007982914711432579
c12=336587005671304527566745948355290412636261748969581976214239578621816863343117433524033533838636941679300497270909696775021031004312477997130741361709262822736904340641138652359632950455651920464042448022467664596484055174270895170499076347333381222768518599018520948098943626229061996126260154604038101543546588917619576702866444998578555907070990331574722135141778182631559802154493815687284077524469331290249057291163803290619701104007028836609832847351748020354798788508790258935718399783002069490123663345156902440501507117289747695510266461539019431610123351176227443612317037899257774045751487135646052309277098939919088029284437221840182769808850184827681307611389353392683707516141736067793897378911235819049432542758429901945202632117089595899280390575706266239252841152490534353760118231918190110043319877744119083811214707593122757409240645257409097436061825613686773916466122693168971062418046703969144004779270391320645495586024342668002497155358623795942692477164489475917351003149045087283510728981096449890130735055015075557614253867698702479920619299919816768972581273507837309179450374634916567083251630203067065663910073926990517108921490442919372774170201239734064819301693527366233007925670043499415100789027665

c = continued_fraction(Integer(n12) / Integer(n11))

for i in tqdm(range(0, len(c))):
    q1 = c.denominator(i)
    q2 = c.numerator(i)
    if isPrime(q1) and isPrime(q2):
        p1=int(iroot(n11//q1,2)[0])
        p2=int(iroot(n12//q2,2)[0])
        phi1=p1*(p1-1)*(q1-1)
        phi2=p2*(p2-1)*(q2-2)
        try:
            d1=invert(e11,phi1)
            d2=invert(e12,phi2)
            m1=pow(c11,d1,n11)
            m2=pow(c12,d2,n12)
            print(m1,m2)
        except:
            pass

文章作者: x1ao
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 x1ao
CTF Crypto
喜欢就支持一下吧