defencode(data): charset ="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" padd ="=" binstr ="".join(format(byte, "08b") for byte in data) padding = (5-len(binstr)%5) %5 binstr +="0"* padding groups = [binstr[i:i+5]for i inrange(0, len(binstr), 5)] result =""for group in groups: dec =int(group, 2) result += charset[dec] result += padd * (padding //2)return resultFLAG ="flag{fake_flag_dont_submit}"print(encode(FLAG.encode()))
Kode tersebut melakukan konversi dari 8 bit ke 5 bit lalu nilai dari 5 bit dikonversikan ke nilai pada charset. Jadi untuk mendapatkan plaintextnya tinggal dapatkan nilai 5 bit (dari index) lalu knoversi ke 8 bit. Berikut solver yang kami gunakan
charset ="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"ct ="*&(&)<+$*\"$%+?_?:.,[;[+~+{](+`#%,|![{[*;.]^@}@,>'.:@)_\"<+.:?+`>$'\"#$#`=((|};=="tmp_bin =""for i in ct: ind = charset.index(i) tmp_bin +=bin(ind)[2:].rjust(5,"0")flag =""for i inrange(0,len(tmp_bin),8): flag +=chr(int(tmp_bin[i:i+8],2))print(flag)
Flag : INTECHFEST{WhY_W0ulD_AnY0n3_Us3_Th1S_Enc0D1nG?}
Elysium (244 pts)
Description
-
Solution
Diberikan kode berikut
from Crypto.Util.number import bytes_to_longfrom sage.all import*defadd(G,P): return G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + P + P + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + \
G + G + P + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + P + G + G + P + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G +\ G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G +\ G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G +\ G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + P + G + Gflag =open('flag.txt', 'rb').read()p =0xffffffff00000001000000000000000000000000ffffffffffffffffffffffffK =GF(p)a =0xffffffff00000001000000000000000000000000fffffffffffffffffffffffcb =0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604bE =EllipticCurve(K, (a, b))G = E.gens()[0]m =bytes_to_long(flag)P = E.lift_x(Integer(m))Q =add(G, P)print('Q:', Q)
Add menjalankan operasi 288*G + 21*P . Karena kita tahu nilai G maka kita bisa kurangkan saja Q dengan 288*G untuk mendapatkan 21*P. Pada ecc terdapat konsep public dan private key dalam bentuk Q = nP dimana Q merupakan public key, n private key, dan P adalah base point. Jadi untuk mendapatkan P disini kita bisa lakukan inverse nilai n dengan order dari Q lalu kalikan dengan Q https://crypto.stackexchange.com/questions/86663/how-to-find-the-base-point-given-public-and-private-key-and-ec-parameters-except atau dalam bentuk persamaan adalah P = 21^-1 * Q. Berikut solver yang kami gunakan
from Crypto.Util.number import*defadd(G,P): return G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + P + P + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + \
G + G + P + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + P + G + G + P + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G + G +\ G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G + G +\ G + G + G + G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + G +\ G + G + G + G + G + P + G + G + G + G + G + G + G + G + G + G + P + G + Gp =0xffffffff00000001000000000000000000000000ffffffffffffffffffffffffK =GF(p)a =0xffffffff00000001000000000000000000000000fffffffffffffffffffffffcb =0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604bE =EllipticCurve(K, (a, b))G = E.gens()[0]Q =E(26326686390928441989926437302948364151298187886536227434090842323538336764500, 15057597490574272687879749163595226837809841897797118807290241444796596563842)q = Q.order()tmp = Q -288*Gflag =inverse(21, q)* tmpprint(long_to_bytes(int(flag.xy()[0])))