From bf595ddb5a09ef7a82db9528df97f57f40d09927 Mon Sep 17 00:00:00 2001 From: Tomas Musil Date: Wed, 28 Mar 2012 18:20:53 +0200 Subject: [PATCH] kosmeticke upravy --- jakobsen.py | 44 ++++++++++++++++++++++++++++++-------------- robot.py | 38 +++++++++++++++++++++++++------------- 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/jakobsen.py b/jakobsen.py index 40a1d1c..7e858f0 100644 --- a/jakobsen.py +++ b/jakobsen.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +"""Modul pro praci s Jakobsenovym algoritmem.""" from itertools import combinations import pickle @@ -7,6 +7,7 @@ from ocesavac import ocesat MABECEDA = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ' def nova_tabulka(zprava, abc=MABECEDA): + """Vraci tabulku cetnosti bigramu ve zprave nad danou abecedou.""" tabulka = dict() for i in abc: tabulka[i] = dict() @@ -21,6 +22,8 @@ def nova_tabulka(zprava, abc=MABECEDA): return tabulka def vzdalenost(tab1, tab2, abc=MABECEDA): + """Vraci soucet strednich kvadratickych odchylek pro dve tabulky cetnosti + bigramu nad danou abecedou.""" rozdil = 0 for i in abc: for j in abc: @@ -28,15 +31,18 @@ def vzdalenost(tab1, tab2, abc=MABECEDA): return rozdil def substituce(zprava, slovnik, abc=MABECEDA): + """Vrati zpravu, ve ktere jsou znaky dane abecedy nahrazenypodle daneho + slovniku.""" pole = [] - for c in zprava: - if c in abc: - pole.append(slovnik[c]) + for char in zprava: + if char in abc: + pole.append(slovnik[char]) else: - pole.append(c) + pole.append(char) return pole def poradi_dle_frekvence(zprava, abc=MABECEDA): + """Vrati znaky dane abecedy v poradi podle frekvence v dane zprave.""" freq = dict() for char in abc: freq[char] = 0 @@ -49,8 +55,13 @@ class reference: pass def jakobsen(zprava, ref): + """Pro danou sifrovanou zpravu vrati substitucni slovnik odvozeny s pomoci + Jakobsenova algoritmu s danou referencni tabulkou.""" slovnik = dict(zip(poradi_dle_frekvence(zprava, ref.abeceda), ref.poradi)) - tabulka = nova_tabulka(substituce(zprava, slovnik, ref.abeceda), ref.abeceda) + tabulka = nova_tabulka( + substituce(zprava, slovnik, ref.abeceda), + ref.abeceda + ) vzdal = vzdalenost(tabulka, ref.tabulka, ref.abeceda) vzdal_old = vzdal + 1 @@ -58,22 +69,27 @@ def jakobsen(zprava, ref): vzdal_old = vzdal for (x, y) in combinations(ref.abeceda, 2): slovnik[x], slovnik[y] = slovnik[y], slovnik[x] - v1 = vzdalenost(nova_tabulka(substituce(zprava, slovnik, ref.abeceda), ref.abeceda), - ref.tabulka, ref.abeceda) - if v1 < vzdal: - vzdal = v1 + nova_vzdalenost = vzdalenost( + nova_tabulka( + substituce(zprava, slovnik, ref.abeceda), + ref.abeceda), + ref.tabulka, + ref.abeceda) + if nova_vzdalenost < vzdal: + vzdal = nova_vzdalenost else: slovnik[x], slovnik[y] = slovnik[y], slovnik[x] return slovnik def desifruj(zprava, mezery=True): + """Vrati vysledek pokusu dekodovat zpravu Jakobsenovym algoritmem.""" if mezery: - f = open('ref') + soubor = open('ref') else: - f = open('bref') - ref = pickle.load(f) - f.close() + soubor = open('bref') + ref = pickle.load(soubor) + soubor.close() slovnik = jakobsen(ocesat(zprava, mezery), ref) return '\n'.join([''.join(substituce(zprava, slovnik, ref.abeceda)), ' '.join(ref.abeceda), diff --git a/robot.py b/robot.py index 21d297a..7992a53 100755 --- a/robot.py +++ b/robot.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +"""Mailove rozhrani pro sadu kryptoanalytickych nastroju.""" + import sys import smtplib import email @@ -22,16 +24,16 @@ class settings: settings = pickle.load(open('./robot_settings')) os.chdir(settings.path) -def posli_mail(komu, co, text, loguj=None): +def posli_mail(komu, predmet, text, loguj=None): msg = MIMEText(text) - msg['Subject'] = co + msg['Subject'] = predmet msg['From'] = settings.name + " <" + settings.mail + ">" msg['To'] = komu smtplib.SMTP('localhost').sendmail(settings.mail, komu, msg.as_string()) if loguj: - f = open(loguj, 'w') - f.write(msg.as_string()) - f.close() + soubor = open(loguj, 'w') + soubor.write(msg.as_string()) + soubor.close() # Cteni mailu mail = email.message_from_file(sys.stdin) @@ -41,11 +43,13 @@ if predmet != settings.subject: sys.exit() if opsny == 'H': posli_mail(odesilatel, "Napoveda", "Napoveda:\n" - "Prikazy robotovi vkladejte do predmetu zpravy zaslane na adresu " + + "Prikazy robotovi vkladejte do predmetu zpravy " + "zaslane na adresu " + settings.mail + ".\nNa velikosti pismen nezalezi." "\n\nSeznam prikazu:\n" "\"" + settings.subject + "\" Analyza zpravy z tela mailu.\n" - "\"" + settings.subject + " L\" Opakovana analyza posledni zpravy.\n" + + "\"" + settings.subject + " L\" Opakovana analyza " + "posledni zpravy.\n" + "\"" + settings.subject + " X\" Vynuti analyzu bez mezer.\n" "\"" + settings.subject + " M\" Vynuti analyzu s mezerami.\n" "\"" + settings.subject + " B\" Vypise cetnost vsech bigramu.\n" @@ -108,14 +112,17 @@ if not mod_m and not mod_x: # Zakladni udaje analyza.append("\nZakladni udaje:") if mod_m: - analyza.append("Delka zpravy (vcetne mezer a zvlastnich znaku): " + str(len(zprava))) -analyza.append("Delka zpravy (bez mezer a zvlastnich znaku): " + str(len(ocesat(zprava, False)))) + analyza.append("Delka zpravy (vcetne mezer a zvlastnich znaku): " + + str(len(zprava))) +analyza.append("Delka zpravy (bez mezer a zvlastnich znaku): " + + str(len(ocesat(zprava, False)))) # Prumerna delka slova if mod_m: analyza.append("\nPrumerna delka slova:") slova = ocesat(zprava, True).split() - analyza.append('{0:.3}'.format(float(sum([len(word) for word in slova]))/len(slova))) + analyza.append('{0:.3}'.format( + float(sum([len(word) for word in slova]))/len(slova))) # Frekvence znaku analyza.append("\nFrekvencni analyza:") @@ -133,7 +140,8 @@ for char in sorted(freq, key=freq.get, reverse=True): # Index koincidence if mod_m: analyza.append("\nIndex koincidence (s mezerami):") - analyza.append('{0:.2%}'.format(koincidence.index_koincidence(zprava, True))) + analyza.append('{0:.2%}'.format( + koincidence.index_koincidence(zprava, True))) if mod_x: analyza.append("\nIndexy koincidence (bez mezer):") analyza.append(koincidence.tabulka_indexu(zprava)) @@ -150,7 +158,8 @@ if mod_x: (posun, posunuty_text) = posuny.nejlepsi(zprava) if 'P' in opsny or 'A' in opsny: analyza.append("\nPosuny v abecede (nejlepsi posun {0}):".format(posun)) - analyza.append("\n".join("{0:>2} {1}".format(i + 1, posuny.vsechny(zprava)[i]) for i in range(26))) + analyza.append("\n".join("{0:>2} {1}".format( + i + 1, posuny.vsechny(zprava)[i]) for i in range(26))) else: analyza.append("\nNejlepsi posun ({0}):".format(posun)) analyza.append(posunuty_text) @@ -178,7 +187,10 @@ analyza.append(''.join(["\nS pozdravem\nVas Robot\n" settings.subject," H\".\n"])) # Odeslani odpovedi -posli_mail(odesilatel, "Analyza Vasi zpravy", "\n".join(analyza), './robot_last.tmp') +posli_mail(odesilatel, + "Analyza Vasi zpravy", + "\n".join(analyza), + './robot_last.tmp') f = open('./msg_last.tmp', 'w') pickle.dump(mail, f) -- 2.4.2