from Crypto.Util.number import bytes_to_long from gmpy2 import iroot
X = 153801856029563198525204130558738800846256680799373350925981555360388985602786501362501554433635610131437376183630577217917787342621398264625389914280509 Y = 8086061902465799210233863613232941060876437002894022994953293934963170056653232109405937694010696299303888742108631749969054117542816358078039478109426 n = 161010103536746712075112156042553283066813155993777943981946663919051986586388748662616958741697621238654724628406094469789970509959159343108847331259823125490271091357244742345403096394500947202321339572876147277506789731024810289354756781901338337411136794489136638411531539112369520980466458615878975406339 c = 64166146958225113130966383399465462600516627646827654061505253681784027524205938322376396685421354659091159523153346321216052274404398431369574383580893610370389016662302880230566394277969479472339696624461863666891731292801506958051383432113998695237733732222591191217365300789670291769876292466495287189494
p, q = var('p q') res = solve([p - q + 1 + X + 2 * Y == 0, p * q - n == 0], p, q) res
from Crypto.Util.number import * from secrets import flag
flag = b'D0g3xGC{**************}'
p = 7389313481223384214994762619823300589978423075857540712007981373887018860174846208000957230283669342186460652521580595183523706412588695116906905718440770776239313669678685198683933547601793742596023475603667 e = 31337 f = 7236042467316654159796543399639966340258093274047941788600980451877044636122969830708918356119442228154447395855689559447196348683125675305629837437591088260218138895919514078948650757100432223219969122629790 g = 1878626136321051642174045874618248475160620873585704351202865003185878331837410979441756843820270907300810543618813757245154196050399357659526631164136221434463496532263979506870318259276669412698827040743576
x = bytes_to_long(flag) assert x < p c = (110 * pow(e, x, p) + 313 * pow(f, x, p) + 114 * pow(g, x, p)) % p print(f'c = {c}')
''' c = 5003324252656056930087505194738200296872282299746430611085214151768620410152366859389263573717075916742795347155844500093363517699628404615954372680403623746687159249269535039393284499190947340286216945761058 '''
这题和XYCTF的fakeRSA有点像,我刚开始是想到转到矩阵上去解题了
这边的p我们分解一下可以发现p-1是光滑的,那么dlp就很好求了
那么我们现在只要求出ex、fx、gx其中任意一个的值,就可以拿到x的值
这边其实是有如下的隐含条件
f≡e−1(modp)g≡e−2(modp)
带入原方程,很容易得到
110∗ex+313∗e−x+114∗e−2x≡c(modp)
简单换元法一下,有ex=t,再整理一下,有
110∗t3−c∗t2+313∗t+114≡0(modp)
直接roots解一下然后再dlp一下就行了
exp:
1 2 3 4 5 6 7 8 9 10 11 12
from Crypto.Util.number import *
p = 7389313481223384214994762619823300589978423075857540712007981373887018860174846208000957230283669342186460652521580595183523706412588695116906905718440770776239313669678685198683933547601793742596023475603667 c = 5003324252656056930087505194738200296872282299746430611085214151768620410152366859389263573717075916742795347155844500093363517699628404615954372680403623746687159249269535039393284499190947340286216945761058
R.<t> = Zmod(p)[] F = 110 * t ^ 3 - c * t ^ 2 + 313 * t + 114
g = 31337 y = F.roots()[0][0] x = discrete_log(y, mod(g, p)) print(long_to_bytes(int(x))) #b'D0g3xGC{C0mbin@ti0n_0f_d1sCretE}'