In: Morse-Chiffre Out: Gültige Buchstabenkombinationen ("words"), Wortkombinationen aus natürlichen Sprachen ("phrases")
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

139 lines
4.8 KiB

import csv
alphabet = [["A", ".-"],
["B", "-..."],
["C", "-.-."],
["D", "-.."],
["E", "."],
["F", "..-."],
["G", "--."],
["H", "...."],
["I", ".."],
["J", ".---"],
["K", "-.-"],
["L", ".-.."],
["M", "--"],
["N", "-."],
["O", "---"],
["P", ".--."],
["Q", "--.-"],
["R", ".-."],
["S", "..."],
["T", "-"],
["U", "..-"],
["V", "...-"],
["W", ".--"],
["X", "-..-"],
["Y", "-.--"],
["Z", "--.."],
["Ä", ".-.-"],
["Ö", "---."],
["Ü", "..--"],
["", "...--.."],
[" ", " "],
["0", "-----"],
["1", ".----"],
["2", "..---"],
["3", "...--"],
["4", "....-"],
["5", "....."],
["6", "-...."],
["7", "--..."],
["8", "---.."],
["9", "----."]]
morse_cipher = "..-..--..-......-"
def latin_to_morse(expression, delimiter=""): # expression: zu übersetzendes Wort
result = ""
for letter in expression:
for latin, morse in alphabet:
if letter == latin:
result += morse
result += delimiter
return result
def guess_chars(morse_text, plain_text=""):
def recursion(morse_text, plain_text=""): # morse_text = zu zerlegender Morse-Salat
if morse_text == "":
char_guesses.append(plain_text)
else:
for latin, morse in alphabet:
if morse == morse_text[0:len(morse)]:
recursion(morse_text[len(morse):len(morse_text)], (plain_text + latin))
char_guesses = []
recursion(morse_text, plain_text)
return char_guesses
def guess_vocabs(query, phrase=""): # query = zu zerlegender Buchstabensalat
if query == "":
vocab_guesses.append(phrase)
else:
for vocab in dictionary:
if vocab == query[0:len(vocab)]:
guess_vocabs(query[len(vocab):len(query)], (phrase + vocab + " "))
def wordlist_to_morse(dictionary_latin): # dictionary_latin = einsprachiges Wörterbuch (Wörterbuch)
result = []
for entry in dictionary_latin:
result.append([latin_to_morse(entry), entry])
return result
def guess_vocabs_BUT_AWESOME(cipher, dictionary, min_vocab_len = 0, max_word_count = 0): # cipher: zu entschlüsselnde Chiffre, dictionary: Wortliste im Morsecode
length = len(cipher)
if max_word_count == 0: max_word_count = length # Bei Standardwert 0 wird max_word_count so hoch gesetzt, dass es de facto keine Einschränkung macht.
phrase_kit = [[] for x in range(length + 2, 0, -1)]
phrase_kit[length + 1] = " "
print(phrase_kit)
for i in range(length, 0, -1): # vom hintersten Buchstaben an nach vorne wird die Chiffre in immer längere Schnipsel gehackt
query = cipher[i - 1:length] # query: Schnipsel der Chiffre wird auf sinnvolle Worte getestet
for vocab in dictionary:
if vocab[0] == query[0:len(vocab[0])] \
and len(vocab[1]) >= min_vocab_len: # wird ein passendes Wort gefunden und gibt es im phrase-kit Worte, die das gefundene Wort zur Länge des zu prüfenden Wortes ergänzen...
print("i = ", i, " Appending to ", vocab[1], " len = ", len(vocab[1]))
for phrase in phrase_kit[i + len(vocab[0])]:
if phrase.count(" ") <= max_word_count:
phrase_kit[i].append(vocab[1] + " " + phrase)
return phrase_kit
def deciphering_1():
char_guesses = []
guess_chars(morse_cipher)
print("Chars guessed. char_guesses complete.")
guess_list_len = len(char_guesses)
for index, word in enumerate(char_guesses):
print("(", index, "/", guess_list_len, ") - ", word, "...", end="")
vocab_guesses = []
guess_vocabs(word)
print("\r", end="")
if vocab_guesses:
print("Found something: ", vocab_guesses)
dictDE_file = open("wordlist-german.txt", "r", encoding="utf-8")
dictEN_file = open("wordlist-english.txt", "r", encoding="utf-8")
dictEN_short_file = open("corncob_caps.txt", "r", encoding="utf-8")
reader = csv.reader(dictDE_file)
dictDE = [row[0].upper() for row in reader]
reader = csv.reader(dictEN_file)
dictEN = [row[0].upper() for row in reader]
reader = csv.reader(dictEN_short_file)
dictEN_short = [row[0].upper() for row in reader]
dictionary = dictEN
#dictionary = ["FEMINIST", "TERESA", "INA", "ES", "MIT", "SEIT", "ID"]
dictMORSE = wordlist_to_morse(dictionary)
print("dictMORSE erstellt")
phrase_kit = guess_vocabs_BUT_AWESOME(morse_cipher, dictMORSE, min_vocab_len=4, max_word_count=2)
for result in phrase_kit[1]:
print(result)