From: Tomas Musil Date: Wed, 28 Mar 2012 22:17:37 +0000 (+0200) Subject: vigenere X-Git-Url: http://git.tomasm.cz/krypto.git/commitdiff_plain/d4d908e66a7d5208a37e9a91c403e092b0bada22?hp=66dcc1b3104ddc51add1cff7041bec77b7cdfa1a vigenere automaticke odhaleni hesla k Vigenerove sifre --- diff --git a/jakobsen.py b/jakobsen.py index 7e858f0..1913a27 100644 --- a/jakobsen.py +++ b/jakobsen.py @@ -3,8 +3,7 @@ from itertools import combinations import pickle from ocesavac import ocesat - -MABECEDA = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ' +from spolecne import MABECEDA def nova_tabulka(zprava, abc=MABECEDA): """Vraci tabulku cetnosti bigramu ve zprave nad danou abecedou.""" diff --git a/koincidence.py b/koincidence.py index d92fef5..b471a20 100644 --- a/koincidence.py +++ b/koincidence.py @@ -36,7 +36,7 @@ def tabulka_indexu(text): index_rozkladu(text, d), d) for d in range(1, 11)]) def rozklad(text, deleni): - """Vrati pole retezcu, v kazdem jsou znaky z puvodniho textu jejich pozice + """Vrati pole retezcu, v kazdem jsou znaky z puvodniho textu jejichz pozice ma stejny zbytek po deleni cislem 'deleni'.""" texty = [] for i in range(deleni): diff --git a/ocesavac.py b/ocesavac.py index e1d0f59..15a79fb 100644 --- a/ocesavac.py +++ b/ocesavac.py @@ -1,7 +1,7 @@ """Modul pro odstranovani diakritiky a zvlastnich znaku.""" -import unicodedata -ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +import unicodedata +from spolecne import ABECEDA def deaccent(unistr): """Vrati text bez akcentu. Pochybna metoda pouzivajici unicodedata.""" diff --git a/posuny.py b/posuny.py index 4c05de1..ac99e0b 100644 --- a/posuny.py +++ b/posuny.py @@ -3,8 +3,7 @@ import referencni from referencni import reference from ocesavac import ocesat - -ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +from spolecne import ABECEDA def posun(char, pos=1): """Pokud dostane velke pismeno, vrati pismeno ktere je od nej vzdaleno @@ -31,8 +30,14 @@ def eu_vzdalenost(vec1, vec2): return sum([(x - y)**2 for (x, y) in zip(vec1, vec2)]) def nejlepsi(text): - """Vrati to posunuti textu (neocesaneho), ktere ma frekvence znaku + """Vrati text (neocesany) posunuty tak, aby mel frekvence znaku co nejblizsi cestine bez mezer.""" + posunuti = nej_posun(text) + return (posunuti, ''.join([posun(char, posunuti) for char in text.upper()])) + +def nej_posun(text): + """Vrati pocet znaku v abecede, o ktere by se mel text posunout, aby mel + frekvence znaku co nejblize cestine bez mezer.""" ref = referencni.nacti('bref') freq = dict() for char in ocesat(text, False): @@ -47,4 +52,4 @@ def nejlepsi(text): if nova_vzdalenost < vzdalenost: vzdalenost = nova_vzdalenost posunuti = i - return (posunuti, ''.join([posun(char, posunuti) for char in text.upper()])) + return posunuti \ No newline at end of file diff --git a/referencni.py b/referencni.py index e00d0b7..06bfeec 100644 --- a/referencni.py +++ b/referencni.py @@ -5,9 +5,7 @@ import pickle from ocesavac import ocesat import codecs from koincidence import index_koincidence - -ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' -MABECEDA = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ' +from spolecne import ABECEDA, MABECEDA def nova_tabulka(tabulka, abc=MABECEDA): celkem = sum(sum(tab2.values()) for tab2 in tabulka.values()) diff --git a/robot.py b/robot.py index ce6244f..7f651e1 100755 --- a/robot.py +++ b/robot.py @@ -15,8 +15,8 @@ import posuny import pickle import os import re - -ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +from spolecne import ABECEDA +import vigenere class settings: pass @@ -146,6 +146,11 @@ if mod_x: analyza.append("\nIndexy koincidence (bez mezer):") analyza.append(koincidence.tabulka_indexu(zprava)) +# Vigenere +if 'V' in opsny: + analyza.append("\nHeslo k Vigenerovi (" + opsny[-1] + "):") + analyza.append(vigenere.zjisti_heslo(zprava, int(opsny[-1]))) + # Jakobsen if mod_m: analyza.append("\nJakobsen (s mezerami):") diff --git a/spolecne.py b/spolecne.py new file mode 100644 index 0000000..720783f --- /dev/null +++ b/spolecne.py @@ -0,0 +1,6 @@ +ABECEDA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +MABECEDA = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ' + +def cisla_na_text(cisla): + """Z pole cisel udela textovy retezec (1 = A, ...).""" + return ''.join([MABECEDA[c] for c in cisla]) \ No newline at end of file diff --git a/vigenere.py b/vigenere.py new file mode 100644 index 0000000..a441f57 --- /dev/null +++ b/vigenere.py @@ -0,0 +1,13 @@ +"""Modul pro lamani Vigenerovi sifry.""" + +from koincidence import rozklad +from ocesavac import ocesat +from posuny import nej_posun +from spolecne import cisla_na_text + +def zjisti_heslo(zprava, delka_h): + """Najde heslo dane delky, pri jehoz aplikaci budou frekvence znaku nejlepe + odpovidat cestine.""" + rozklady = rozklad(ocesat(zprava, False), delka_h) + posuny = [nej_posun(text) for text in rozklady] + return cisla_na_text(posuny) \ No newline at end of file