From: Tomas Musil Date: Wed, 11 Apr 2012 20:08:04 +0000 (+0200) Subject: mailove rozhrani zvlast X-Git-Url: http://git.tomasm.cz/krypto.git/commitdiff_plain/9d99f6007c2216fdc6a61887ec5c2c947cb0b823?ds=inline mailove rozhrani zvlast --- diff --git a/krypto.py b/krypto.py new file mode 100755 index 0000000..55d249a --- /dev/null +++ b/krypto.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python + +"""CL rozhrani pro sadu kryptoanalytickych nastroju.""" + +import sys +import pickle +import argparse + +from ocesavac import ocesat +import jakobsen +from jakobsen import reference +import koincidence +import posuny +from spolecne import ABECEDA +import vigenere + +opsny = '' + +if opsny == 'H': + posli_mail(odesilatel, "Napoveda", ''.join("Napoveda:\n" + "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, " X\" Vynuti analyzu bez mezer.\n" + "\"", settings.subject, " M\" Vynuti analyzu s mezerami.\n" + "\"", settings.subject, " B\" Vypise cetnost vsech bigramu.\n" + "\"", settings.subject, " P\" Vypise vsechny posunuti textu.\n" + "\"", settings.subject, " A\" Vypise uplne vsechno co dava " + "alespon trochu smysl (nedoporucuji).\n" + "\"", settings.subject, " H\" Tato napoveda.\n" + "\nVolby (mimo \"H\") je mozno libovolne kombinovat.\n" + "Napriklad \"", settings.subject, " LXB\" analyzuje posledni " + "prijatou zpravu s vynucenim analyzy bez mezer a navic vypise " + "cetnosti bigramu.\n" + "\nS pozdravem\nVas Robot\n")) + sys.exit() + +telo = sys.stdin.read() +zprava = telo.strip().upper() + +# Prepinani spacemodu +mod_m = False +mod_x = False +if 'X' in opsny: + mod_x = True +if 'M' in opsny: + mod_m = True +if 'A' in opsny: + mod_x = True + mod_m = True +if not mod_m and not mod_x: + if ' ' in ocesat(zprava, True)[1:-1]: + mod_m = True + print "Automaticky zvolena analyza s mezerami." + else: + mod_x = True + print "Automaticky zvolena analyza bez mezer." + +# Zakladni udaje +print "\nZakladni udaje:" +if mod_m: + print ("Delka zpravy (vcetne mezer a zvlastnich znaku: " + + str(len(zprava))) +print ("Delka zpravy (bez mezer a zvlastnich znaku): " + + str(len(ocesat(zprava, False)))) + +# Prumerna delka slova +if mod_m: + print "\nPrumerna delka slova:" + slova = ocesat(zprava, True).split() + print ('{0:.3}'.format(float(sum([len(word) for word in slova]))/len(slova))) + +# Frekvence znaku +print "\nFrekvencni analyza:" +freq = dict() +for char in ABECEDA: + freq[char] = 0 +for char in zprava: + if char in freq: + freq[char] += 1 +celkem = sum(freq.values()) +for char in sorted(freq, key=freq.get, reverse=True): + print ('{0} {1:>3} {2:>6.2%}'.format(char, freq[char], + float(freq[char])/celkem)) + +# Index koincidence +if mod_m: + print "\nIndex koincidence (s mezerami):" + print ('{0:.2%}'.format( + koincidence.index_koincidence(zprava, True))) +if mod_x and len(zprava) >= 30: + #TODO tady by se spravne mela porovnavat delka ocesane zpravy + print "\nIndexy koincidence (bez mezer):" + print koincidence.tabulka_indexu(zprava) + +# Vigenere +if 'V' in opsny: + print "\nHeslo k Vigenerovi (" + opsny[-1] + "):" + vig_heslo, vig_text = vigenere.vsechno(zprava, int(opsny[-1])) + print vig_heslo + print vig_text + +# Jakobsen +if mod_m: + print "\nJakobsen (s mezerami):" + print jakobsen.desifruj(zprava) +if mod_x: + print "\nJakobsen (bez mezer):" + print jakobsen.desifruj(zprava, False) + +# Posuny v abecede +(posun, posunuty_text) = posuny.nejlepsi(zprava) +if 'P' in opsny or 'A' in opsny: + print "\nPosuny v abecede (nejlepsi posun {0}):".format(posun) + print("\n".join("{0:>2} {1}".format( + i + 1, posuny.vsechny(zprava)[i]) for i in range(26))) +else: + print "\nNejlepsi posun ({0}):".format(posun) + print posunuty_text + +# Bigramy +if 'B' in opsny or 'A' in opsny: + print "\nBigramy podle cetnosti:" + bigramy = dict() + for i in ABECEDA: + for j in ABECEDA: + bigramy[i+j] = 0 + for i in range(0, len(zprava)-1): + if zprava[i:i+2] in bigramy: + bigramy[zprava[i:i+2]] += 1 + celkem = sum(bigramy.values()) + for char in sorted(bigramy, key=bigramy.get, reverse=True): + if bigramy[char] == 0: + break + print('{0} {1:>3} {2:>6.2%}'.format(char, bigramy[char], + float(bigramy[char])/celkem)) diff --git a/robot.py b/robot.py deleted file mode 100755 index d5afd27..0000000 --- a/robot.py +++ /dev/null @@ -1,220 +0,0 @@ -#!/usr/bin/env python - -"""Mailove rozhrani pro sadu kryptoanalytickych nastroju.""" - -import sys -import smtplib -import email -from email.mime.text import MIMEText -from time import asctime -from ocesavac import ocesat -import jakobsen -from jakobsen import reference -import koincidence -import posuny -import pickle -import os -import re -from spolecne import ABECEDA -import vigenere - -class settings: - pass - -settings = pickle.load(open('./robot_settings')) -os.chdir(settings.path) - -def posli_mail(komu, predmet, text, loguj=None): - msg = MIMEText(text) - msg['Subject'] = predmet - msg['From'] = settings.name + " <" + settings.mail + ">" - msg['To'] = komu - smtplib.SMTP('localhost').sendmail(settings.mail, komu, msg.as_string()) - if loguj: - soubor = open(loguj, 'w') - soubor.write(msg.as_string()) - soubor.close() - -# Cteni mailu -mail = email.message_from_file(sys.stdin) -predmet, _, opsny = mail['Subject'].strip().upper().partition(' ') -odesilatel = mail['From'] -if predmet != settings.subject: - sys.exit() -if opsny == 'H': - posli_mail(odesilatel, "Napoveda", ''.join("Napoveda:\n" - "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, " X\" Vynuti analyzu bez mezer.\n" - "\"", settings.subject, " M\" Vynuti analyzu s mezerami.\n" - "\"", settings.subject, " B\" Vypise cetnost vsech bigramu.\n" - "\"", settings.subject, " P\" Vypise vsechny posunuti textu.\n" - "\"", settings.subject, " A\" Vypise uplne vsechno co dava " - "alespon trochu smysl (nedoporucuji).\n" - "\"", settings.subject, " H\" Tato napoveda.\n" - "\nVolby (mimo \"H\") je mozno libovolne kombinovat.\n" - "Napriklad \"", settings.subject, " LXB\" analyzuje posledni " - "prijatou zpravu s vynucenim analyzy bez mezer a navic vypise " - "cetnosti bigramu.\n" - "\nS pozdravem\nVas Robot\n")) - sys.exit() -if 'L' in opsny: - mail = pickle.load(open('./msg_last.tmp')) - m1 = re.match(r".*\<(.*)\>.*", mail['From']) - m2 = re.match(r".*\<(.*)\>.*", odesilatel) - if m1: - f1 = m1.group(1) - else: - f1 = mail['From'] - if m2: - f2 = m2.group(1) - else: - f2 = odesilatel - if (f1 != f2): - posli_mail(odesilatel, "Omluva", "Omlouvam se," - " ale Vase zprava uz bohuzel neni na serveru ulozena.\n") - sys.exit() - -if mail.is_multipart(): - telo = mail.get_payload(0).get_payload().strip() -else: - telo = mail.get_payload().strip() - -if len(ocesat(telo, False)) < 2: - posli_mail(odesilatel, "Omluva", "Omlouvam se," - " ale Vase zprava je prilis kratka.\n") - sys.exit() -zprava = telo.upper() -analyza = [] - -# Puvodni zprava -analyza.append("Puvodni zprava:") -analyza.append(telo) - -# Prepinani spacemodu -mod_m = False -mod_x = False -if 'X' in opsny: - mod_x = True -if 'M' in opsny: - mod_m = True -if 'A' in opsny: - mod_x = True - mod_m = True -if not mod_m and not mod_x: - if ' ' in ocesat(zprava, True)[1:-1]: - mod_m = True - analyza.append("\nAutomaticky zvolena analyza s mezerami.") - else: - mod_x = True - analyza.append("\nAutomaticky zvolena analyza bez mezer.") - -# 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)))) - -# 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))) - -# Frekvence znaku -analyza.append("\nFrekvencni analyza:") -freq = dict() -for char in ABECEDA: - freq[char] = 0 -for char in zprava: - if char in freq: - freq[char] += 1 -celkem = sum(freq.values()) -for char in sorted(freq, key=freq.get, reverse=True): - analyza.append('{0} {1:>3} {2:>6.2%}'.format(char, freq[char], - float(freq[char])/celkem)) - -# Index koincidence -if mod_m: - analyza.append("\nIndex koincidence (s mezerami):") - analyza.append('{0:.2%}'.format( - koincidence.index_koincidence(zprava, True))) -if mod_x and len(zprava) >= 30: - #TODO tady by se spravne mela porovnavat delka ocesane zpravy - analyza.append("\nIndexy koincidence (bez mezer):") - analyza.append(koincidence.tabulka_indexu(zprava)) - -# Vigenere -if 'V' in opsny: - # TODO?poradne cteni opsnu - analyza.append("\nHeslo k Vigenerovi (" + opsny[-1] + "):") - vig_heslo, vig_text = vigenere.vsechno(zprava, int(opsny[-1])) - analyza.append(vig_heslo) - analyza.append(vig_text) - -# Jakobsen -if mod_m: - analyza.append("\nJakobsen (s mezerami):") - analyza.append(jakobsen.desifruj(zprava)) -if mod_x: - analyza.append("\nJakobsen (bez mezer):") - analyza.append(jakobsen.desifruj(zprava, False)) - -# Posuny v abecede -(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))) -else: - analyza.append("\nNejlepsi posun ({0}):".format(posun)) - analyza.append(posunuty_text) - -# Bigramy -if 'B' in opsny or 'A' in opsny: - analyza.append("\nBigramy podle cetnosti:") - bigramy = dict() - for i in ABECEDA: - for j in ABECEDA: - bigramy[i+j] = 0 - for i in range(0, len(zprava)-1): - if zprava[i:i+2] in bigramy: - bigramy[zprava[i:i+2]] += 1 - celkem = sum(bigramy.values()) - for char in sorted(bigramy, key=bigramy.get, reverse=True): - if bigramy[char] == 0: - break - analyza.append('{0} {1:>3} {2:>6.2%}'.format(char, bigramy[char], - float(bigramy[char])/celkem)) - -# Podpis a pozdrav -analyza.append(''.join(["\nS pozdravem\nVas Robot\n" - "\n--\nPro napovedu zaslete mail s predmetem \"", - settings.subject," H\".\n"])) - -# Odeslani odpovedi -posli_mail(odesilatel, - "Analyza Vasi zpravy", - "\n".join(analyza), - './robot_last.tmp') - -f = open('./msg_last.tmp', 'w') -pickle.dump(mail, f) -f.close() - -f = open('./robot.log', 'a') -m = re.match(r".*\<(.*)\>.*", odesilatel) -if m: - odesilatel2 = m.group(1) -else: - odesilatel2 = odesilatel -f.write(asctime() + " " + odesilatel2 + " " + opsny + "\n") -f.close()