from Crypto.Util.number import * import random, sys
defget_prime(base, offset): l = base - (1 << offset) r = base + (1 << offset) p = random.randrange(l, r) | 1 while (not isPrime(p)): p += 2 return p
if __name__ == "__main__": p = getPrime(1127) q0 = p * 13 // 17 q = get_prime(q0, 573) # Konami withopen('flag.txt', 'rb') as f: flag = bytes_to_long(f.read()) N = p * q assert isPrime(p) and isPrime(q) and flag < N e = 0x10001 c = pow(flag, e, N) print(f"N = {N}") print(f"e = {e}") print(f"c = {c}")
1 2 3
N = 2537578464060405716805986209629349306801585799475566769629753550869939275098596985321844853409568013133264210149682740766024366488982429837531169509250859483526118776072099712258599263748732430570800661306460224380741403478451009927665855604092871949705081574682507168392533782265954982321389235080917435497979848348321877319477780053855288297818739223795823021264136388271573286209636548206594797813576810688640228747147522219625866870777713858310084857747151891233766790129427051420839675334815589489194938107230004427317376438129284740257550482956744843496127593401991789197386269415091390162278183972481279010769071314265529328954115911712467352483233380953386631332500882467 e = 65537 c = 1595212140002311449986774328911538131302021292459414446518934463751924694901681197719356391632660947700772362140375795419149621042035212501260054901239960931458611414432758551692762707025705203714868544808208482382713403084945106505851948109261999900909705955010772382362799626266428855540493176898287751627555377040483120618564113186968911259319525250268854097054159722810266326281435235140862840574780793343440289233893489065111751815693510473980454574606688640074455096644717769189843656600438932454630073349737743755427817726253307163184245099133341515200474243399626081459226215410055396366269535409932990065250476999485239927630147382130648035686165068584532121265385100009
#!/usr/bin/env sage # -*- coding: utf-8 -*- from Crypto.Util.number import * from gmpy2 import * from sympy import *
N = 2537578464060405716805986209629349306801585799475566769629753550869939275098596985321844853409568013133264210149682740766024366488982429837531169509250859483526118776072099712258599263748732430570800661306460224380741403478451009927665855604092871949705081574682507168392533782265954982321389235080917435497979848348321877319477780053855288297818739223795823021264136388271573286209636548206594797813576810688640228747147522219625866870777713858310084857747151891233766790129427051420839675334815589489194938107230004427317376438129284740257550482956744843496127593401991789197386269415091390162278183972481279010769071314265529328954115911712467352483233380953386631332500882467 e = 65537 c = 1595212140002311449986774328911538131302021292459414446518934463751924694901681197719356391632660947700772362140375795419149621042035212501260054901239960931458611414432758551692762707025705203714868544808208482382713403084945106505851948109261999900909705955010772382362799626266428855540493176898287751627555377040483120618564113186968911259319525250268854097054159722810266326281435235140862840574780793343440289233893489065111751815693510473980454574606688640074455096644717769189843656600438932454630073349737743755427817726253307163184245099133341515200474243399626081459226215410055396366269535409932990065250476999485239927630147382130648035686165068584532121265385100009
N = 221 * N a = iroot(N, 2)[0] whileTrue: if iroot(abs(a ** 2 - N), 2)[1]: x = iroot(abs(a ** 2 - N), 2)[0] p = symbols('p') q = symbols('q') ans = solve([221 * p * q - N, 13 * p - 17 * q - 2 * x], [p, q])[0] p = int(abs(ans[0])) q = int(abs(ans[1])) assert p * q == N // 221 print(long_to_bytes(pow(c, int(invert(e, (p-1)*(q-1))), N // 221))) break a += 1
flag = '' for i inrange(3): flag += attack(str(i).encode()).decode() print(flag)
ctfshow_login
最关键的代码
1 2 3 4 5 6
defverify_token(username, r, s, y): u = bytes_to_long(username) & MASK # No cheating ifany([x <= 0or x >= p - 1for x in (u, r, s)]): returnFalse returnpow(g, u, p) == (pow(y, r, p) * pow(r, s, p)) % p
defgenerate_token(username, x): whileTrue: u = bytes_to_long(username) & MASK k = randint(2, p - 2) if GCD(k, p - 1) != 1: continue r = pow(g, k, p) s = (u - x * r) * inverse(k, p - 1) % (p - 1) if s == 0: continue return (r, s)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from pwn import * from Crypto.Util.number import * from re import *
# context.log_level = 'debug' whileTrue: u = bytes_to_long(b'ZM.J@CTFshow') << 1024 sh = remote('pwn.challenge.ctf.show', 28066) content = sh.recvuntil(b'username (in hex):').decode() p, y = findall(r"\d+", content) p, y = int(p), int(y) u, r, s = long_to_bytes(u + (p - 1) // 2), (p - 1) // 2, (p - 1) // 2 sh.sendline(u.hex()) sh.recvuntil(b'r (in hex):') sh.sendline(hex(r)) sh.recvuntil(b's (in hex):') sh.sendline(hex(s)) flag = sh.recvline() ifb'ctfshow'in flag: print(flag) break
张八炫CTFshow三结义
考点
Gröbner基
1 2 3 4 5 6 7 8 9 10 11 12 13
from Crypto.Util.number import * from secret import zang, ba88, xuan, p, q, e
# F91 is my wife forever assert isPrime(e) and (e < 91)
N = p*q ps = list(map(bytes_to_long, (zang, ba88, xuan))) cs = [pow(i,e,N) for i in ps] s = sum(ps) # UNITE print(f"N = {N}") print(f"cs = {cs}") print(f"s = {s}")
[x + 26662827782051464615976567684752925677467881725332575738209359733512862160799560732998203503511148730687717124305275025073641447585135831097416975699029611753775395118044337114687461451203396381780284280332279054412946883024040851932234340654069479840307590336431065451668520879110676315718029797292361072793366910857300705975725867933068706498317130739553540485217415514125547447045647449411275827867898811663393269578679727735421639780469843184306978152618597198612892115614024042436618084049774644761224850091459122581613735095060947960942929699069451075614514322230810345965639861985343385928596524291866515457506, y + 26662827782051464615976567684752925677467881725332575738209359733512862160799560732998203503511148730687717124305275025073641447585135831097416975699029611753775395118044337114687461451203396381780284280332279054412946883024040851932234340654069479840307590336431065451668520879110676315718029797292361072793366910857300705975725867933068706498317130739553540485217415514125547447045647449411275827867898811663393269578679727735421639780469843184306978152618597198612892115614024042436618084049774644761224850091459122581613735095060947960942929699069451075614514322230810345965639868618012628867112994837267731290388, z + 26662827782051464615976567684752925677467881725332575738209359733512862160799560732998203503511148730687717124305275025073641447585135831097416975699029611753775395118044337114687461451203396381780284280332279054412946883024040851932234340654069479840307590336431065451668520879110676315718029797292361072793366910857300705975725867933068706498317130739553540485217415514125547447045647449411275827867898811663393269578679727735421639780469843184306978152618597198612892115614024042436618084049774644761224850091459122581613735095060947960942929699069451075614514322230810345965509879226494955760912958428560544399675]