vigenere
authorTomas Musil <tomik.musil@gmail.com>
Wed, 28 Mar 2012 22:17:37 +0000 (00:17 +0200)
committerTomas Musil <tomik.musil@gmail.com>
Wed, 28 Mar 2012 22:32:06 +0000 (00:32 +0200)
automaticke odhaleni hesla k Vigenerove sifre

jakobsen.py
koincidence.py
ocesavac.py
posuny.py
referencni.py
robot.py
spolecne.py [new file with mode: 0644]
vigenere.py [new file with mode: 0644]

index 7e858f0..1913a27 100644 (file)
@@ -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."""
index d92fef5..b471a20 100644 (file)
@@ -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):
index e1d0f59..15a79fb 100644 (file)
@@ -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."""
index 4c05de1..ac99e0b 100644 (file)
--- 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
index e00d0b7..06bfeec 100644 (file)
@@ -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())
index ce6244f..7f651e1 100755 (executable)
--- 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 (file)
index 0000000..720783f
--- /dev/null
@@ -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 (file)
index 0000000..a441f57
--- /dev/null
@@ -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