nssctf Round11 wp

Crypto 专场

ez_signin

签到题,有一天在某个群说过要出一个p q e c n都给的signin,于是写了这个题

当然,还是要做些手脚的,比如这里p q需要简单推导,比如e=0x10000,写这篇blog的时候还没开赛,不知道大家会做的怎么样,希望大家都能成功签到(真诚

先推式子

将上式与n求gcd即可分解n
特殊的地方在e=65536,观察可以得到这里p q都是4k+3型素数,想到是rabin的变式,进行16次rabin算法即可
exp:

from Crypto.Util.number import *
import gmpy2

num1= 134186458247304184975418956047750205959249518467116558944535042073046353646812210914711656218265319503240074967140027248278994209294869476247136854741631971975560846483033205230015783696055443897579440474585892990793595602095853960468928457703619205343030230201261058516219352855127626321847429189498666288452      
num2= 142252615203395148320392930915384149783801592719030740337592034613073131106036364733480644482188684184951026866672011061092572389846929838149296357261088256882232316029199097203257003822750826537629358422813658558008420810100860520289261141533787464661186681371090873356089237613080052677646446751824502044253      
n= 154128165952806886790805410291540694477027958542517309121222164274741570806324940112942356615458298064007096476638232940977238598879453357856259085001745763666030177657087772721079761302637352680091939676709372354103177660093164629417313468356185431895723026835950366030712541994019375251534778666996491342313
c= 9061020000447780498751583220055526057707259079063266050917693522289697419950637286020502996753375864826169562714946009146452528404466989211057548905704856329650955828939737304126685040898740775635547039660982064419976700425595503919207903099686497044429265908046033565745195837408532764433870408185128447965

p = GCD(num1+num2,n)
q = n//p

x0=gmpy2.invert(p,q)
x1=gmpy2.invert(q,p)
cs = [c]
for i in range(16):
    ps = []
    for c2 in cs:
        r = pow(c2, (p + 1) // 4, p)
        s = pow(c2, (q + 1) // 4, q)

        x = (r * x1 * q + s * x0 * p) % n
        y = (r * x1 * q - s * x0 * p) % n
        if x not in ps:
            ps.append(x)
        if n - x not in ps:
            ps.append(n - x)
        if y not in ps:
            ps.append(y)
        if n - y not in ps:
            ps.append(n - y)
    cs = ps

for m in ps:
    flag = long_to_bytes(m)
    if b"nssctf" in flag:
        print(flag)
        break

ez_fac

检索一下相关文献,比如这个:
A Note on Euler's Factoring Problem-Brillhart_Euler_factoring_2009

对于这个题目本身就没什么可说的了
exp:

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

c= 35365949784050829929861737789236020559135622198897625351353637445622956768233865962002277568692477708475206540271806542711843022878152143032364877838180739249214035959876599676088358907232330955234529703338468238427784663238111249828170368817450879581282130905777101291196257788568056540581712737620696888181
n= 60759060882959791909904396677188989949758090199603630243982902422381690538885036721260587316981956179159099537464766520810988299027308891716697721325694989187113132568281096643090555966502943628821584608317087986774067361766441006582461264783625589284748285132591500064467264821214540974749792006934616412217
a0= 7794809868300816476939749391923181660663599092817735689970830403880360740950291069966802056703842257352942487715953634294627774900178116901736408438781725
a1= 7794809868300816476939748778965768208814733337627617321244638924271232070361166330324980435743037906985498772947115676315756364476413563742000304770717475
b0= 19283995921825875899155714134110227538038032500196406129941198508864582000463560816723795975202107099295086076956040133684
b1= 172332404813056620110912939211150875333966617506319147214329967023854401850532359816888852973202924631133349299841944983684

temp=a0*b1-a1*b0
p=GCD(temp,n)

q=n//p
e=(2*n-a0*a0-a1*a1)//(b0*b0+b1*b1)

phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))

同样的,在写这篇blog的时候并不知道师傅们的解题情况,也不太清楚师傅们对这个代数结构的了解有多少(思考),由于是basic难度的round赛,只出了这个问题的第一部分,我们还可以思考以下问题:
1.题目中的四个参数是否可求
2.当对四个参数的低位使用noise数据进行干扰后,是否有coppersmith等方法有效还原
3.第三个就不说了,以后的赛题见吧///

ending

感谢xenny邀请出题,时间匆忙,结合比赛时长和赛题难度简单命制了两个还算较有趣的问题
希望没有背锅
希望师傅们玩的开心
希望以后有更精彩的问题投到nssctf
唯一遗憾的是因为命题错过了这次crypto专场,没办法上分了,什么时候能到rank1哇!!!(气)

posted @ 2023-04-07 12:46  App1e_Tree  阅读(68)  评论(0编辑  收藏  举报