c = "e585ace6ada3e887aae794b1e585ace6ada3e69687e6988ee5928ce8b090e585ace6ada3e585ace6ada3e69687e6988ee5928ce8b090e69687e6988ee585ace6ada3e5b9b3e7ad89e5928ce8b090e887aae794b1e5928ce8b090e6b395e6b2bbe585ace6ada3e5928ce8b090e5928ce8b090e695ace4b89ae5928ce8b090e69687e6988ee5928ce8b090e585ace6ada3e585ace6ada3e585ace6ada3e5928ce8b090e887aae794b1e5928ce8b090e5af8ce5bcbae5928ce8b090e5928ce8b090e585ace6ada3e585ace6ada3e5928ce8b090e5af8ce5bcbae5928ce8b090e69687e6988ee585ace6ada3e6b091e4b8bbe585ace6ada3e5b9b3e7ad89e5928ce8b090e695ace4b89ae585ace6ada3e69687e6988ee585ace6ada3e6b091e4b8bbe585ace6ada3e585ace6ada3e5928ce8b090e5af8ce5bcbae5928ce8b090e5928ce8b090e5928ce8b090e6b091e4b8bbe585ace6ada3e887aae794b1e5928ce8b090e6b395e6b2bbe5928ce8b090e69687e6988ee585ace6ada3e6b091e4b8bbe585ace6ada3e6b091e4b8bbe5928ce8b090e6b091e4b8bbe585ace6ada3e6b091e4b8bbe5928ce8b090e6b091e4b8bbe5928ce8b090e585ace6ada3e5928ce8b090e5af8ce5bcbae585ace6ada3e585ace6ada3e585ace6ada3e5928ce8b090e5928ce8b090e5928ce8b090e5928ce8b090e788b1e59bbd" c = bytes.fromhex(c) print(c.decode())
cipher = "db6b2e47c926f403f02ae9baf031d72aa1a160fc38" cipher = bytes.fromhex(cipher) for a inrange(1, 256, 2): for b inrange(0, 256): flag = "" for c in cipher: flag += chr((a*c + b) % 256) if flag.startswith("HXCTF{"): print(flag) # HXCTF{Y0u_found_^^e!}
from Crypto.Util.number import * c = 20581338524773710931014796705060927721164022110933170236907622868446276673276379960074983874694013071501404205921712458516719528791313217075372120292540769607768267213148470047192533783356651951103773544607365700830304720348095357381720861732062131428306950367835186817770742714377511664088124921726109762611 n = 131955690538161673663979223798074678499726259420694182793841613919440640794173261722991102718429029438380697505701015619452283142119487944084622078736557807531823541140258838261464844922518316272881433984179091296264635187662962573084675257499354062781067172877584482339564742280505536614114067794677477277487 leak = 2854831492248561377973114517344274987491834433439026310389937614171692082857812555747188089670141576752295596881129854180086210600895683598247563627762686 defrecover(p_lsb, k): if k == 512: return [p_lsb] result = [] for bit inrange(2): p = (bit << k) + p_lsb q = leak ^ p if (p*q - n) % (2**(k+1)) == 0: result.extend(recover(p, k+1)) return result result = recover(0, 0) for res in result: if n % res == 0: p = res break q = n // p d = pow(65537, -1, (p - 1) * (q - 1)) m = pow(c, d, p * q) print(long_to_bytes(m)) # HXCTF{7his_i5_the_r3al_s1gn-in_que5ti0n}
WeakSystem
密文空间大小只有\(A_8^8\),所以直接枚举key就行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from itertools import permutations, product cipher = [9, 25, 35, 81, 97, 187, 195, 131, 179, 155, 123, 195, 233, 163, 177, 155, 145, 209, 235, 123, 115, 137, 131, 209, 123, 163, 131, 233, 123, 11, 123, 179, 131, 155, 219] key = [i for i inrange(8)] all_key = list(permutations(key)) for key in all_key: flag = "" for i inrange(len(cipher)): binc = [int(b) for b inbin(cipher[i])[2:].zfill(8)] c_ = [binc[key[j]] for j inrange(8)] c = 0 for j inrange(len(c_)): c <<= 1 c ^= c_[j] flag += chr(c) if flag.startswith("HXCTF{"): print(flag) # HXCTF{easy_encrypto_What_can_I_say}
WeirVierWilson
这题就考了一个威尔逊定理,看题名也能猜到。
为了加速这个循环,主要用到了下面这个等式:
\[
(p - 1)! \equiv -1 \mod p
\]
所以实际上只需要遍历:
1
for i inrange(p + 1, p + p.bit_length())
就可以求出私钥,然后就是一个简单的RSA解密。
exp.py:
1 2 3 4 5 6 7 8 9 10 11 12 13
from Crypto.Util.number import *
prime = 137507368993355914860594752037581031045352928887415381942526303684476934340258890988567168982905997088929819580321685527266991589958746449618579850907765883870406926066972236505061792661515022699471025570619211456282127086268577930799928025034487476640164726617790269194813768322066680097473281637077598071503 n = 135682573094891703553176370837232897617602270323588124823165101627726795394883393432665305493991941306105477252624327158129510957489322126803110534374827392252943932529899808378499467893344818778838011561390030105276983196848035629485680341851450845219061424892927388790415769446019942364106200260533601837319 cipher = 41622954513604406352873105855005440904638036223332018757506281634908104215433400850153277514829103000815542937837390595177169806358970750719651237435525099636604205350232352002592510801557603418471900545470844050105254021489131546373444583233001627136018732688443852250808321663559410660967027997290818817259
d = -1 for i inrange(prime + 1, prime + prime.bit_length()): d = (d * i) % prime
m = pow(cipher, d, n) print(long_to_bytes(m)) # HXCTF{find_+he_f@c+ori@1_i5_very_5imp1e_wi+h_Wi15on'5_+heorem}
withopen("data.txt", "r") as f: M = eval(f.readline()) p = int(f.readline()) flag = 0 for m in M: mat = matrix(ZZ, [m[0:3], m[3:6], m[6:9]]) tmp = mat.det() % p flag <<= 1 if tmp > p - 10000or tmp < 10000: flag ^^= 1 else: flag ^^= 0 print(long_to_bytes(flag)) # HXCTF{Th3s3_m@trice5_ar3_n0t_di77icu1t_t0_di5tingu1sh}
import random from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad
classLCG(): def__init__(self, a, b, s): self.a = a self.b = b self.state = s defnext(self): self.state = (self.a * self.state + self.b) % (2**128) returnself.state
withopen("enc.txt", "r") as f: enc = eval(f.readline()) cipher = eval(f.readline()) total = len(data) for sbox inrange(256): data = [sbox^^c for c in enc] n = 5 output = [] for i inrange(n): U128 = data[total - 16*(i + 1) : total - 16*i] U128 = sum([U128[i] << 8*(15 - i) for i inrange(16)]) output = [U128] + output # print(output) PR.<a, b, s> = PolynomialRing(Zmod(2**128)) x = [s] for i inrange(n-1): x.append(a*x[-1] + b) I = PR.ideal([x[i] - output[i] for i inrange(n)]) a, b, s = I.groebner_basis()[:3] a = 2**128 - a.constant_coefficient() b = 2**128 - b.constant_coefficient() s = 2**128 - s.constant_coefficient() lcg = LCG(a, b, s) [lcg.next() for _ inrange(n-1)] key = lcg.next() flag = AES.new(int(key).to_bytes(16, "big"), mode=AES.MODE_ECB).decrypt(cipher) if flag.startswith(b"HXCTF"): print(flag) break # HXCTF{a_5maLl_m157aK3_L3Ad5_7O_a_hU93_prOBl3m}
from Crypto.Util.number import * from Crypto.Cipher import AES enc = b'\x81H\xd7_\x1c[\x00\xffkX+\x8d\n(-(U\xcd\x13$u\xa1\xceY.\x97\xfd8\x90\x07\xf5\x92' output = 46569537592563541192266548905767353620 mask = 288869314699467157022235107404330039071
mask_matrix = matrix([int(i) for i inbin(mask)[2:].zfill(128)]) M = zero_matrix(GF(2), 1, 127).stack(identity_matrix(127)).augment(mask_matrix.T) output_vec = vector([int(i) for i inbin(output)[2:].zfill(128)]) seed_vec = output_vec*(M^(-128)) seed = 0 for s in seed_vec: seed <<= 1 seed ^^= int(s) cipher = AES.new(long_to_bytes(seed), AES.MODE_ECB) cipher.decrypt(enc) # HXCTF{s1mpl3_1ine@r_5y5tem}