sekur julius
3 minutes to read
We are given the Python source code to encrypt the flag:
from random import choices
import os
def julius_encrypt(msg, shift):
ct = ''
for p in msg:
if p == ' ':
ct += '0'
elif not ord('A') <= ord(p) <= ord('Z'):
ct += p
else:
o = ord(p) - 65
ct += chr(65 + (o + shift) % 26)
return ct
def encrypt(msg, key):
for shift in key:
msg = julius_encrypt(msg, shift)
return msg
msg = open('secret.txt').read().upper()
secure_key = os.urandom(1337)
with open('output.txt', 'w') as f:
f.write(encrypt(msg, secure_key))
And this is the output of the script:
JRYPBZR0GB0UNPXGUROBB0GJBGUBHFNAQGJRAGLSBHE!0GUVF0VF0N0CEBBS0BS0PBAPRCG0GB0CEBIR0LBH0GUNG0GUR0PNRFNE0PVCURE0VF0VAFRPHER0AB0ZNGGRE0UBJ0ZNAL0GVZRF0LBH0NCCYL0VG.0GUR0FRPHEVGL0BS0N0GUBHFNAQ0QVFGVAPG0FUVSGF0VF0RIRAGHNYYL0GUR0FNZR0NF0GUNG0BS0N0FVATYR0FUVSG.0RABHTU0ZHZOYVAT,0GNXR0LBHE0SYNT0NAQ0RAWBL0GUR0ERFG0BS0GUR0PBAGRFG.0ZNXR0FHER0LBH0JENC0GUR0SBYYBJVAT0GRKG0JVGU0GUR0UGO0SYNT0SBEZNG0GURRSSRPGVIRXRLFCNPRBSPNRFNEQRCRAQFBAGURFVMRBSGURNYCUNORG.
Source code analysis
A quick look at julius_encrypt
tells us that it is using a Caesar cipher (the name of the challenge is kind of a hint):
def julius_encrypt(msg, shift):
ct = ''
for p in msg:
if p == ' ':
ct += '0'
elif not ord('A') <= ord(p) <= ord('Z'):
ct += p
else:
o = ord(p) - 65
ct += chr(65 + (o + shift) % 26)
return ct
This means that the encryption is just a substitution cipher where each plaintext letter is shifted by a fix number to get the ciphertext letter:
$ python3 -q
>>> def julius_encrypt(msg, shift):
... ct = ''
... for p in msg:
... if p == ' ':
... ct += '0'
... elif not ord('A') <= ord(p) <= ord('Z'):
... ct += p
... else:
... o = ord(p) - 65
... ct += chr(65 + (o + shift) % 26)
... return ct
...
>>> julius_encrypt('ASDF', 3)
'DVGI'
However, there is an encrypt
function that wraps the use of julius_encrypt
:
def encrypt(msg, key):
for shift in key:
msg = julius_encrypt(msg, shift)
return msg
It implements an iterated Caesar cipher… Is this more secure?
Solution
Well, since Caesar cipher is just a shift, it happens that a shift of 26 leaves the plaintext untouched:
>>> julius_encrypt('ASDF', 26)
'ASDF'
As a result, no matter how many times we apply julius_encrypt
, because the shift can be mapped to a value ranging from 0 to 25.
Therefore, we can simply brute force this shift and find the correct plaintext:
>>> ciphertext = 'JRYPBZR0GB0UNPXGUROBB0GJBGUBHFNAQGJRAGLSBHE!0GUVF0VF0N0CEBBS0BS0PBAPRCG0GB0CEBIR0LBH0GUNG0GUR0PNRFNE0PVCURE0VF0VAFRPHER0AB0ZNGGRE0UBJ0ZNAL0GVZRF0LBH0NCCYL0VG.0GUR0FRPHEVGL0BS0N0GUBHFNAQ0QVFGVAPG0\
FUVSGF0VF0RIRAGHNYYL0GUR0FNZR0NF0GUNG0BS0N0FVATYR0FUVSG.0RABHTU0ZHZOYVAT,0GNXR0LBHE0SYNT0NAQ0RAWBL0GUR0ERFG0BS0GUR0PBAGRFG.0ZNXR0FHER0LBH0JENC0GUR0SBYYBJVAT0GRKG0JVGU0GUR0UGO0SYNT0SBEZNG0GURRSSRPGVIRXRLFCNPRBSPNRF\
NEQRCRAQFBAGURFVMRBSGURNYCUNORG.'
>>>
>>> for shift in range(26):
... print(shift, julius_encrypt(ciphertext, shift))
...
0 JRYPBZR0GB0UNPXGUROBB0GJBGUBHFNAQGJRAGLSBHE!0GUVF0VF0N0CEBBS0BS0PBAPRCG0GB0CEBIR0LBH0GUNG0GUR0PNRFNE0PVCURE0VF0VAFRPHER0AB0ZNGGRE0UBJ0ZNAL0GVZRF0LBH0NCCYL0VG.0GUR0FRPHEVGL0BS0N0GUBHFNAQ0QVFGVAPG0FUVSGF0VF0RIRAGHNYYL0GUR0FNZR0NF0GUNG0BS0N0FVATYR0FUVSG.0RABHTU0ZHZOYVAT,0GNXR0LBHE0SYNT0NAQ0RAWBL0GUR0ERFG0BS0GUR0PBAGRFG.0ZNXR0FHER0LBH0JENC0GUR0SBYYBJVAT0GRKG0JVGU0GUR0UGO0SYNT0SBEZNG0GURRSSRPGVIRXRLFCNPRBSPNRFNEQRCRAQFBAGURFVMRBSGURNYCUNORG.
1 KSZQCAS0HC0VOQYHVSPCC0HKCHVCIGOBRHKSBHMTCIF!0HVWG0WG0O0DFCCT0CT0QCBQSDH0HC0DFCJS0MCI0HVOH0HVS0QOSGOF0QWDVSF0WG0WBGSQIFS0BC0AOHHSF0VCK0AOBM0HWASG0MCI0ODDZM0WH.0HVS0GSQIFWHM0CT0O0HVCIGOBR0RWGHWBQH0GVWTHG0WG0SJSBHIOZZM0HVS0GOAS0OG0HVOH0CT0O0GWBUZS0GVWTH.0SBCIUV0AIAPZWBU,0HOYS0MCIF0TZOU0OBR0SBXCM0HVS0FSGH0CT0HVS0QCBHSGH.0AOYS0GIFS0MCI0KFOD0HVS0TCZZCKWBU0HSLH0KWHV0HVS0VHP0TZOU0TCFAOH0HVSSTTSQHWJSYSMGDOQSCTQOSGOFRSDSBRGCBHVSGWNSCTHVSOZDVOPSH.
2 LTARDBT0ID0WPRZIWTQDD0ILDIWDJHPCSILTCINUDJG!0IWXH0XH0P0EGDDU0DU0RDCRTEI0ID0EGDKT0NDJ0IWPI0IWT0RPTHPG0RXEWTG0XH0XCHTRJGT0CD0BPIITG0WDL0BPCN0IXBTH0NDJ0PEEAN0XI.0IWT0HTRJGXIN0DU0P0IWDJHPCS0SXHIXCRI0HWXUIH0XH0TKTCIJPAAN0IWT0HPBT0PH0IWPI0DU0P0HXCVAT0HWXUI.0TCDJVW0BJBQAXCV,0IPZT0NDJG0UAPV0PCS0TCYDN0IWT0GTHI0DU0IWT0RDCITHI.0BPZT0HJGT0NDJ0LGPE0IWT0UDAADLXCV0ITMI0LXIW0IWT0WIQ0UAPV0UDGBPI0IWTTUUTRIXKTZTNHEPRTDURPTHPGSTETCSHDCIWTHXOTDUIWTPAEWPQTI.
3 MUBSECU0JE0XQSAJXUREE0JMEJXEKIQDTJMUDJOVEKH!0JXYI0YI0Q0FHEEV0EV0SEDSUFJ0JE0FHELU0OEK0JXQJ0JXU0SQUIQH0SYFXUH0YI0YDIUSKHU0DE0CQJJUH0XEM0CQDO0JYCUI0OEK0QFFBO0YJ.0JXU0IUSKHYJO0EV0Q0JXEKIQDT0TYIJYDSJ0IXYVJI0YI0ULUDJKQBBO0JXU0IQCU0QI0JXQJ0EV0Q0IYDWBU0IXYVJ.0UDEKWX0CKCRBYDW,0JQAU0OEKH0VBQW0QDT0UDZEO0JXU0HUIJ0EV0JXU0SEDJUIJ.0CQAU0IKHU0OEK0MHQF0JXU0VEBBEMYDW0JUNJ0MYJX0JXU0XJR0VBQW0VEHCQJ0JXUUVVUSJYLUAUOIFQSUEVSQUIQHTUFUDTIEDJXUIYPUEVJXUQBFXQRUJ.
4 NVCTFDV0KF0YRTBKYVSFF0KNFKYFLJREUKNVEKPWFLI!0KYZJ0ZJ0R0GIFFW0FW0TFETVGK0KF0GIFMV0PFL0KYRK0KYV0TRVJRI0TZGYVI0ZJ0ZEJVTLIV0EF0DRKKVI0YFN0DREP0KZDVJ0PFL0RGGCP0ZK.0KYV0JVTLIZKP0FW0R0KYFLJREU0UZJKZETK0JYZWKJ0ZJ0VMVEKLRCCP0KYV0JRDV0RJ0KYRK0FW0R0JZEXCV0JYZWK.0VEFLXY0DLDSCZEX,0KRBV0PFLI0WCRX0REU0VEAFP0KYV0IVJK0FW0KYV0TFEKVJK.0DRBV0JLIV0PFL0NIRG0KYV0WFCCFNZEX0KVOK0NZKY0KYV0YKS0WCRX0WFIDRK0KYVVWWVTKZMVBVPJGRTVFWTRVJRIUVGVEUJFEKYVJZQVFWKYVRCGYRSVK.
5 OWDUGEW0LG0ZSUCLZWTGG0LOGLZGMKSFVLOWFLQXGMJ!0LZAK0AK0S0HJGGX0GX0UGFUWHL0LG0HJGNW0QGM0LZSL0LZW0USWKSJ0UAHZWJ0AK0AFKWUMJW0FG0ESLLWJ0ZGO0ESFQ0LAEWK0QGM0SHHDQ0AL.0LZW0KWUMJALQ0GX0S0LZGMKSFV0VAKLAFUL0KZAXLK0AK0WNWFLMSDDQ0LZW0KSEW0SK0LZSL0GX0S0KAFYDW0KZAXL.0WFGMYZ0EMETDAFY,0LSCW0QGMJ0XDSY0SFV0WFBGQ0LZW0JWKL0GX0LZW0UGFLWKL.0ESCW0KMJW0QGM0OJSH0LZW0XGDDGOAFY0LWPL0OALZ0LZW0ZLT0XDSY0XGJESL0LZWWXXWULANWCWQKHSUWGXUSWKSJVWHWFVKGFLZWKARWGXLZWSDHZSTWL.
6 PXEVHFX0MH0ATVDMAXUHH0MPHMAHNLTGWMPXGMRYHNK!0MABL0BL0T0IKHHY0HY0VHGVXIM0MH0IKHOX0RHN0MATM0MAX0VTXLTK0VBIAXK0BL0BGLXVNKX0GH0FTMMXK0AHP0FTGR0MBFXL0RHN0TIIER0BM.0MAX0LXVNKBMR0HY0T0MAHNLTGW0WBLMBGVM0LABYML0BL0XOXGMNTEER0MAX0LTFX0TL0MATM0HY0T0LBGZEX0LABYM.0XGHNZA0FNFUEBGZ,0MTDX0RHNK0YETZ0TGW0XGCHR0MAX0KXLM0HY0MAX0VHGMXLM.0FTDX0LNKX0RHN0PKTI0MAX0YHEEHPBGZ0MXQM0PBMA0MAX0AMU0YETZ0YHKFTM0MAXXYYXVMBOXDXRLITVXHYVTXLTKWXIXGWLHGMAXLBSXHYMAXTEIATUXM.
7 QYFWIGY0NI0BUWENBYVII0NQINBIOMUHXNQYHNSZIOL!0NBCM0CM0U0JLIIZ0IZ0WIHWYJN0NI0JLIPY0SIO0NBUN0NBY0WUYMUL0WCJBYL0CM0CHMYWOLY0HI0GUNNYL0BIQ0GUHS0NCGYM0SIO0UJJFS0CN.0NBY0MYWOLCNS0IZ0U0NBIOMUHX0XCMNCHWN0MBCZNM0CM0YPYHNOUFFS0NBY0MUGY0UM0NBUN0IZ0U0MCHAFY0MBCZN.0YHIOAB0GOGVFCHA,0NUEY0SIOL0ZFUA0UHX0YHDIS0NBY0LYMN0IZ0NBY0WIHNYMN.0GUEY0MOLY0SIO0QLUJ0NBY0ZIFFIQCHA0NYRN0QCNB0NBY0BNV0ZFUA0ZILGUN0NBYYZZYWNCPYEYSMJUWYIZWUYMULXYJYHXMIHNBYMCTYIZNBYUFJBUVYN.
8 RZGXJHZ0OJ0CVXFOCZWJJ0ORJOCJPNVIYORZIOTAJPM!0OCDN0DN0V0KMJJA0JA0XJIXZKO0OJ0KMJQZ0TJP0OCVO0OCZ0XVZNVM0XDKCZM0DN0DINZXPMZ0IJ0HVOOZM0CJR0HVIT0ODHZN0TJP0VKKGT0DO.0OCZ0NZXPMDOT0JA0V0OCJPNVIY0YDNODIXO0NCDAON0DN0ZQZIOPVGGT0OCZ0NVHZ0VN0OCVO0JA0V0NDIBGZ0NCDAO.0ZIJPBC0HPHWGDIB,0OVFZ0TJPM0AGVB0VIY0ZIEJT0OCZ0MZNO0JA0OCZ0XJIOZNO.0HVFZ0NPMZ0TJP0RMVK0OCZ0AJGGJRDIB0OZSO0RDOC0OCZ0COW0AGVB0AJMHVO0OCZZAAZXODQZFZTNKVXZJAXVZNVMYZKZIYNJIOCZNDUZJAOCZVGKCVWZO.
9 SAHYKIA0PK0DWYGPDAXKK0PSKPDKQOWJZPSAJPUBKQN!0PDEO0EO0W0LNKKB0KB0YKJYALP0PK0LNKRA0UKQ0PDWP0PDA0YWAOWN0YELDAN0EO0EJOAYQNA0JK0IWPPAN0DKS0IWJU0PEIAO0UKQ0WLLHU0EP.0PDA0OAYQNEPU0KB0W0PDKQOWJZ0ZEOPEJYP0ODEBPO0EO0ARAJPQWHHU0PDA0OWIA0WO0PDWP0KB0W0OEJCHA0ODEBP.0AJKQCD0IQIXHEJC,0PWGA0UKQN0BHWC0WJZ0AJFKU0PDA0NAOP0KB0PDA0YKJPAOP.0IWGA0OQNA0UKQ0SNWL0PDA0BKHHKSEJC0PATP0SEPD0PDA0DPX0BHWC0BKNIWP0PDAABBAYPERAGAUOLWYAKBYWAOWNZALAJZOKJPDAOEVAKBPDAWHLDWXAP.
10 TBIZLJB0QL0EXZHQEBYLL0QTLQELRPXKAQTBKQVCLRO!0QEFP0FP0X0MOLLC0LC0ZLKZBMQ0QL0MOLSB0VLR0QEXQ0QEB0ZXBPXO0ZFMEBO0FP0FKPBZROB0KL0JXQQBO0ELT0JXKV0QFJBP0VLR0XMMIV0FQ.0QEB0PBZROFQV0LC0X0QELRPXKA0AFPQFKZQ0PEFCQP0FP0BSBKQRXIIV0QEB0PXJB0XP0QEXQ0LC0X0PFKDIB0PEFCQ.0BKLRDE0JRJYIFKD,0QXHB0VLRO0CIXD0XKA0BKGLV0QEB0OBPQ0LC0QEB0ZLKQBPQ.0JXHB0PROB0VLR0TOXM0QEB0CLIILTFKD0QBUQ0TFQE0QEB0EQY0CIXD0CLOJXQ0QEBBCCBZQFSBHBVPMXZBLCZXBPXOABMBKAPLKQEBPFWBLCQEBXIMEXYBQ.
11 UCJAMKC0RM0FYAIRFCZMM0RUMRFMSQYLBRUCLRWDMSP!0RFGQ0GQ0Y0NPMMD0MD0AMLACNR0RM0NPMTC0WMS0RFYR0RFC0AYCQYP0AGNFCP0GQ0GLQCASPC0LM0KYRRCP0FMU0KYLW0RGKCQ0WMS0YNNJW0GR.0RFC0QCASPGRW0MD0Y0RFMSQYLB0BGQRGLAR0QFGDRQ0GQ0CTCLRSYJJW0RFC0QYKC0YQ0RFYR0MD0Y0QGLEJC0QFGDR.0CLMSEF0KSKZJGLE,0RYIC0WMSP0DJYE0YLB0CLHMW0RFC0PCQR0MD0RFC0AMLRCQR.0KYIC0QSPC0WMS0UPYN0RFC0DMJJMUGLE0RCVR0UGRF0RFC0FRZ0DJYE0DMPKYR0RFCCDDCARGTCICWQNYACMDAYCQYPBCNCLBQMLRFCQGXCMDRFCYJNFYZCR.
12 VDKBNLD0SN0GZBJSGDANN0SVNSGNTRZMCSVDMSXENTQ!0SGHR0HR0Z0OQNNE0NE0BNMBDOS0SN0OQNUD0XNT0SGZS0SGD0BZDRZQ0BHOGDQ0HR0HMRDBTQD0MN0LZSSDQ0GNV0LZMX0SHLDR0XNT0ZOOKX0HS.0SGD0RDBTQHSX0NE0Z0SGNTRZMC0CHRSHMBS0RGHESR0HR0DUDMSTZKKX0SGD0RZLD0ZR0SGZS0NE0Z0RHMFKD0RGHES.0DMNTFG0LTLAKHMF,0SZJD0XNTQ0EKZF0ZMC0DMINX0SGD0QDRS0NE0SGD0BNMSDRS.0LZJD0RTQD0XNT0VQZO0SGD0ENKKNVHMF0SDWS0VHSG0SGD0GSA0EKZF0ENQLZS0SGDDEEDBSHUDJDXROZBDNEBZDRZQCDODMCRNMSGDRHYDNESGDZKOGZADS.
13 WELCOME0TO0HACKTHEBOO0TWOTHOUSANDTWENTYFOUR!0THIS0IS0A0PROOF0OF0CONCEPT0TO0PROVE0YOU0THAT0THE0CAESAR0CIPHER0IS0INSECURE0NO0MATTER0HOW0MANY0TIMES0YOU0APPLY0IT.0THE0SECURITY0OF0A0THOUSAND0DISTINCT0SHIFTS0IS0EVENTUALLY0THE0SAME0AS0THAT0OF0A0SINGLE0SHIFT.0ENOUGH0MUMBLING,0TAKE0YOUR0FLAG0AND0ENJOY0THE0REST0OF0THE0CONTEST.0MAKE0SURE0YOU0WRAP0THE0FOLLOWING0TEXT0WITH0THE0HTB0FLAG0FORMAT0THEEFFECTIVEKEYSPACEOFCAESARDEPENDSONTHESIZEOFTHEALPHABET.
14 XFMDPNF0UP0IBDLUIFCPP0UXPUIPVTBOEUXFOUZGPVS!0UIJT0JT0B0QSPPG0PG0DPODFQU0UP0QSPWF0ZPV0UIBU0UIF0DBFTBS0DJQIFS0JT0JOTFDVSF0OP0NBUUFS0IPX0NBOZ0UJNFT0ZPV0BQQMZ0JU.0UIF0TFDVSJUZ0PG0B0UIPVTBOE0EJTUJODU0TIJGUT0JT0FWFOUVBMMZ0UIF0TBNF0BT0UIBU0PG0B0TJOHMF0TIJGU.0FOPVHI0NVNCMJOH,0UBLF0ZPVS0GMBH0BOE0FOKPZ0UIF0SFTU0PG0UIF0DPOUFTU.0NBLF0TVSF0ZPV0XSBQ0UIF0GPMMPXJOH0UFYU0XJUI0UIF0IUC0GMBH0GPSNBU0UIFFGGFDUJWFLFZTQBDFPGDBFTBSEFQFOETPOUIFTJAFPGUIFBMQIBCFU.
15 YGNEQOG0VQ0JCEMVJGDQQ0VYQVJQWUCPFVYGPVAHQWT!0VJKU0KU0C0RTQQH0QH0EQPEGRV0VQ0RTQXG0AQW0VJCV0VJG0ECGUCT0EKRJGT0KU0KPUGEWTG0PQ0OCVVGT0JQY0OCPA0VKOGU0AQW0CRRNA0KV.0VJG0UGEWTKVA0QH0C0VJQWUCPF0FKUVKPEV0UJKHVU0KU0GXGPVWCNNA0VJG0UCOG0CU0VJCV0QH0C0UKPING0UJKHV.0GPQWIJ0OWODNKPI,0VCMG0AQWT0HNCI0CPF0GPLQA0VJG0TGUV0QH0VJG0EQPVGUV.0OCMG0UWTG0AQW0YTCR0VJG0HQNNQYKPI0VGZV0YKVJ0VJG0JVD0HNCI0HQTOCV0VJGGHHGEVKXGMGAURCEGQHECGUCTFGRGPFUQPVJGUKBGQHVJGCNRJCDGV.
16 ZHOFRPH0WR0KDFNWKHERR0WZRWKRXVDQGWZHQWBIRXU!0WKLV0LV0D0SURRI0RI0FRQFHSW0WR0SURYH0BRX0WKDW0WKH0FDHVDU0FLSKHU0LV0LQVHFXUH0QR0PDWWHU0KRZ0PDQB0WLPHV0BRX0DSSOB0LW.0WKH0VHFXULWB0RI0D0WKRXVDQG0GLVWLQFW0VKLIWV0LV0HYHQWXDOOB0WKH0VDPH0DV0WKDW0RI0D0VLQJOH0VKLIW.0HQRXJK0PXPEOLQJ,0WDNH0BRXU0IODJ0DQG0HQMRB0WKH0UHVW0RI0WKH0FRQWHVW.0PDNH0VXUH0BRX0ZUDS0WKH0IROORZLQJ0WHAW0ZLWK0WKH0KWE0IODJ0IRUPDW0WKHHIIHFWLYHNHBVSDFHRIFDHVDUGHSHQGVRQWKHVLCHRIWKHDOSKDEHW.
17 AIPGSQI0XS0LEGOXLIFSS0XASXLSYWERHXAIRXCJSYV!0XLMW0MW0E0TVSSJ0SJ0GSRGITX0XS0TVSZI0CSY0XLEX0XLI0GEIWEV0GMTLIV0MW0MRWIGYVI0RS0QEXXIV0LSA0QERC0XMQIW0CSY0ETTPC0MX.0XLI0WIGYVMXC0SJ0E0XLSYWERH0HMWXMRGX0WLMJXW0MW0IZIRXYEPPC0XLI0WEQI0EW0XLEX0SJ0E0WMRKPI0WLMJX.0IRSYKL0QYQFPMRK,0XEOI0CSYV0JPEK0ERH0IRNSC0XLI0VIWX0SJ0XLI0GSRXIWX.0QEOI0WYVI0CSY0AVET0XLI0JSPPSAMRK0XIBX0AMXL0XLI0LXF0JPEK0JSVQEX0XLIIJJIGXMZIOICWTEGISJGEIWEVHITIRHWSRXLIWMDISJXLIEPTLEFIX.
18 BJQHTRJ0YT0MFHPYMJGTT0YBTYMTZXFSIYBJSYDKTZW!0YMNX0NX0F0UWTTK0TK0HTSHJUY0YT0UWTAJ0DTZ0YMFY0YMJ0HFJXFW0HNUMJW0NX0NSXJHZWJ0ST0RFYYJW0MTB0RFSD0YNRJX0DTZ0FUUQD0NY.0YMJ0XJHZWNYD0TK0F0YMTZXFSI0INXYNSHY0XMNKYX0NX0JAJSYZFQQD0YMJ0XFRJ0FX0YMFY0TK0F0XNSLQJ0XMNKY.0JSTZLM0RZRGQNSL,0YFPJ0DTZW0KQFL0FSI0JSOTD0YMJ0WJXY0TK0YMJ0HTSYJXY.0RFPJ0XZWJ0DTZ0BWFU0YMJ0KTQQTBNSL0YJCY0BNYM0YMJ0MYG0KQFL0KTWRFY0YMJJKKJHYNAJPJDXUFHJTKHFJXFWIJUJSIXTSYMJXNEJTKYMJFQUMFGJY.
19 CKRIUSK0ZU0NGIQZNKHUU0ZCUZNUAYGTJZCKTZELUAX!0ZNOY0OY0G0VXUUL0UL0IUTIKVZ0ZU0VXUBK0EUA0ZNGZ0ZNK0IGKYGX0IOVNKX0OY0OTYKIAXK0TU0SGZZKX0NUC0SGTE0ZOSKY0EUA0GVVRE0OZ.0ZNK0YKIAXOZE0UL0G0ZNUAYGTJ0JOYZOTIZ0YNOLZY0OY0KBKTZAGRRE0ZNK0YGSK0GY0ZNGZ0UL0G0YOTMRK0YNOLZ.0KTUAMN0SASHROTM,0ZGQK0EUAX0LRGM0GTJ0KTPUE0ZNK0XKYZ0UL0ZNK0IUTZKYZ.0SGQK0YAXK0EUA0CXGV0ZNK0LURRUCOTM0ZKDZ0COZN0ZNK0NZH0LRGM0LUXSGZ0ZNKKLLKIZOBKQKEYVGIKULIGKYGXJKVKTJYUTZNKYOFKULZNKGRVNGHKZ.
20 DLSJVTL0AV0OHJRAOLIVV0ADVAOVBZHUKADLUAFMVBY!0AOPZ0PZ0H0WYVVM0VM0JVUJLWA0AV0WYVCL0FVB0AOHA0AOL0JHLZHY0JPWOLY0PZ0PUZLJBYL0UV0THAALY0OVD0THUF0APTLZ0FVB0HWWSF0PA.0AOL0ZLJBYPAF0VM0H0AOVBZHUK0KPZAPUJA0ZOPMAZ0PZ0LCLUABHSSF0AOL0ZHTL0HZ0AOHA0VM0H0ZPUNSL0ZOPMA.0LUVBNO0TBTISPUN,0AHRL0FVBY0MSHN0HUK0LUQVF0AOL0YLZA0VM0AOL0JVUALZA.0THRL0ZBYL0FVB0DYHW0AOL0MVSSVDPUN0ALEA0DPAO0AOL0OAI0MSHN0MVYTHA0AOLLMMLJAPCLRLFZWHJLVMJHLZHYKLWLUKZVUAOLZPGLVMAOLHSWOHILA.
21 EMTKWUM0BW0PIKSBPMJWW0BEWBPWCAIVLBEMVBGNWCZ!0BPQA0QA0I0XZWWN0WN0KWVKMXB0BW0XZWDM0GWC0BPIB0BPM0KIMAIZ0KQXPMZ0QA0QVAMKCZM0VW0UIBBMZ0PWE0UIVG0BQUMA0GWC0IXXTG0QB.0BPM0AMKCZQBG0WN0I0BPWCAIVL0LQABQVKB0APQNBA0QA0MDMVBCITTG0BPM0AIUM0IA0BPIB0WN0I0AQVOTM0APQNB.0MVWCOP0UCUJTQVO,0BISM0GWCZ0NTIO0IVL0MVRWG0BPM0ZMAB0WN0BPM0KWVBMAB.0UISM0ACZM0GWC0EZIX0BPM0NWTTWEQVO0BMFB0EQBP0BPM0PBJ0NTIO0NWZUIB0BPMMNNMKBQDMSMGAXIKMWNKIMAIZLMXMVLAWVBPMAQHMWNBPMITXPIJMB.
22 FNULXVN0CX0QJLTCQNKXX0CFXCQXDBJWMCFNWCHOXDA!0CQRB0RB0J0YAXXO0XO0LXWLNYC0CX0YAXEN0HXD0CQJC0CQN0LJNBJA0LRYQNA0RB0RWBNLDAN0WX0VJCCNA0QXF0VJWH0CRVNB0HXD0JYYUH0RC.0CQN0BNLDARCH0XO0J0CQXDBJWM0MRBCRWLC0BQROCB0RB0NENWCDJUUH0CQN0BJVN0JB0CQJC0XO0J0BRWPUN0BQROC.0NWXDPQ0VDVKURWP,0CJTN0HXDA0OUJP0JWM0NWSXH0CQN0ANBC0XO0CQN0LXWCNBC.0VJTN0BDAN0HXD0FAJY0CQN0OXUUXFRWP0CNGC0FRCQ0CQN0QCK0OUJP0OXAVJC0CQNNOONLCRENTNHBYJLNXOLJNBJAMNYNWMBXWCQNBRINXOCQNJUYQJKNC.
23 GOVMYWO0DY0RKMUDROLYY0DGYDRYECKXNDGOXDIPYEB!0DRSC0SC0K0ZBYYP0YP0MYXMOZD0DY0ZBYFO0IYE0DRKD0DRO0MKOCKB0MSZROB0SC0SXCOMEBO0XY0WKDDOB0RYG0WKXI0DSWOC0IYE0KZZVI0SD.0DRO0COMEBSDI0YP0K0DRYECKXN0NSCDSXMD0CRSPDC0SC0OFOXDEKVVI0DRO0CKWO0KC0DRKD0YP0K0CSXQVO0CRSPD.0OXYEQR0WEWLVSXQ,0DKUO0IYEB0PVKQ0KXN0OXTYI0DRO0BOCD0YP0DRO0MYXDOCD.0WKUO0CEBO0IYE0GBKZ0DRO0PYVVYGSXQ0DOHD0GSDR0DRO0RDL0PVKQ0PYBWKD0DROOPPOMDSFOUOICZKMOYPMKOCKBNOZOXNCYXDROCSJOYPDROKVZRKLOD.
24 HPWNZXP0EZ0SLNVESPMZZ0EHZESZFDLYOEHPYEJQZFC!0ESTD0TD0L0ACZZQ0ZQ0NZYNPAE0EZ0ACZGP0JZF0ESLE0ESP0NLPDLC0NTASPC0TD0TYDPNFCP0YZ0XLEEPC0SZH0XLYJ0ETXPD0JZF0LAAWJ0TE.0ESP0DPNFCTEJ0ZQ0L0ESZFDLYO0OTDETYNE0DSTQED0TD0PGPYEFLWWJ0ESP0DLXP0LD0ESLE0ZQ0L0DTYRWP0DSTQE.0PYZFRS0XFXMWTYR,0ELVP0JZFC0QWLR0LYO0PYUZJ0ESP0CPDE0ZQ0ESP0NZYEPDE.0XLVP0DFCP0JZF0HCLA0ESP0QZWWZHTYR0EPIE0HTES0ESP0SEM0QWLR0QZCXLE0ESPPQQPNETGPVPJDALNPZQNLPDLCOPAPYODZYESPDTKPZQESPLWASLMPE.
25 IQXOAYQ0FA0TMOWFTQNAA0FIAFTAGEMZPFIQZFKRAGD!0FTUE0UE0M0BDAAR0AR0OAZOQBF0FA0BDAHQ0KAG0FTMF0FTQ0OMQEMD0OUBTQD0UE0UZEQOGDQ0ZA0YMFFQD0TAI0YMZK0FUYQE0KAG0MBBXK0UF.0FTQ0EQOGDUFK0AR0M0FTAGEMZP0PUEFUZOF0ETURFE0UE0QHQZFGMXXK0FTQ0EMYQ0ME0FTMF0AR0M0EUZSXQ0ETURF.0QZAGST0YGYNXUZS,0FMWQ0KAGD0RXMS0MZP0QZVAK0FTQ0DQEF0AR0FTQ0OAZFQEF.0YMWQ0EGDQ0KAG0IDMB0FTQ0RAXXAIUZS0FQJF0IUFT0FTQ0TFN0RXMS0RADYMF0FTQQRRQOFUHQWQKEBMOQAROMQEMDPQBQZPEAZFTQEULQARFTQMXBTMNQF.
It looks like 13 is the correct shift. We can replace 0
s by spaces to enhance readability:
>>> print(julius_encrypt(ciphertext, 13).replace('0', ' '))
WELCOME TO HACKTHEBOO TWOTHOUSANDTWENTYFOUR! THIS IS A PROOF OF CONCEPT TO PROVE YOU THAT THE CAESAR CIPHER IS INSECURE NO MATTER HOW MANY TIMES YOU APPLY IT. THE SECURITY OF A THOUSAND DISTINCT SHIFTS IS EVENTUALLY THE SAME AS THAT OF A SINGLE SHIFT. ENOUGH MUMBLING, TAKE YOUR FLAG AND ENJOY THE REST OF THE CONTEST. MAKE SURE YOU WRAP THE FOLLOWING TEXT WITH THE HTB FLAG FORMAT THEEFFECTIVEKEYSPACEOFCAESARDEPENDSONTHESIZEOFTHEALPHABET.
Flag
So, the flag is:
HTB{THEEFFECTIVEKEYSPACEOFCAESARDEPENDSONTHESIZEOFTHEALPHABET}