Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ii:labs:02:tasks:03 [2021/11/06 23:06]
radu.mantu [03. [40p] Solving a substitution cypher]
ii:labs:02:tasks:03 [2024/11/01 10:59] (current)
radu.mantu [03. [50p] Solving a substitution cipher]
Line 1: Line 1:
-==== 03. [40p] Solving a substitution cipher ====+==== 03. [50p] Solving a substitution cipher ====
  
-todo+[[https://​ocw.cs.pub.ro/​courses/​_media/​ii/​labs/​02/​tasks/​crack_ciphertext.png|{{ :​ii:​labs:​02:​tasks:​crack_ciphertext.png?​700 |}}]] 
 + 
 +Time to get your hands dirty! Below, you have a [[https://​en.wikipedia.org/​wiki/​Ciphertext|ciphertext]]. Specifically,​ this output is the result of a [[https://​en.wikipedia.org/​wiki/​Substitution_cipher|substitution cipher]], meaning that every letter in the English alphabet has been assigned a random, unique correspondent. As you may have noticed, digits and special characters remain unchanged. 
 + 
 +<​spoiler>​ 
 +<​code>​ 
 +HXY KIRNUJ SPHFO LTPHPSIOUJ KTLZ OFU HXSQLRBUT QVLO LK 1605, I KIPVUB 
 +WLSJQPTIWY GY I HTLXQ LK QTLEPSWPIV USHVPJF WIOFLVPWJ OL IJJIJJPSIOU OFU 
 +QTLOUJOISO NPSH MIZUJ P LK USHVISB ISB EP LK JWLOVISB ISB TUQVIWU FPZ RPOF 
 +I WIOFLVPW FUIB LK JOIOU. PS OFU PZZUBPIOU IKOUTZIOF LK OFU 5 SLEUZGUT ITTUJO 
 +LK HXY KIRNUJ, WIXHFO HXITBPSH I WIWFU LK UDQVLJPEUJ QVIWUB GUSUIOF OFU FLXJU 
 +LK VLTBJ, MIZUJ'​J WLXSWPV IVVLRUB OFU QXGVPW OL WUVUGTIOU OFU NPSH'J JXTEPEIV 
 +RPOF GLSKPTUJ, JL VLSH IJ OFUY RUTU "​RPOFLXO ISY BISHUT LT BPJLTBUT"​. OFPJ ZIBU 
 +1605 OFU KPTJO YUIT OFU QVLO'J KIPVXTU RIJ WUVUGTIOUB. 
 + 
 +OFU KLVVLRPSH MISXITY, BIYJ GUKLTU OFU JXTEPEPSH WLSJQPTIOLTJ RUTU UDUWXOUB, 
 +QITVPIZUSO, IO OFU PSPOPIOPLS LK MIZUJ P, QIJJUB OFU LGJUTEISWU LK 5OF SLEUZGUT 
 +IWO, WLZZLSVY NSLRS IJ OFU "​OFISNJHPEPSH IWO". PO RIJ QTLQLJUB GY I QXTPOIS 
 +ZUZGUT LK QITVPIZUSO, UBRITB ZLSOIHX, RFL JXHHUJOUB OFIO OFU NPSH'J IQQITUSO 
 +BUVPEUTISWU GY BPEPSU PSOUTEUSOPLS BUJUTEUB JLZU ZUIJXTU LK LKKPWPIV 
 +TUWLHSPOPLS,​ ISB NUQO 5 SLEUZGUT KTUU IJ I BIY LK OFISNJHPEPSH RFPVU PS OFULTY 
 +ZINPSH IOOUSBISWU IO WFXTWF ZISBIOLTY.[4] I SUR KLTZ LK JUTEPWU RIJ IVJL IBBUB 
 +OL OFU WFXTWF LK USHVISB'​J GLLN LK WLZZLS QTIYUT, KLT XJU LS OFIO BIOU. VPOOVU 
 +PJ NSLRS IGLXO OFU UITVPUJO WUVUGTIOPLSJ. PS JUOOVUZUSOJ JXWF IJ WITVPJVU, 
 +SLTRPWF, ISB SLOOPSHFIZ, WLTQLTIOPLSJ (OLRS HLEUTSZUSOJ) QTLEPBUB ZXJPW ISB 
 +ITOPVVUTY JIVXOUJ. WISOUTGXTY WUVUGTIOUB 5 SLEUZGUT 1607 RPOF 106 QLXSBJ (48 NH) 
 +LK HXSQLRBUT ISB 14 QLXSBJ (6.4 NH) LK ZIOWF, ISB OFTUU YUITJ VIOUT KLLB ISB 
 +BTPSN RIJ QTLEPBUB KLT VLWIV BPHSPOITPUJ,​ IJ RUVV IJ ZXJPW, UDQVLJPLSJ, ISB I 
 +QITIBU GY OFU VLWIV ZPVPOPI. UEUS VUJJ PJ NSLRS LK FLR OFU LWWIJPLS RIJ KPTJO 
 +WLZZUZLTIOUB GY OFU HUSUTIV QXGVPW, IVOFLXHF TUWLTBJ PSBPWIOU OFIO PS OFU 
 +QTLOUJOISO JOTLSHFLVB LK BLTWFUJOUT I JUTZLS RIJ TUIB, OFU WFXTWF GUVVJ TXSH, 
 +ISB GLSKPTUJ ISB KPTURLTNJ VPO. 
 +</​code>​ 
 +</​spoiler>​ 
 + 
 +Your task is to write a //Python// script that will help you break the cipher and decode the original text: 
 +  * [[https://​www.pythontutorial.net/​python-basics/​python-read-text-file/​|read]] the ciphertext from a file specified as a command line argument 
 +  * use a __dictionary__ to map each encoded character back to it's original value 
 +  * __manually__ populate this dictionary as you progress in your attempt and reveal new characters 
 +  * whenever you run the script, it should print the text to the screen, with a few minor changes: 
 +    * any character that exists as a key in the dictionary should be replaced with what you think the correspondent is. 
 +    * any replaced character should be highlighted in __bold red__. 
 + 
 +<note tip> 
 + 
 +Remember ANSI codes? 
 +<code bash> 
 +$ echo -e "​\033[1;​34m I'm blue, da ba dee, dabba daa-ee, dabba dee-a dabba da \033[0m"​ 
 +</​code>​ 
 + 
 +---- 
 + 
 +In breaking a short substitution cipher like this while also knowing the original language, you need to look at bigrams and trigrams. Small groups of letters that have a limited amount of possible values that make sense: //"​to"//,​ //"​and"//,​ //"​the"//,​ etc. As you reveal more and more of the original text, words will begin to form, making everything progressively easier. 
 + 
 +If you need an extra hint: 
 +<​spoiler>​ 
 +//"5 SLEUZGUT"//​ looks like a date. Hmm... //​**"​SLEUZGUT"​**//​... 
 +</​spoiler>​ 
 +</​note>​ 
 + 
 +<​note>​ 
 +Already done? Try [[https://​ctflearn.com/​challenge/​238|this challenge]] as well. 
 + 
 +---- 
 + 
 +Alternatively,​ if you want to keep learning python, take a look at [[https://​ocw.cs.pub.ro/​courses/​ep/​labs/​05|these labs]] for an introduction into //NumPy// (a fundamental module for numeric computation) and //​matplotlib//​ (a module for plotting). 
 +</​note>​ 
 + 
 +<​solution -hidden>​ 
 +<file python cracker.py>​ 
 +#​!/​usr/​bin/​python3 
 + 
 +import sys 
 + 
 +inv = { 
 +#    '​A'​ : '',​ 
 +    '​B'​ : '​D',​ 
 +#    '​C'​ : '',​ 
 +    '​D'​ : '​X',​ 
 +    '​E'​ : '​V',​ 
 +    '​F'​ : '​H',​ 
 +    '​G'​ : '​B',​ 
 +    '​H'​ : '​G',​ 
 +    '​I'​ : '​A',​ 
 +    '​J'​ : '​S',​ 
 +    '​K'​ : '​F',​ 
 +    '​L'​ : '​O',​ 
 +    '​M'​ : '​J',​ 
 +    '​N'​ : '​K',​ 
 +    '​O'​ : '​T',​ 
 +    '​P'​ : '​I',​ 
 +    '​Q'​ : '​P',​ 
 +    '​R'​ : '​W',​ 
 +    '​S'​ : '​N',​ 
 +    '​T'​ : '​R',​ 
 +    '​U'​ : '​E',​ 
 +    '​V'​ : '​L',​ 
 +    '​W'​ : '​C',​ 
 +    '​X'​ : '​U',​ 
 +    '​Y'​ : '​Y',​ 
 +    '​Z'​ : '​M',​ 
 +
 + 
 +def main(): 
 +    # cli arguments check 
 +    if len(sys.argv) != 2: 
 +        print("​Usage ./​cracker.py <​input_file>"​) 
 + 
 +    # read contents of file 
 +    with open(sys.argv[1]) as f: 
 +        enc = f.read() 
 + 
 +    # make sure text is uppercase 
 +    enc = enc.upper() 
 + 
 +    # create (partially) translated text 
 +    dec = [ it if it not in inv else '​\033[1;​31m%s\033[0m'​ % inv[it] \ 
 +            for it in enc ] 
 +    dec = ''​.join(dec) 
 + 
 +    # print translated text 
 +    print(dec) 
 +     
 +# program entry point 
 +if __name__ == '​__main__':​ 
 +    main() 
 +</​file>​ 
 +</​solution>​
ii/labs/02/tasks/03.1636232784.txt.gz · Last modified: 2021/11/06 23:06 by radu.mantu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0