defRSA(): p = getPrime(512) q = getPrime(512) n = p * q k = getPrime(8) m = bytes_to_long(flag) e = inverse(c,(p-1)*(q-1)) cipher = pow(m,e,n) return n,k,cipher
# 因为 a 和 x1 都巨大,不能暴力循环! # 正确数学解法:a 在 [L, R) 区间,b 也必须落在 [L, R) # 解不等式:L ≤ C + 2*a*x1 ≤ R
# 解下界 # C + 2*a*x1 >= L # a >= (L - C) / (2*x1)
# 解上界 # C + 2*a*x1 < R # a < (R - C) / (2*x1)
a_min = ceil( (L - C) / (2*x1) ) a_max = floor( (R - C - 1) / (2*x1) )
# 这个区间里只有一个整数,就是答案 for a in range(a_min, a_max+1): b = C + 2*a*x1 if L <= b < R: print("a1 =", a) print("b1 =", b) break #a1 = 1044146410364763997022740502616607659 #b1 = 1107229666869418904756867438511144199 ```
```python from Crypto.Util.number import * from secrets import flag
p = 9259018534502783714631247560818133078409930397939705162361230465031580254504264713899169170790687716589100652406132800533397486109926387016562663961524649 a = 0 b = 6235467631650349040636525320446729529985562949423449382969614887116983248527693872546808737512375916974084741892428681798937790855872528526403738040908493 c = 4165903654767429195543540819098180314477702137507994424192636596518008877139978822038616746899053449640020812062736993008962585578921635697413459959685760 d = 1889382340373247565387211782596794283852946561870564309251998196824383297786878212641581641540685106266683503654620956037368416192796434147249748216284648 e = 3015564788819504594313842562882781366361783108618226049128986996153057550014499326419988348165744003693083108924831219996703133056523468396967900376388617
def add(P1, P2): if P1 is None: return P2
x1, y1 = P1 x2, y2 = P2
l = (y2 - y1) * pow(x2 - x1, -1, p) % p x3 = (l**2 + a * l - b - x1 - x2) % p y3 = (l * (x1 - x3) - y1 - a * x3 - c) % p return (x3, y3)
def double(P): if P is None: return None
x, y = P
denom = (2 * y + a * x + c) % p num = (3 * x**2 + 2 * b * x + d - a * y) % p l = (num * pow(denom, -1, p)) % p x3 = (l**2 + a * l - b - 2 * x) % p y3 = (l * (x - x3) - y - a * x3 - c) % p return (x3, y3)
def mul(k, P): Q = None while k: if k & 1: Q = add(Q, P) P = double(P) k >>= 1 return Q
m = bytes_to_long(flag) G = (1244884551970947614719458919805713649754289814760243366205012699871413235954279930743612403791919112394457579170253990713250052822262255880036254772609156, 4579639528751113977115209571728128585569082149696598770106934145500742785077382446292613925719404433141749168427443122707253164477493499731016883616496009) P = mul(m, G) print(P)
p = 9259018534502783714631247560818133078409930397939705162361230465031580254504264713899169170790687716589100652406132800533397486109926387016562663961524649 a = 0 b = 6235467631650349040636525320446729529985562949423449382969614887116983248527693872546808737512375916974084741892428681798937790855872528526403738040908493 c = 4165903654767429195543540819098180314477702137507994424192636596518008877139978822038616746899053449640020812062736993008962585578921635697413459959685760 d = 1889382340373247565387211782596794283852946561870564309251998196824383297786878212641581641540685106266683503654620956037368416192796434147249748216284648 e = 3015564788819504594313842562882781366361783108618226049128986996153057550014499326419988348165744003693083108924831219996703133056523468396967900376388617
G = ( 1244884551970947614719458919805713649754289814760243366205012699871413235954279930743612403791919112394457579170253990713250052822262255880036254772609156, 4579639528751113977115209571728128585569082149696598770106934145500742785077382446292613925719404433141749168427443122707253164477493499731016883616496009, )
P = ( 9039120379228240875764080238389949393433230267005269099421166553853462484353350917730468887801035670710981414900285176863179650428412616144755102163764906, 6266065680737729548475090556806928225106996606788926050268440244885398464756877886842570309216095272026404453765198968208595242208306240371310555394416694, )
definv(x): returnpow(x, -1, p)
deflong_to_bytes(n: int) -> bytes: if n == 0: returnb"\x00" return n.to_bytes((n.bit_length() + 7) // 8, "big")
lam = (y2 - y1) * inv((x2 - x1) % p) % p x3 = (lam * lam + a * lam - b - x1 - x2) % p y3 = (lam * (x1 - x3) - y1 - a * x3 - c) % p return (x3, y3)
defdouble(Pt): if Pt isNone: returnNone
x, y = Pt
denom = (2 * y + a * x + c) % p num = (3 * x * x + 2 * b * x + d - a * y) % p lam = num * inv(denom) % p x3 = (lam * lam + a * lam - b - 2 * x) % p y3 = (lam * (x - x3) - y - a * x3 - c) % p return (x3, y3)
defmul(k, Pt): Q = None while k: if k & 1: Q = add(Q, Pt) Pt = double(Pt) k >>= 1 return Q