defgenerate_parameters(bit_length=512): p = getPrime(bit_length) q = getPrime(bit_length) n = p * q e = 65537 phi = (p - 1) * (q - 1) d = pow(e, -1, phi) s = p ** 4 + q ** 4 return n, e, d, s, p, q
defmain(): n, e, d, s, p, q = generate_parameters() flag = victory_encrypt(FLAG, victory_key).encode() c = pow(bytes_to_long(flag), e, n)
from Crypto.Util.number import * from gmpy2 import iroot
n = 88404336390052935295167907014990955167757899166459645006020564159910221950313103760744672095425046680977787806322104643113602241372187173741911921754830225380574290977520985329714483964734108589788286223669965444856353724037278541347276877433268175877986937451783914356003584010727646191451951063889248455609 e = 65537 c = 11921825186409298359079406916048192752767602192852391027241791193540838563492205016430418692802136940042065660220785320139908699089839204989955923648475022632803709791144611891680915190699364526974964681462990992432763033256899420495174369119948019155391667748721838548855253797865294424715858493207125261252 s = 22132256578806823997411210238808484780469981809371209041138582748325286114773081797359449254956289434027815102781847751566660330245563532030327073594906392050350502480761813167057219691372052865250833774891975836256799851265608403712175822132860992971312233187072699175930548398773550774537747747336997188361273018466118654290172956476269827800885378133620054325496862790981890907988859536668688826996940261310466429501167512388903117667233782399351835622719788747984955437789431901139660570839313478117275304708756873028209644328685542844890157184777151916692998517816399743210153407834925554864778286523140387691362
a2 = iroot(s + 2*n*n, 2)[0] a = iroot(a2 + 2*n, 2)[0] delt = iroot(a*a - 4*n, 2)[0]
q = (a + delt) // 2 p = a - q
d = inverse(e, (p-1)*(q-1)) m = pow(c, d, n) rsa_flag = long_to_bytes(m).decode()
defvigenere_decrypt(ct, key): out = [] ki = 0 for ch in ct: if ch.isalpha(): base = ord('A') if ch.isupper() elseord('a') k = ord(key[ki % len(key)].upper()) - 65# 使用65代替97更严谨,对应 'A' out.append(chr((ord(ch) - base - k) % 26 + base)) ki += 1 else: out.append(ch) return''.join(out)
key = "TUTCTF" flag = vigenere_decrypt(rsa_flag, key) print("[+] Final Flag:", flag)
ecc
题目
from Crypto.Util.number import * from Crypto.Cipher import AES from Crypto.Util.Padding import pad from random import randint import hashlib from sage.allimport * flag = b'TUTCTF{???}'
from Crypto.Util.number import * from secret import flag
m = bytes_to_long(flag) assertlen(flag)==32 p = getPrime(512) q = getPrime(512) n = p*q e = 65537 c1 = p^m c2 = pow(m,e,n) print(f'n = {n}') print(f'c1 = {c1}') print(f'c2 = {c2}') """ n = 139167681803392690594490403105432649693546256181767408269202101512534988406137879788255103631885736461742577594980136624933914700779445704490217419248411578290305101891222576080645870988658334799437317221565839991979543660824098367011942169305111105129234902517835649895908656770416774539906212596072334423407 c1 = 11201139662236758800406931253538295757259990870588609533820056210585752522925690049252488581929717556881067021381940083808024384402885422258545946243513996 c2 = 112016152270171196606652761990170033221036025260883289104273504703557624964071464062375228351458191745141525003775876044271210498526920529385038130932141551598616579917681815276713386113932345056134302042399379895915706991873687943357627747262597883603999621939794450743982662393955266685255577026078256473601 """"
exp
from gmpy2 import * from Crypto.Util.number import * from sage.allimport *
n = 139167681803392690594490403105432649693546256181767408269202101512534988406137879788255103631885736461742577594980136624933914700779445704490217419248411578290305101891222576080645870988658334799437317221565839991979543660824098367011942169305111105129234902517835649895908656770416774539906212596072334423407 c1 = 11201139662236758800406931253538295757259990870588609533820056210585752522925690049252488581929717556881067021381940083808024384402885422258545946243513996 c2 = 112016152270171196606652761990170033221036025260883289104273504703557624964071464062375228351458191745141525003775876044271210498526920529385038130932141551598616579917681815276713386113932345056134302042399379895915706991873687943357627747262597883603999621939794450743982662393955266685255577026078256473601 e = 65537 p = c1 ^^ 0 PR.<x> = PolynomialRing(Zmod(n))
defpartial_prime_known_highbits(n, known_high, unknown_bits): f = known_high * 2^unknown_bits + x roots = f.small_roots(X=2^unknown_bits, beta=0.4,epsilon = 0.01) for r in roots: p = int(known_high * 2^unknown_bits + r) if p and n % p == 0: return p returnNone for i inrange(0,256): print(i) p_high = p >> 256 p_high = p_high << 8 p_high = p_high + i try: p0 = partial_prime_known_highbits(n,p_high,248) q = n // p0 if p0*q == n: phi = int((p0-1)*(q-1)) d = inverse(e,phi) m = pow(c2,d,n) print(long_to_bytes(int(m))) break except: continue