import base64 file = open("flag_encode.txt",'r') file2 = open("flag",'w') base = file.read() while(1): try: base = base64.b32decode(base).decode() except: try: base = base64.b64decode(base).decode() except: try: base = base64.b16decode(base).decode() except: print("解码完毕qwq!") file2.write(base) break
结果为:afctf{U_5h0u1d_Us3_T00l5}
EzRSA
加密代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from gmpy2 import lcm , powmod from Crypto.Util.number import getPrime
p = getPrime(1024) q = getPrime(1024) n = p * q gift = lcm(p - 1 , q - 1) e = 54722 flag = b'NPUCTF{******************}' m = int.from_bytes(flag , 'big') c = powmod(m , e , n) print('n: ' , n) print('gift: ' , gift) print('c: ' , c)
n = 17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121 gift = 2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104 c = 3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319 e = 54722
print(n//gift)
得到结果 \(gcd(p-1,q-1)\approx 8\) 另一个奇怪的地方就是 \(e = 54722\) 与 \(\varphi\) 不互质,与原来的 RSA 加密算法不同 我们令 \(e'=e//2\) 因为\(e'\)与\(\varphi\)互质 所以有 \(ed \equiv 1 \space mod \space \varphi\) 故有 \(d'=2*d\space s.t.\space e'd' = ed \equiv 1 \space mod \space n\) 而 \(m' \equiv c^{d'} \space mod \space n = c^{2d} \space mod \space n\) 所以 \(m \equiv \sqrt{m'} \space mod \space n\) 完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from Crypto.Util.number import * from gmpy2 import gcd, iroot
n = 17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121 gift = 2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104 c = 3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319 e = 54722
phi = gift * (n//gift) e = e//2 d = inverse(e, phi) m = pow(c, d, n) m = iroot(m, 2)[0] print(long_to_bytes(m))