部分密码题目复现,后续应该会把没复现的几道题补上吧(或许吧
费克特尔
1 2 3
| c=670610235999012099846283721569059674725712804950807955010725968103642359765806 n=810544624661213367964996895060815354972889892659483948276203088055391907479553 e=65537
|
简单的RSA,借助yafu对n进行质因数分解得到多了质数p1,p2,p3等。那么phi=(p1-1)(p2-1)(p3-1)·····
后续就正常RSA那一套解就好了。flag:TGCTF{f4888_6abdc_9c2bd_9036bb}
宝宝RSA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| from math import gcd from Crypto.Util.number import * from secret import flag
p1 = getPrime(512) q1 = getPrime(512) n1 = p1 * q1 phi = (p1 - 1) * (q1 - 1) m1 = bytes_to_long(flag[:len(flag) // 2]) e1 = getPrime(18) while gcd(e1, phi) != 1: e1 = getPrime(17) c1 = pow(m1, e1, n1)
print("p1 =", p1) print("q1 =", q1) print("c1 =", c1)
n2 = getPrime(512) * getPrime(512) e2 = 3 m2 = bytes_to_long(flag[len(flag) // 2:]) c2 = pow(m2, e2, n2)
print("n2 =", n2) print("c2 =", c2) print("e2 =", e2)
|
思路:flag拆成两部分,分别求出前后两部分然后合并即可。
前半部分知道p和q也知道e的大致范围(相对来说比较小)直接爆破即可,后半部分e很小可以进行爆破。
代码:
前半部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| from sympy import primerange from math import gcd from Crypto.Util.number import long_to_bytes import gmpy2
primes_17 = list(primerange(2**16, 2**17))
primes_18 = list(primerange(2**17, 2**18)) candidates = primes_17 + primes_18 p1 = 8362851990079664018649774360159786938757293294328116561219351503022492961843907118845919317399785168488103775809531198339213009936918460080250107807031483 q1 = 8312546034426788223492083178829355192676175323324230533451989649056072814335528263136523605276378801682321623998646291206494179416941978672637426346496531 phi = (p1 - 1) * (q1 - 1) valid_e = [e for e in candidates if gcd(e, phi) == 1]
c1 = 39711973075443303473292859404026809299317446021917391206568511014894789946819103680496756934914058521250438186214943037578346772475409633145435232816799913236259074769958139045997486622505579239448395807857034154142067866860431132262060279168752474990452298895511880964765819538256786616223902867436130100322 n1 = p1 * q1
for e in valid_e: d = pow(e, -1, phi) m1 = pow(c1, d, n1) flag_part = long_to_bytes(m1) if b'TGCTF' in flag_part: print(flag_part.decode()) break
|
后半部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from sympy import primerange from math import gcd from Crypto.Util.number import long_to_bytes import gmpy2
n2 = 103873139604388138367962901582343595570773101048733694603978570485894317088745160532049473181477976966240986994452119002966492405873949673076731730953232584747066494028393377311943117296014622567610739232596396108513639030323602579269952539931712136467116373246367352649143304819856986264023237676167338361059 c2 = 51380982170049779703682835988073709896409264083198805522051459033730166821511419536113492522308604225188048202917930917221 e2 = 3 k = 0 while 1: res = gmpy2.iroot(k*n2+c2,e2) if(res[1] == True): print(bytes.fromhex(hex(res[0])[2:])) break k += 1
|
tRwSiAns
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| from flag import FLAG from Crypto.Util.number import getPrime, bytes_to_long import hashlib
def generate_key(bits=512): p = getPrime(bits) q = getPrime(bits) return p * q, 3
def hash(x): return int(hashlib.md5(str(x).encode()).hexdigest(), 16)
def encrypt(m, n, e): x1, x2 = 307, 7 c1 = pow(m + hash(x1), e, n) c2 = pow(m + hash(x2), e, n) return c1, c2
m = bytes_to_long(FLAG) n, e = generate_key() c1, c2 = encrypt(m, n, e) print(f"n = {n}") print(f"e = {e}") print(f"c1 = {c1}") print(f"c2 = {c2}")
n = 100885785256342169056765112203447042910886647238787490462506364977429519290706204521984596783537199842140535823208433284571495132415960381175163434675775328905396713032321690195499705998621049971024487732085874710868565606249892231863632731481840542506411757024315315311788336796336407286355303887021285839839 e = 3 c1 = 41973910895747673899187679417443865074160589754180118442365040608786257167532976519645413349472355652086604920132172274308809002827286937134629295632868623764934042989648498006706284984313078230848738989331579140105876643369041029438708179499450424414752031366276378743595588425043730563346092854896545408366 c2 = 41973912583926901518444642835111314526720967879172223986535984124576403651553273447618087600591347032422378272332279802860926604693828116337548053006928860031338938935746179912330961194768693506712533420818446672613053888256943921222915644107389736912059397747390472331492265060448066180414639931364582445814
|
Franklin-Reiter 相关消息攻击 两个密文对应的消息存在线性关系.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from Crypto.Util.number import long_to_bytes import hashlib
def hash(x): return int(hashlib.md5(str(x).encode()).hexdigest(), 16) h1 = hash(307) h2 = hash(7)
n = 100885785256342169056765112203447042910886647238787490462506364977429519290706204521984596783537199842140535823208433284571495132415960381175163434675775328905396713032321690195499705998621049971024487732085874710868565606249892231863632731481840542506411757024315315311788336796336407286355303887021285839839 e=3 delta = h1 - h2 c1 = 41973910895747673899187679417443865074160589754180118442365040608786257167532976519645413349472355652086604920132172274308809002827286937134629295632868623764934042989648498006706284984313078230848738989331579140105876643369041029438708179499450424414752031366276378743595588425043730563346092854896545408366 c2 = 41973912583926901518444642835111314526720967879172223986535984124576403651553273447618087600591347032422378272332279802860926604693828116337548053006928860031338938935746179912330961194768693506712533420818446672613053888256943921222915644107389736912059397747390472331492265060448066180414639931364582445814
R.<s> = PolynomialRing(Zmod(n)) f = (s+h1)^3 - c1 g = (s +h2)^3 - c2 flag = -gcd(f, g)[0]
print(long_to_bytes(int(flag))) #TGCTF{RS4_Tw1nZ_d0You_th1nk_ItS_fun_2win?!!!1111111111}
|
LLLCG
咕咕咕,后续这题应该不搞了,大概去看LCG相关的题学习一下就好了
EZRSA
咕咕咕,这题emmmm也不搞了吧,学习一下p的低位泄露然后就过。