From cc4a884c5c59624d380ba82b9dd4fa347d1fcedd Mon Sep 17 00:00:00 2001 From: tebarius Date: Mon, 28 Jul 2025 19:18:10 +0200 Subject: [PATCH] adfgx, adfgvx und hilfetexte.py --- app/app.py | 36 ++- app/hilfetexte.py | 591 +++++++++++++++++++++++++++++++++++ app/tools.py | 775 ++++++++-------------------------------------- 3 files changed, 737 insertions(+), 665 deletions(-) create mode 100644 app/hilfetexte.py diff --git a/app/app.py b/app/app.py index f2017d1..b84dce3 100644 --- a/app/app.py +++ b/app/app.py @@ -242,16 +242,20 @@ def auswahl_verarbeiten(): elif auswahl == "Jägerzaun dekodieren": st.session_state.output_text = tools.jaegerzaun_decrypt(text, additional_parameter) st.session_state.map_data = None - elif auswahl == "REPLACE": - st.session_state.output_text = tools.REPLACE(text) + elif auswahl == "ADFGX kodieren": + st.session_state.output_text = tools.adfgx_kodieren(text, additional_parameter) + st.session_state.map_data = None + elif auswahl == "ADFGX dekodieren": + st.session_state.output_text = tools.adfgx_dekodieren(text, additional_parameter) + st.session_state.map_data = None + elif auswahl == "ADFGVX kodieren": + st.session_state.output_text = tools.adfgvx_kodieren(text, additional_parameter) + st.session_state.map_data = None + elif auswahl == "ADFGVX dekodieren": + st.session_state.output_text = tools.adfgvx_dekodieren(text, additional_parameter) st.session_state.map_data = None - elif auswahl == "Dummy mit Karte": - output, mapd = tools.funktion_mit_karte(text, additional_parameter) - st.session_state.output_text = output - st.session_state.map_data = mapd - # Standardwerte im Session State initialisieren if 'option' not in st.session_state: st.session_state.option = "Wähle eine Funktion" @@ -339,7 +343,10 @@ option = st.sidebar.radio("hidden_label", "Base64<->ASCII", "Jägerzaun kodieren", "Jägerzaun dekodieren", - "Dummy mit Karte", + "ADFGX kodieren", + "ADFGX dekodieren", + "ADFGVX kodieren", + "ADFGVX dekodieren", ), key='option', on_change=auswahl_verarbeiten, @@ -348,12 +355,7 @@ option = st.sidebar.radio("hidden_label", # Optionales einzeiliges Eingabefeld nur für bestimmte Funktionen additional_parameter = None -if option == "Dummy mit Karte": - additional_parameter = st.text_input( - "Optionaler Zusatztext für Dummy mit Karte", - placeholder="Zusätzliche Eingabe hier" - ) -elif option in ["Vigenere-Chiffre", "Wolseley-Chiffre", "Autokey-Chiffre", "Polybios kodieren", "Polybios dekodieren"]: +if option in ["Vigenere-Chiffre", "Wolseley-Chiffre", "Autokey-Chiffre", "Polybios kodieren", "Polybios dekodieren"]: additional_parameter = st.text_input( "Schlüsselwort:", placeholder="Schlüsselwort hier eingeben" @@ -368,6 +370,12 @@ elif option in ["Jägerzaun kodieren", "Jägerzaun dekodieren"]: "Schlüsselfeld:", placeholder="Schlüsselzahl hier eingeben" ) +elif option in ["ADFGX kodieren", "ADFGX dekodieren", "ADFGVX kodieren", "ADFGVX dekodieren"]: + additional_parameter = st.text_input( + "Passwörter:", + placeholder="PasswortEins, PasswortZwei" + ) + # Button zum manuellen Ausführen der Verarbeitungsfunktion if st.button(f"{st.session_state.option}"): auswahl_verarbeiten() diff --git a/app/hilfetexte.py b/app/hilfetexte.py new file mode 100644 index 0000000..10cfc3d --- /dev/null +++ b/app/hilfetexte.py @@ -0,0 +1,591 @@ +# Copyright (c) 2025 Martin Kayser (tebarius) +# Licensed under the MIT License. See LICENSE file in the project root. + +cesar_all = ("### Cesar-Verschiebe-Chiffre\n" + "Von der eingegebenen Zeichenkette werden, alle möglichen Verschiebungen gemäß der Cesarchiffre generiert " + "und ausgegeben. Sonderzeichen und Zahlen werden unverändert wiedergegeben.") + +buchstabenwortwert = ("### Buchstabenwortwerte ermitteln\n" + "Diese Funktion berechnet den Buchstabenwert der eingegeben Zeichenkette. (A=1 B=2 .... Ä=27 " + "Ö=28 Ü=29 ß=30) Bei mehreren durch Leerzeichen getrennten Wörtern wird auch für jedes einzelne " + "Wort der Wortwert errechnet. \n" + "Desweiteren wird die Quersumme und die iterierte Quersumme des Gesamtbuchstabenwertes als auch " + "für jedes Wort das Buchstabenwertprodukt und das Gesamtbuchstabenwertprodukt ermittelt.") + +buchstabenwert_zu_text = ("### Buchstabenwerte zu Text\n" + " Die eingegebenen Buchstabenwerte werden in die entsprechenden Buchstaben umgewandelt." + " (A=1 B=2 .... Ä=27 Ö=28 Ü=29 ß=30) Als Trennungszeichen zwischen den Zahlen sind folgende" + " Zeichen erlaubt: | , _ . - / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten" + " möglichst nur 1 Leerzeichen zwischen den Zahlen verwendet werden (überzählige Leerzeichen" + " werden sonst als nicht erkannte Zeichen behandelt).") + +zeichenkette_reverse = ("### Zeichenkette rückwärts\n" + "Diese Funktion gibt die eingegebene Zeichenkette von hinten nach vorn gelesen aus.") + +zeichenanzahl = ("### Zeichenzählen\n" + "Es wird das Vorkommen jedes einzelnen Zeichens gezählt und ausgegeben. Achtung! Leerzeichen," + " Tabulatorzeichen und Zeilenumbrüche werden nur vor dem letzten sichtbaren Zeichen gezählt!!!") + +quersummen = ("### Quersumme(n)\n" + "Von den eingegebenen Zahlen werden die Quersummen und iterierten Quersummen errechnet und ausgegeben. " + "Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und " + "Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den Zahlen " + "verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + +einschluss_count = ("### Einschlüsse zählen\n" + "Es werden die Einschlüsse in Buchstaben und Ziffern gezählt. Neben der Anzahl der Einschlüsse für " + "jeden einzelnen Buchstaben, für jedes Wort und die gesammte Eingabe ermittelt. Da es sich bei der " + "Zahl 4 je nach Schreibweise um eine Zahl mit oder ohne Einschluß handeln kann, werden beide " + "Varianten berücksichtigt. \n" + "!!! Hier ist Klein- und Großschreibung wichtig, denn z.B. b=1 aber B=2 !!!") + +morse_to_abc = ("### Morsecode zu Text\n" + "Die Eingabe des Morsecodes hat wie folgt zu erfolgen: - für lang und . für kurz, zwischen den " + "Buchstaben ein Leerzeichen und als Worttrennung ein / wobei davor und danach ein Leerzeichen steht. " + "Für unbekannte Morsecodes erscheint in der Ausgabe ein #.") + +abc_to_morse = ("### Text zu Morsecode\n" + "Eingabetext wird als Morsecode ausgegeben. Nicht kodierbare Zeichen erscheinen unverändert " + "in der Ausgabe.") + +rot5 = ("### ROT 5\n" + "ROT 5 bezeichnet eine Verschiebechiffrierung, bei welcher die Ziffern 0-9 um je 5 Stellen " + "verschoben werden. Aus 0 wird 5, aus 1 wird 6, aus 7 wird 2,usw. Kodieren und Dekodieren " + "geschieht hier mit ein und derselben Funktion, alle Zeichen die keine Ziffern sind werden " + "unverändert wiedergegeben.") + +rot13 = ("### ROT 13\n" + "ROT 13 bezeichnet eine Verschiebechiffrierung, bei welcher die 26 Buchstaben (A-Z) um genau " + "13 Stellen verschoben werden. Da dies genau die Hälfte des Alphabets ist, wird z.B. aus einem " + "A ein N und aus einem N ein A und somit wird über die selbe Funktion sowohl kodiert als auch " + "dekodiert. Die Klein- und Großschreibung bleibt erhalten und alle Zeichen die keine Buchstaben " + "sind werden unverändert wiedergegeben.") + +rot18 = ("### ROT 18\n" + "ROT 18 ist eigentlich nix anderes als, daß hier ROT 5 mit ROT 13 kombiniert wird. Die Buchstaben " + "A-Z werden um 13 Stellen verschoben und die Ziffern 0-9 um 5 Stellen. Alle sonstigen Zeichen " + "bleiben unverändert und die Klein- oder Großschreibung bleibt auch erhalten, und auch hier " + "kodiert/dekodiert ein und dieselbe Funktion.") + +rot47 = ("### ROT 47\n" + "Bei ROT47 geschieht eigentlich nix anderes als bei ROT5 oder ROT13 nur das hier die druckbaren " + "ASCII-Zeichen mit den Werten 33-126(dezimal) zur Auswahl stehen, also nahezu alle Zeichen die auf " + "eine Standardtastatur aufgedruckt sind. Das Ergebnis ist aber deutlich unlesbarer als z.B. bei " + "ROT13. Alle weiteren Zeichen (z.B. ÄÖÜß) werden unverändert wiedergegeben und auch hier " + "kodiert/dekodiert ein und dieselbe Funktion.") + +ascii_to_dez = ("### Text zu Dezimalzahlen\n" + "Der eingegebene Text wird in Dezimalzahlen umgewandelt.") + +dez_to_ascii = ("### Dezimalzahlen zu Text\n" + "Die eingegebenen Dezimalzahlen werden in die entsprechenden UNICODE-Zeichen umgewandelt. Als " + "Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und Leerzeichen. " + "Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den Zahlen verwendet " + "werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + +ascii_to_hex = ("### Text zu Hexadezimalzahlen\n" + "Der eingegebene Text wird in Hexadezimalzahlen umgewandelt.") + +hex_to_ascii = ("### Hexadezimalzahlen zu Text\n" + "Die eingegebenen Hexadezimalzahlen werden in die entsprechenden UNICODE-Zeichen umgewandelt. " + "Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und " + "Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den " + "Zahlen verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + +octal_to_ascii = ("### Octalzahlen zu Text\n" + "Die eingegebenen Octalzahlen werden in die entsprechenden UNICODE-Zeichen umgewandelt. Als " + "Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und Leerzeichen. " + "Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den Zahlen verwendet " + "werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + +ascii_to_octal = ("### Text zu Octalzahlen\n" + "Der eingegebene Text wird in Octalzahlen umgewandelt.") + +ascii_to_bin16 = ("### Text zu Binärzahlen (16 bit)\n" + "Der eingegebene Text wird in Binärzahlen mit einer festgelegten Breite von 16bit (16 Zeichen) " + "umgewandelt.") + +ascii_to_bin8 = ("### Text zu Binärzahlen (8 bit)\n" + "Der eingegebene Text wird in Binärzahlen mit einer festgelegten Breite von 8bit (8 Zeichen) " + "umgewandelt.") + +bin_to_ascii = ("### Binärzahlen zu Text\n" + "Die eingegebenen Binärzahlen werden in die entsprechenden UNICODE-Zeichen umgewandelt. Als " + "Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und " + "Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den Zahlen " + "verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + +zahlwortsuche_de = ("### Zahlwortsuche DE 0-12\n" + "Diese Funktion versucht deutsche Zahlworte zwischen 0 und 12 in einem Text aufzuspüren. Da alle " + "Zeichen ignoriert werden, welche keine Buchstaben sind, werden auch Zahlwörter gefunden welche sich " + "z.B. über zwei Worte verteilen.") + +zahlwortsuche_en = ("### Zahlwortsuche EN 0-15\n" + "Diese Funktion versucht englische Zahlworte zwischen 0 und 15 in einem Text aufzuspüren. " + "Da alle Zeichen ignoriert werden, welche keine Buchstaben sind, werden auch Zahlwörter gefunden " + "welche sich z.B. über zwei Worte verteilen.") + +kenny_kodieren = ("### Kennyspeak kodieren\n" + "Hilfe sie haben Kenny getötet.. ach nee er kann ja noch seine unverständlichen m p f -Laute von " + "sich geben und hier geht es darum normalen Text in genau diese Laute umzusetzen, wo jedem " + "Buchstaben A-Z eine 3 Zeichen-Kombination zugeordnet ist die sich aus m,p,f zusammensetzt." + "(a=mmm h=mfp x=fpf)") + +kenny_dekodieren = ("### Kennyspeak dekodieren\n" + "Wie? Du verstehst Kenny's mpf-Gebrabbel nicht? Na gut da kann ich helfen!! Nicht kennifiziertes " + "wird unverändert ausgegeben.") + +kenny_raten = ("### KENNYspeak raten\n" + "Diese Funktion dient zum dekodieren von kennyfizierten Texten, bei denen die 3 Buchstaben mpf " + "vertauscht oder durch andere Zeichen ersetzt wurden. Hierzu werden vor der Dekodierung die 3 " + "häufigsten Zeichen im Text ermittelt und alle anderen Zeichen entfernt bevor die 6 möglichen " + "Lösungen ausgegeben werden. (Falls zum kodieren die Zahlen 0,1 oder 2 verwendet wurden, werden " + "sie durch Buchstaben a,b,c.. ersetzt)") + +primzahlalphabet_dekodieren = ("### Primzahlalphabet dekodieren\n" + "Hier können Primzahlen kleiner als 1 Million in Buchstaben umgewandelt werden. Es " + "wird dabei davon ausgegangen, daß den Primzahlen wiederholend die Buchstaben A-Z " + "zugeordnet werden,2=A 3=B 5=C 7=D 11=E ... 97=Y 101=Z 103=A 107=B ... usw.") + +primzahlpruefen = ("### Primzahl prüfen\n" + "Für eine eingegebene Zahl wird überprüft, ob es sich um eine Primzahl handelt. Ist die eingegebene " + "Zahl eine Primzahl wird auch informiert, die wievielte Primzahl es ist. Zahlen über 1,299,709 (der " + "100,000. Primzahl) werden abgelehnt.") + +nte_primzahl = ("### n.te Primzahl\n" + "Du willst wissen wie z.B. die 1,000. Primzahl lautet, dann bist du hier genau richtig. Die Funktion " + "liefert maximal die 100,000. Primzahl.") + +primfaktoren = ("### Primfaktorenzerlegung\n" + "Für die eingegebene Zahl werden die Primfaktoren ermittelt und ausgegeben. Sollte die Zahl einen " + "Primfaktoren haben, welcher größer als 100 Millionen ist, wird die Suche abgebrochen, da die Suche " + "sonst zu lange dauert. Die Funktion lässt sich damit also auch, bei Zahlen kleiner als 200 Millionen, " + "dazu benutzen um festzustellen, ob die eingegebene Zahl eine Primzahl ist.") + +dez_to_hex_oct_bin = ("### Dezimal zu HEX, Octal, Binär\n" + "Die eingegebenen dezimalen Ganzzahlen werden in die entsprechenden hexadezimalen, octalen und " + "binären Zahlen umgerechnet. Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen " + "erlaubt: | , _ / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 " + "Leerzeichen zwischen den Zahlen verwendet werden (überzählige Leerzeichen werden sonst als " + "nicht erkannte Zeichen behandelt).") + +hex_to_dez_oct_bin = ("### Hexadezimal zu Dezimal, Octal, Binär\n" + "Die eingegebenen hexadezimalen Zahlen werden in die entsprechenden dezimalen, octalen und " + "binären Zahlen umgerechnet. Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen " + "erlaubt: | , _ / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur " + "1 Leerzeichen zwischen den Zahlen verwendet werden (überzählige Leerzeichen werden sonst als " + "nicht erkannte Zeichen behandelt).") + +oct_to_hex_dez_bin = ("### Octal zu HEX, Dezimal, Binär\n" + "Die eingegebenen octalen Zahlen werden in die entsprechenden hexadezimalen, dezimalen und " + "binären Zahlen umgerechnet. Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen " + "erlaubt: | , _ / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur " + "1 Leerzeichen zwischen den Zahlen verwendet werden (überzählige Leerzeichen werden sonst als " + "nicht erkannte Zeichen behandelt).") + +bin_to_hex_dez_oct = ("### Binär zu HEX, Dezimal, Octal\n" + "Die eingegebenen binären Zahlen werden in die entsprechenden hexadezimalen, dezimalen und " + "octalen Zahlen umgerechnet. Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen " + "erlaubt: | , _ / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur " + "1 Leerzeichen zwischen den Zahlen verwendet werden (überzählige Leerzeichen werden sonst als " + "nicht erkannte Zeichen behandelt).") + +abc_to_tomtom = ("### Text zu Tomtom\n" + "Beim Tomtom Code werden die einzelnen Buchstaben durch Kombinationen von / und \\ dargestellt. " + "Zwischen den einzelnen Buchstaben steht ein Leerzeichen zwischen Worten zwei Leerzeichen. Kodiert " + "werden, können nur die Buchstaben A-Z.") + +tomtom_to_abc = ("### Tomtom zu Text\n" + "Beim Tomtom Code werden die einzelnen Buchstaben durch Kombinationen von / und \\ dargestellt. " + "Zwischen den einzelnen Buchstaben steht ein Leerzeichen zwischen Worten zwei Leerzeichen. Kodiert " + "werden, können nur die Buchstaben A-Z.") + +text_to_slashpipe = ("### Text zu Slash and Pipe\n" + "Vergleichbar mit dem Tomtom-Code nur das hier für die Buchstabenkodierung auch | eingesetzt " + "wird. Zwischen den einzelnen Buchstaben steht ein Leerzeichen zwischen Worten zwei Leerzeichen. " + "Kodiert werden, können nur die Buchstaben A-Z.") + +slashpipe_to_text = ("### Slash and Pipe zu Text\n" + "Vergleichbar mit dem Tomtom-Code nur das hier für die Buchstabenkodierung auch der | mit " + "eingesetzt wird. Zwischen den einzelnen Buchstaben steht ein Leerzeichen zwischen Worten zwei " + "Leerzeichen. Dekodiert werden, können nur die Buchstaben A-Z.") + +periodensystem = ("### Periodensystem: Ordnungszahl<->Symbol\n" + "Eingegebenen Ordnungszahlen 1-118 aus dem Periodensystem der Elemente werden in die ihnen " + "zugehörigen Elementsymbole umgewandelt und anschließend als Text ausgegeben, außerdem erscheint " + "noch eine Ausgabe bei welcher nur die Anfangsbuchstaben der Symbole ausgegeben werden. Werden in " + "der Eingabe Symbole (z.B. N, He) erkannt werde diese zusammen mit ihren Ordnungszahlen ausgegeben. " + "Als Trennungszeichen zwischen den Zahlen und/oder Symbolen sind folgende Zeichen erlaubt: " + "| , _ . - / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen " + "zwischen den Zahlen verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte " + "Zeichen behandelt).") + +naknak_to_text = ("### NakNak to Text\n" + "Nak-Nak / Entensprache / Duck Speak ist eine Spaßsprache, welche vom Owner der Website " + "[https://schnatterente.net]" + "(https://web.archive.org/web/20230807065421/https://www.schnatterente.net/) entwickelt wurde. " + "Diese Funktion übersetzt das Geschnatter in verständliche Buchstaben/Zeichen. !!Bitte unbedingt " + "die Groß- und Kleinschreibung beibehalten!! Wer diesen Quatsch unbedingt umgekehrt übersetzten " + "will, wird wohl etwas suchen müssen, da der Original-Übersetzer, der unter " + "http://uebersetzer.schnatterente.net erreichbar war, nicht mehr online ist und ich ganz bestimmt " + "keinen hier integrieren werde.") + +navajo_to_text = ("### Navajo-ABC to Text\n" + "Die Sprache der Navajo-Indianer wurde im zweiten Weltkrieg für den verschlüßelten Funkverkehr " + "eingesetzt. Vorteile waren, daß nahezu niemand außer Navajo-Volk die Sprache verstand und es keine " + "schriftlichen Aufzeichnungen über die Sprache gab. Das Alphabet und die Codewörter wurden dabei von " + "den Codesprechern (natürlich Navajo's) auswendig gelernt. Die Dekodierfunktion hier übersetzt das " + "Codealphabet (A-Z), bei welchem es auch so ist, daß unterschiedliche Worte für den selben " + "Buchstaben stehen, in normalen Text. Leider existieren leicht unterschiedliche Alphabete was die " + "Wörter bzw. deren Schreibweise angeht im Netz, mit welchen codiert wird, weshalb ich hier nur die " + "Dekodierung anbiete. weitere Codewörter und Erklärungen gibt es z.B. hier: " + "https://ww2db.com/other.php?other_id=29 oder hier: " + "http://math.ucsd.edu/~crypto/Projects/RobertoSandoval/NavajoWindtalkers.pdf") + +pi_suche = ("### PI Nachkommastellensuche\n" + "Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle auszugeben " + "und das erst Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen von PI " + "(3.141592653589793238462643...) zu ermitteln. Aus Performance- und Speicherplatzgründen ist die Suche " + "auf die ersten 10 Millionen Nachkommastellen beschränkt.") + +euler_suche = ("### Eulersche Zahl - Nachkommastellensuche\n" + "Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle auszugeben " + "und das erst Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen von e " + "(2.71828182845904523.....) zu ermitteln. Aus Performance- und Speicherplatzgründen " + "ist die Suche auf die ersten 10 Millionen Nachkommastellen beschränkt.") + +goldener_schnitt_suche = ("### phi(Goldener Schnitt) Nachkommastellensuche\n" + "Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle " + "auszugeben und das erst Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen von " + "phi (1.618033988749894848204586...) zu ermitteln. Aus Performance- und Speicherplatzgründen " + "ist die Suche auf die ersten 10 Millionen Nachkommastellen beschränkt.") + +anagramm_suche_de = ("### Anagrammsuche mit Wörterbuch DE\n" + "Diese Funktion benutzt eine deutsche Wörterbuchdatei vom Project " + "https://sourceforge.net/projects/germandict um zu überprüfen ob sich unter Verwendung __aller__ " + "eingegebenen Buchstaben Wörter bilden lassen, welche im Wörterbuch vorkommen.") + +anagramm_suche_en = ("### Anagrammsuche mit Wörterbuch EN\n" + "Diese Funktion benutzt die englische Wörterliste en_US-large.txt vom Project " + "https://sourceforge.net/projects/wordlist um zu überprüfen ob sich unter Verwendung aller " + "eingegebenen Buchstaben Wörter bilden lassen, welche im Wörterbuch vorkommen. Dieses Wörterbuch " + "kennt übrigens auch viele Wörter mit Apostroph wie z.B. say's.") + +wortsuche_de = ("### Wortsuche mit Wörterbuch DE\n" + "Wer kennt es nicht? Man sucht ein Wort mit einer bestimmten Anzahl an Buchstaben und weiß aber z.B. " + "nur den Anfangsbuchstaben und die letzten 3 Buchstaben. Hierbei soll diese Funktion helfen. " + "Unbekannte Buchstaben werden dabei einfach durch * ersetzt. Klein-/Großschreibung in der Eingabe " + "wird dabei ignoriert. \n" + "Beispiel: \n" + "Ge*ca**i** -> Geocaching \n" + "ge*ca**i** -> Geocaching \n" + "T*****dose -> Tupperdose, Tabaksdose" + "Diese Funktion nutzt dafür die deutsche Wörterbuchdatei vom Project " + "https://sourceforge.net/projects/germandict") + +wortsuche_en = ("### Wortsuche mit Wörterbuch EN\n" + "Wer kennt es nicht? Man sucht ein Wort mit einer bestimmten Anzahl an Buchstaben und weiß aber z.B. " + "nur den Anfangsbuchstaben und die letzten 3 Buchstaben. Hierbei soll diese Funktion helfen. " + "Unbekannte Buchstaben werden dabei einfach durch * ersetzt. Klein-/Großschreibung in der Eingabe " + "wird dabei ignoriert. \n" + "Beispiel: \n" + "Ge*ca**i** -> geocaching \n" + "ge*ca**i** -> geocaching \n" + "say*s -> say's (Die Wortliste kennt viele Wörter mit Apostroph) \n" + "coordinat** -> coordinator, coordinates, coordinated \n" + "Diese Funktion nutz dafür die englische Wörterliste en_US-large.txt vom Project " + "https://sourceforge.net/projects/wordlist") + +remorse_de = ("### RE-Morse DE\n" + "Es gibt ja so Leute, die finden es lustig einen Morsecode so aufzuschreiben, daß zwar Wort für Wort " + "getrennt wird, aber ansonsten einfach mal die Leerzeichen weggelassen werden. Bei genau solchen " + "fiesen Gemeinheiten hilft diese Funktion. Diese Funktion benutzt die deutsche Wörterbuchdatei vom " + "Project https://sourceforge.net/projects/germandict \n" + "Da eine Abfrage relativ lange dauert gibt es die Möglichkeit ein ca. 100 MB großes remorse-de.dic " + "generieren zu lassen, welches ab der nächsten Abfrage dann genutzt wird und wodurch dann nur noch " + "ca. 20% der Zeit pro Abfrage benötigt wird. Um die Erstellung zu starten muß das Wort GENERATE " + "(Großschreibung beachten!) ins Eingabefeld eingetragen werden und der Funktionsknopf betätigt " + "werden.") + +remorse_en = ("### RE-Morse EN\n" + "Es gibt ja so Leute, die finden es lustig einen Morsecode so aufzuschreiben, daß zwar Wort für Wort " + "getrennt wird, aber ansonsten einfach mal die Leerzeichen weggelassen werden. Bei genau solchen " + "fiesen Gemeinheiten hilft diese Funktion. Mit Hilfe der englischen Wörterliste en_US-large.txt vom " + "Project https://sourceforge.net/projects/wordlist wird überprüft, für welches Wort der eingegebene " + "Morsecode stehen könnte.") + +t9_de = ("### T9-DE\n" + "Diese Funktion benutzt die deutsche Wörterbuchdatei german.dic vom Project " + "https://sourceforge.net/projects/germandict ermittelt diese Funktion alle im Wörterbuch " + "enthaltenen Wörter die zu der eingegebenen T9-kodierten Ziffernfolge passen und gibt " + "diese aus. \n" + "Bsp. 56673462836 liefert das Wort Koordinaten \n" + "Da eine Abfrage relativ lange dauert gibt es die Möglichkeit ein spezielles t9-Wörterbuch " + "generieren zu lassen, welches ab der nächsten Abfrage dann genutzt wird und wodurch dann nur noch ca. " + "15% der Zeit pro Abfrage benötigt wird. Um die Erstellung des t9-de.dic zu starten muß das Wort " + "GENERATE (Großschreibung beachten!) ins Eingabefeld eingetragen werden und der Funktionsknopf " + "betätigt werden.") + +t9_en = ("### T9-EN\n" + "Mit Hilfe der englischen Wörterliste en_US-large.txt vom Project " + "https://sourceforge.net/projects/wordlist ermittelt diese Funktion alle im Wörterbuch " + "enthaltenen Wörter die zu der eingegebenen T9-kodierten Ziffernfolge passen und gibt diese aus. \n" + "Bsp. 26673462837 liefert das Wort coordinates") + +vigenere = ("### Vigenere-Chiffre\n" + "Die Eingabe eines Schlüsselwortes ist hier erforderlich!!! Die Vigenere-Chiffre baut auf dem Prinzip " + "der Cesar-Chiffre auf, wobei hier die Verschiebung jedes einzelnen Buchstaben durch die " + "Buchstabenwerte eines Schlüsselwortes definiert werden. Da der zu verschlüsselnde Text im " + "allgemeinen länger als das Schlüsselwort ist, wird das Schlüsselwort immer wieder wiederholt. " + "Ist der Schlüssel mindestens genauso lang wie der Klartext entspricht dies dann dem " + "One-Time-Pad-Chiffre. Der eingegebene Text wird hier mit dem eingegebenen Schlüsselwort kodiert und " + "dekodiert ausgegeben und zwar sowohl in der Variante, daß Sonderzeichen Schlüsselbuchstaben " + "verbrauchen als auch nicht.") + +wolseley = ("### Wolseley-Chiffre\n" + "Die Eingabe eines Schlüsselwortes ist hier erforderlich!!! Die Woseley-Chiffre arbeitet mit einem " + "Schlüsselwort über welches dann ein Codealphabet/Codequadrat gebildet wird mit welchem dann sowohl " + "kodiert als auch dekodiert wird. Angefangen wird dabei mit dem jeweils ersten Vorkommen eines " + "Buchstaben im Schlüsselwort und danach folgen die restlichen Buchstaben des Alphabets die nicht im " + "Schlüsselwort vorkommen. Da hier nur 25 Zeichen zur Verfügung stehen wird das J mit dem I " + "zusammengefasst und als I behandelt und dargestellt. Sonstige Zeichen die nicht im Codealphabet " + "vorhanden sind werden unverändert ausgegeben. \n \n" + "Codealpahbet mit Schlüsselwort: Teebaum \n" + "| | | | | | | | | | | | | | | | | | | | | | | | | |\n" + "|-|-|-|-|-|-|-|-|-|-|-|---|-|---|-|-|-|-|-|-|-|-|-|-|-|\n" + "|T|E|B|A|U|M|C|D|F|G|H|I/J|K|L |N|O|P|Q|R|S|V|W|X|Y|Z|\n" + "|Z|Y|X|W|V|S|R|Q|P|O|N|L |K|I/J|H|G|F|D|C|M|U|A|B|E|T|\n \n" + "Bei der Chiffrierung/Dechiffrierung wird im Text nun der erste Buchstabe mit dem letzten getauscht, " + "der 2. mit dem Vorletzten, usw. also aus T wird Z und umgekehrt,E<->Y, B<->X, A<->W usw.. nur ein " + "K bleibt ein K") + +atbash = ("### Atbash-Chiffre\n" + "Atbash ist eine einfache Ersetzungschiffre die für das hebräische Alphabet entwickelt wurde, welche " + "später auf das lateinische Alphabet übertragen wurde. Dabei wird dem normalen Alphabet ein " + "rückwärts gelesenes Alphabet gegenüber gestellt. A wird zu Z, B zu Y usw. Kodierung und Dekodierung " + "erfolgt über die selbe Funktion. \n \n" + "Codealpahbet: \n" + "| | | | | | | | | | | | | | | | | | | | | | | | | | |\n" + "|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|\n" + "|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|\n" + "|Z|Y|X|W|V|U|T|S|R|Q|P|O|N|M|L|K|J|I|H|G|F|E|D|C|B|A|") + +monoalphasubstitution = ("### Monoalphabetische Substitutions-Chiffre\n" + "Bei der monoalphabetischen Substitution wird jedem Buchstaben des Alphabets der Buchstabe " + "eines Schlüsselalphabets zugeordnet: \n" + "|Bsp.| |\n" + "|----|-|\n" + "|Klartextalphabet|ABCDEFGHIJKLMNOPQRSTUVWXYZ|\n" + "|Schlüsselalphabet|DSBJFALKNVPOQXYWCEGHIMRTUZ|\n \n" + "Spezialformen dieser Chiffre sind Atbash, Cesar, Rot13. Die Funktion hier arbeitet so, dass " + "entweder ein komplettes Schlüsselalphabet oder ein Schlüsselwort verwendet werden kann. Bei " + "Verwendung eines Schlüsselwortes, wird der Rest des Schlüsselalphabets automatisch " + "aufgefüllt. \n" + "Aus dem Schlüsselwort GutenMorgenLiebeSonne wird z. B. dann das Schlüsselalphabet: " + "GUTENMORLIBSACDFHJKPQVWXYZ \n" + "| | |\n" + "|-|-|\n" + "|Schlüsselwort|GutenMorgenLiebeSonne|\n" + "|Schlüsselalphabet|GUTENMORLIBSACDFHJKPQVWXYZ|") + +autokey = ("### Autokey-Chiffre\n" + "Die Autokey-Chiffre arbeitet nach dem selben Prinzip wie Vignere-Chiffre mit dem Unterschied, dass " + "hier am Ende des Schlüsselwortes nicht wieder und wieder das Schlüsselwort angehängt wird, sondern " + "der Klartext an das Schlüsselwort angehangen wird. Der eingegebene Text wird hier mit dem " + "eingegebenen Schlüsselwort kodiert und dekodiert ausgegeben.") + +polybios = ('Die 5x5 Polybios-Chiffre kodiert Buchstaben zu zweistelligen Zahlen dazu wird das Schlüsselalphabet ' + 'in ein 5x5-Quadrat eingetragen. Die Buchstaben werden dann sozusagen zu ihren entsprechenden ' + '"Koordinaten" kodiert. Im unten gezeigten Quadrat wird so aus A 11, aus B 12, aus Q 41, usw. Da in ' + 'ein 5x5 Quadrat nur 25 Buchstaben passen wird typischer Weise J und I zusammengefasst, (alternativ ' + 'auch U und V), sollen auch Ziffern kodiert werden wird mit einem 6x6-Quadrat gearbeitet, bei ' + 'welchem dann für das komplette Alphabet und die Ziffern 0-9 Platz ist. \n' + '| |1|2|3|4|5|\n' + '|-|-|-|-|-|-|\n' + '|1|A|B|C|D|E|\n' + '|2|F|G|H|I|K|\n' + '|3|L|M|N|O|P|\n' + '|4|Q|R|S|T|U|\n' + '|5|V|W|X|Y|Z|\n\n' + 'Kommt für die Chiffre ein Schlüsselwort zum Einsatz wird das Code-Quadrat so abgeändert das die ' + 'Buchstaben des Schlüsselwortes entsprechend ihres ersten Vorkommens Zeile für Zeile in das ' + 'Codequadrat eingetragen werden, der Rest wird mit den verbliebenen Buchstaben aufgefüllt. Zur ' + 'Information wird für jede Polybios-Variante auch noch einmal der verwendete Klartext und das ' + 'verwendete Passwort ausgegeben.') +polybios_encode = f"'### Polybios-Chiffre kodieren\n'{polybios}" +polybios_decode = f"'### Polybios-Chiffre dekodieren\n'{polybios}""" + +klopfcode = ('Der Klopfcode ist im Prinzip eine Polybios Chiffre mit einem festen ' + 'Schlüsselquadrat bei welchem nicht I und J sondern C und K zusammengefasst werden. \n' + 'siehe hier: \n' + '| |1|2|3|4|5|\n' + '|-|-|-|-|-|-|\n' + '|1|A|B|C|D|E|\n' + '|2|F|G|H|I|J|\n' + '|3|L|M|N|O|P|\n' + '|4|Q|R|S|T|U|\n' + '|5|V|W|X|Y|Z|') +klopfcode_encode = f"### Klopfcode kodieren\n{klopfcode}" +klopfcode_decode = f"### Klopfcode dekodieren\n{klopfcode}" + +maptiles_kachelkoordinaten = ('### Maptiles / Kachelkoordinaten\n' + 'Bei vielen Online-Kartendiensten wie Openstreetmap oder Google-Maps erfolgt die ' + 'Kartendarstellung über vorberechnete "Kachel"-Grafikdateien, welche ein ' + 'Adressierungssystem benötigen damit je nach Koordinate und Zoomstufe auch der richtige ' + 'Kartenausschnitt dargestellt wird und klar ist welche Kacheln daneben darzustellen ' + 'sind. \n' + 'Solche Kacheln sind typischer Weise PNG-Grafiken mit 256x256 oder 512x512 Pixeln und je ' + 'nach Zoomstufe ist eine unterschiedliche Anzahl solcher Kacheln/Tiles notwendig um die ' + 'ganze Welt abzubilden. Da je Zoomstufe sich die Anzahl der benötigten Kacheln ' + 'vervierfacht und damit auch die Datenmenge werden in der Praxis keine Zoomlevel über ' + '20 verwendet. \n' + 'Um die einzelnen Kacheln beim tilemap-Server abzufragen braucht man die Zoomstufe, ' + 'einen X- und einen Y-Wert wobei dies alles ganzzahlige Werte sind. Abgerufen vom ' + 'Tilemap-Server werden die Kacheln dann nach dem Muster: ' + '`http://servername/Zoom/X/Y.png` Den Fernsehturm mit Zoomstufe 18 findet man z.B. bei ' + 'Openstreetmap hier: https://tile.openstreetmap.org/18/140836/85970.png \n' + 'Die Funktion arbeitet hier auf die Art und Weise, dass man 2 durch ein Freizeichen ' + 'getrennte Zahlen eingibt. Handelt es sich bei den angegebenen Zahlen um "Kommazahlen" ' + 'welche allerdings mit Punkt anzugeben sind (Bsp: 52.520803 13.4088653 ) geht die ' + 'Funktion davon aus, daß es sich um Koordinaten in Dezimalgrad handelt und sofern es ' + 'gültige Koordinaten sind erfolgt eine Ausgabe der X und Y Werte für die Zoomstufen und ' + '1-25. (Positive Zahlen stehen für Nord und Ost, negative für Süd und West) Handelt es ' + 'sich bei den beiden Zahlen um Ganzzahlen wird davon ausgegangen, dass es sich um X und ' + 'Y Werte handelt und es werden für alle Zoomstufen von 1-25 Koordinaten in ' + 'Dezimalminuten und Dezimalgrad ausgegeben, sofern dies sinnvolle Koordinaten ergibt ' + 'und sie werden auf einer Karte angezeigt.') + +quadtree_koordinaten = ("### Quadtree-/Quadkeykoordinaten\n" + "Diese Koordinatenkodierung spielt in der alltäglichen Praxis eigentlich kaum noch ein Rolle, " + "außer scheinbar bei bing-maps und beim Geocaching. Sie dient ähnlich wie das Maptiles-System " + "dazu Grafikdateien für unterschiedliche Zoomstufen einer Karte zu adressieren. Die Länge der " + "Zahl entspricht hier zugleich auch dem Detailgrad bzw. der Zoomstufe. Es finden nur die " + "Zahlen 0,1,2 und 3 Verwendung, wobei die 0 den Nordwestlichen Quadranten, 1 den " + "Nordöstlichen, 2 SW und 3 SO. \nEin kleines Beispiel: 230 würde bedeuten es geht im " + "südwestlichen Quadranten (2) um den südöstlichen Quadranten(3) und in diesem wiederum um den " + "nordwestlichen Quadranten. Je länger also diese Zahlenreihe aus 0,1,2 und 3 wird um so " + "genauer wird ein bestimmter Ort angegeben. \nWeitere Infos gibt es unter folgendem Link zu " + "finden: https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system \n" + "Die Funktion ermittelt aus einer Quadtreekoordinate die Maptileskoordinaten und die " + "WGS84-Koordinaten und zeigt diese auf einer Karte an.") + +chronogramm = ('### Chronogramm/ römische Ziffern zählen\n' + 'Ein Chronogramm (oder Eteostichon) ist ein Satzteil, ein Satz, ein Sinnspruch oder eine Inschrift, ' + 'meist ein Vers in lateinischer Sprache, in dem diejenigen Buchstaben, die auch als römische ' + 'Zahlzeichen gelesen werden können (I, V, X, L, C, D, M), in ihrer Summe die Jahreszahl des ' + 'Ereignisses angeben, auf das sich der Text bezieht. Entscheidend ist allein die Summe der ' + 'Zahlenwertbuchstaben, die sonst bei römischen Zahlen übliche Subtraktion kleinerer Zahlenwerte von ' + 'folgenden größeren erfolgt nicht. Die Zahlbuchstaben sind meist hervorgehoben, etwa durch ' + 'Großschreibung oder Verdickung der Buchstaben bzw. durch farbliche Abhebung mittels Rötung oder ' + 'Vergoldung. \n' + 'Eine Besonderheit bilden Krypto(chrono)gramme, bei denen die Zahlbuchstaben nicht gekennzeichnet ' + 'sind und "verborgen" bleiben. Bei der einfachen Analyse werden hier die Buchstaben I(1), V(5), ' + 'X(10), L(50), C(100), D(500), M(1000) berücksichtigt und addiert, bei der erweiterten Analyse wird ' + 'zunächst einmal berücksichtigt, daß im Lateinischen Alphabet der Buchstabe J als I und der ' + 'Buchstabe U als V geschrieben wird. Außerdem erfolgt wird in der extremen Variante auch noch ' + 'W=10(V+V) und Y=2(I+I) berücksichtigt. \n' + 'Des Weiteren wird auch für jeden relevanten Buchstaben einzeln noch einmal die Anzahl und Summe' + ' angezeigt. Eine Unterscheidung zwischen Klein- und Großschreibung findet nicht statt.') + +zahlen_roemisch_arabisch_umwandeln = ("### Römische in Arabische Zahlen umwandeln und umgekehrt\n" + "Es werden römische Zahlen in arabische umgewandelt und umgekehrt, die Funktion " + "arbeitet dabei bei der Umwandlung von arabisch zu römisch mit Werten bis " + "maximal 500000. Es werden folgende Zeichen verwendet: I=1, V=5, X=10, L=50, " + "C=100, D=500, M=1000, \u2181=5000, \u2182=10000, \u2187=50000, \u2188=100000 \n" + "Etwas Vorsicht sollte bei einer Umwandlung von römischen in arabische Zahlen " + "geboten sein, wenn mit untypischen Schreibweisen gearbeitet wird bei welchen " + "mehr als ein Zeichen von dem nachfolgenden Zeichen abgezogen werden soll. Die " + "eigentlich inkorrekte Schreibweise IIX für die Zahl 8 wird hier die Zahl 10 als " + "Ergebnis haben (+1-1+10), dafür wird aber allerdings die ebenfalls falsche " + "Schreibweise IM genauso als 999 wie die korrekte Schreibweise CMXCIX erkannt.") + +url_decode = ("### URL-decode\n" + "Nachdem Groundspeak nun inzwischen sämtliche Bilddateien über einen Proxy umleitet bevor sie im " + "Listing erscheinen wird es manchmal schwer die ursprüngliche URL und/oder den Dateinamen des " + "Bildes noch lesen zu können. Die URL hat dort nun jeweils folgendes Muster: " + "`https://imgproxy.geocaching.com/......?url=.....` wobei nach dem `?url=` dann die ursprüngliche " + "Bild-URL folgt, allerdings wird dabei dann aus `http://` folgendes `http%3A%2F%2F` und um genau " + "dieses wieder normal lesbar zu machen dient diese Funktion") + +reversewig = ('### Reverse Wherigo zu Koordinaten\n' + 'Mit dem Reverse Wherigo hat -Waldmeister- eigentlich eine coole Sache erfunden. Man hat anfangs ' + 'keine Koordinaten sondern nur 3 Zahlen, welche man nach Start des Wherigo-Cartridges eingibt und ' + 'dann erfährt man wie weit der Cache entfernt ist. Nun kann man immer wieder von unterschiedlichen ' + 'Positionen aus diese Entfernungsfragen durchführen und sich damit dem Cache nähern. Je weniger ' + 'Abfragen man braucht umso besser. Leider gibt es inzwischen genügend Tools die genau wie diese ' + 'Funktion hier aus den 3 Zahlen direkt die Finalkoordinaten ermitteln können. \n' + ' Leider??? Ja leider denn das führt auch dazu, das es inzwischen so extrem viele dieser ' + 'Reverse-Wherigos gibt wo sich die Owner anscheinend auch denken "Die spielt doch sowieso keiner ' + 'mehr normal..." anders kann ich mir ganze Trails mit Reverse-Wherigos nicht erklären. Um die ' + 'Funktion zu nutzen braucht man nur die 3 Zahlen durch ein entsprechendes Trennzeichen: ' + '| , _ / ; , oder Leerzeichen eingeben und auf den Knopp klicken und bekommt Koordinaten.') + +base64_ascii = ('### Base64 <-> ASCII\n' + 'Base64 ist ein Kodierungsverfahren, welches dazu verwendet wird um beliebige Binärdaten nur Hilfe ' + 'einer Zeichenkette aus A-Z, a-z, 0-9, +, / sowie am Ende = übertragen zu können. Ein Einsatzzweck ' + 'dafür ist z.B. wenn bei EMails Dateianhänge verwendet werden, dort werden nahezu alle Dateiformate ' + 'base64-kodiert übertragen. Auch bei dem einem oder anderen Mystery sind mir solche kodierten ' + 'Zeichenketten schon begegnet. Wenn am Ende einer Zeichenkette ein oder zwei "="-Zeichen stehen ist ' + 'die Wahrscheinlichkeit recht groß, das hier base64 verwendet wurde. Das "="-Zeichen dient hier ' + 'nämlich als "Lückenfüller" am Ende. Die Funktion hier versucht zunächst eine Dekodierung ' + 'Base64->ASCII gelingt dies nicht, erscheint ein Hinweis und der eingegeben Text wird dann ' + 'Base64-kodiert ausgegeben.') + +jaegerzaun = ("Jägerzaun (auch Railfence oder ZigZag-Chiffre genannt) Bei dieser Chiffre wird kodiert, indem man " + "einen Text im Zickzackmuster in ein Feld aus z.B. 3 Zeilen und so vielen Spalten wie der Text lang " + "ist schreibt. Man beginnt in Spalte 1 - Zeile 1, dann geht es in Spalte 2 - Zeile 1 weiter danach " + "Spalte 3 - Zeile 3, dann Spalte 4 - Zeile 2, Spalte 5 - Zeile 1 usw. Danach werden die Buchstaben " + "einfach Zeile für Zeile hintereinander geschrieben. Unterschiedliche Varianten entstehen einfach " + "dadurch, dass man mit unterschiedlich vielen Zeilen arbeitet welche im Schlüsselfeld anzugeben " + "ist. \n" + "Die Funktion erzeugt hierbei einmal eine Ausgabe bei welcher auch Leerzeichen mitgeschrieben werden " + "und eine Ausgabe wo zuvor die Leerzeichen entfernt werden.") +jaegerzaun_encrypt = f"### encrypt Jägerzaun\n{jaegerzaun}" +jaegerzaun_decrypt = (f"### decrypt Jägerzaun\n{jaegerzaun} \n" + f"Wird im Schlüsselfeld keine Zahl angegeben erfolgt automatisch die Dekodierung für alle " + f"Zeilenanzahlen von 2-12.") + +adfgx = ('Die ADFGX-Chiffre arbeitet mit zwei Passwörtern, wobei jedes für je einen Kodierungsschritt ' + 'verwendet wird. Das erste wird benutzt um eine Variation der Polybios-Kodierung mit einem 5x5 ' + 'Quadrat und J=I durchzuführen bei welcher die Zahlen 1-5 durch die Buchstaben ADFGX ersetzt ' + 'werden. \n' + 'Mit dem Text "Ein Beispiel",dem Passwort "PASSWORT" und einem mit A->Z aufgefülltem Schlüsselquadrat: \n' + '| |A|D|F|G|X|\n' + '|-|-|-|-|-|-|\n' + '|A|P|A|S|W|O|\n' + '|D|R|T|B|C|D|\n' + '|F|E|F|G|H|I|\n' + '|G|K|L|M|N|Q|\n' + '|X|U|V|X|Y|Z| \n \n' + '... ergibt der erste Schritt z.B. die Zeichenfolge: "FA FX GG DF FA FX AF AA FX FA GD". ' + 'Nun kommt das zweite Passwort zum Einsatz als Beispiel hier:"Tester". Zunächst einmal wird die ' + 'alphabetische Reihenfolge des Passworts "Tester" benötigt -> 5 1 4 6 2 3 \n' + 'diese Zahlenreihe wird nun in die erste Zeile geschrieben und das Ergebnis aus Schritt 1 zeilenweise ' + 'darunter: \n' + '|5|1|4|6|2|3|\n' + '|-|-|-|-|-|-|\n' + '|F|A|F|X|G|G|\n' + '|D|F|F|A|F|X|\n' + '|A|F|A|A|F|X|\n' + '|F|A|G|D| | | \n \n' + '... nun eine Sortierung der Spalten... \n' + '|1|2|3|4|5|6|\n' + '|-|-|-|-|-|-|\n' + '|A|G|G|F|F|X|\n' + '|F|F|X|F|D|A|\n' + '|F|F|X|A|A|A|\n' + '|A| | |G|F|D| \n \n' + '... dies nun spaltenweise von oben nach unten ausgelesen und hintereinander geschrieben ergibt nun' + 'den kodierten Text. Typischer Weise erfolgt für eine bessere Lesbarkeit eine Gruppierung in ' + '5er-Blöcken: "AFFAG FFGXX FFAGF DAFXA AD" \n' + ' \n' + 'Ausgegeben werden zwei Varianten, welche sich nur dadurch unterscheiden wie das Schlüsselquadrat im ' + 'ersten Schritt aufgefüllt wird. Entweder in alphabetischer Reihenfolge A->Z oder umgekehrt Z->A.') +adfgx_kodieren = f"### HILFE: ADFGX kodieren\n{adfgx}" +adfgx_dekodieren = f"### HILFE: ADFGX dekodieren\n{adfgx}" + +adfgvx = (f'Die ADFGVX-Chiffre erweitert das 5x5-Schlüsselquadrat der ADFGX-Chiffre ersten Kodierungsschritt auf 6x6 ' + f'so, dass das komplette Alphabet und die Zahlen 0-9 verwendet werden können. \n' + f'Alles andere funktioniert wie bei ... \n \n__ADFGX:__ \n{adfgx}') +adfgvx_kodieren = f"### HILFE: ADFGVX kodieren\n{adfgvx}" +adfgvx_dekodieren = f"### HILFE: ADFGVX dekodieren\n{adfgvx}" diff --git a/app/tools.py b/app/tools.py index 1b67807..9cdb333 100644 --- a/app/tools.py +++ b/app/tools.py @@ -2,28 +2,16 @@ # Licensed under the MIT License. See LICENSE file in the project root. from itertools import chain # für primfaktoren zerlegung import helper +import hilfetexte import pandas as pd from urllib.parse import unquote as urllib_parse_unquote # für nak-nak import binascii # für base64_ascii -def funktion_mit_karte(text,param): - """Verarbeitet Text und liefert Daten für eine Karte (z.B. Potsdam Zentrum).""" - # Beispiel: Fester Punkt (Potsdam) - daten = pd.DataFrame({'lat': [52.4006], 'lon': [13.0590]}) - ausgabe_text = f"Folgende Koordinate wurde gefunden: {daten.iloc[0].lat}, {daten.iloc[0].lon}" - ausgabe_text += f' \n text: {text} \n parameter: {param}\n' - return ausgabe_text, daten - def cesar_all(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Cesar-Verschiebe-Chiffre\n" - "Von der eingegebenen Zeichenkette werden, " - "alle möglichen Verschiebungen gemäß der " - "Cesarchiffre generiert und ausgegeben. " - "Sonderzeichen und Zahlen werden unverändert " - "wiedergegeben.") + return hilfetexte.cesar_all else: abcgross = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" abcklein = "abcdefghijklmnopqrstuvwxyz" @@ -50,16 +38,7 @@ def cesar_all(eingabetext): def buchstabenwortwert(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Buchstabenwortwerte ermitteln\n" - "Diese Funktion berechnet den Buchstabenwert " - "der eingegeben Zeichenkette. (A=1 B=2 .... " - "Ä=27 Ö=28 Ü=29 ß=30) Bei mehreren durch " - "Leerzeichen getrennten Wörtern wird auch " - "für jedes einzelne Wort der Wortwert errechnet. " - "Desweiteren wird die Quersumme und die iterierte " - "Quersumme des Gesamtbuchstabenwertes als auch für " - "jedes Wort das Buchstabenwertprodukt und das " - "Gesamtbuchstabenwertprodukt ermittelt.") + return hilfetexte.buchstabenwortwert else: ausgabe = "" bw = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 10, 'K': 11, 'L': 12, @@ -132,12 +111,7 @@ def buchstabenwert_zu_text(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Buchstabenwerte zu Text\n" - " Die eingegebenen Buchstabenwerte werden in die entsprechenden Buchstaben umgewandelt." - " (A=1 B=2 .... Ä=27 Ö=28 Ü=29 ß=30) Als Trennungszeichen zwischen den Zahlen sind folgende" - " Zeichen erlaubt: | , _ . - / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten" - " möglichst nur 1 Leerzeichen zwischen den Zahlen verwendet werden (überzählige Leerzeichen" - " werden sonst als nicht erkannte Zeichen behandelt).") + return hilfetexte.buchstabenwert_zu_text else: se = "" for s in seperator: @@ -180,17 +154,14 @@ def buchstabenwert_zu_text(eingabetext): def zeichenkette_reverse(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Zeichenkette rückwärts\n" - "Diese Funktion gibt die eingegebene Zeichenkette von hinten nach vorn gelesen aus.") + return hilfetexte.zeichenkette_reverse else: return eingabetext[::-1] def zeichenanzahl(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Zeichenzählen\n" - "Es wird das Vorkommen jedes einzelnen Zeichens gezählt und ausgegeben. Achtung! Leerzeichen," - " Tabulatorzeichen und Zeilenumbrüche werden nur vor dem letzten sichtbaren Zeichen gezählt!!!") + return hilfetexte.zeichenanzahl else: ausgabetext = "" anzahl = {} @@ -220,11 +191,7 @@ def quersummen(eingabetext): seperator = ("|,", "_", ".", "-", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Quersumme(n)\n" - " Von den eingegebenen Zahlen werden die Quersummen und iterierten Quersummen errechnet und ausgegeben." - " Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und" - " Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den Zahlen" - " verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + return hilfetexte.quersummen else: se = "" for s in seperator: @@ -265,11 +232,7 @@ def quersummen(eingabetext): def einschluss_count(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Einschlüsse zählen\n" - "Es werden die Einschlüsse in Buchstaben und Ziffern gezählt. Neben der Anzahl der Einschlüsse für" - " jeden einzelnen Buchstaben, für jedes Wort und die gesammte Eingabe ermittelt. Da es sich bei der" - " Zahl 4 je nach Schreibweise um eine Zahl mit oder ohne Einschluß handeln kann, werden beide Varianten" - "berücksichtigt. !!! Hier ist Klein- und Großschreibung wichtig, denn z.B. b=1 aber B=2 !!!") + return hilfetexte.einschluss_count else: bw = "ADOPQRabdegopq690" wortsummenliste_ohne = [] @@ -318,10 +281,7 @@ def morse_to_abc(eingabetext): } eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Morsecode zu Text\n" - "Die Eingabe des Morsecodes hat wie folgt zu erfolgen: - für lang und . für kurz, zwischen den " - "Buchstaben ein Leerzeichen und als Worttrennung ein / wobei davor und danach ein Leerzeichen steht. " - "Für unbekannte Morsecodes erscheint in der Ausgabe ein #.") + return hilfetexte.morse_to_abc else: morse = eingabetext.split() atxt = "" @@ -349,9 +309,7 @@ def abc_to_morse(eingabetext): umkehr_alpha = {v: k for k, v in alphabet.items()} # Alphabet mit getauschten key und values generieren eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Text zu Morsecode\n" - "Eingabetext wird als Morsecode ausgegeben. Nicht kodierbare Zeichen erscheinen unverändert " - "in der Ausgabe.") + return hilfetexte.abc_to_morse else: atxt = "" for b in eingabetext: @@ -367,11 +325,7 @@ def rot5(eingabetext): ro5 = {"0": "5", "1": "6", "2": "7", "3": "8", "4": "9", "5": "0", "6": "1", "7": "2", "8": "3", "9": "4"} eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### ROT 5\n" - "ROT 5 bezeichnet eine Verschiebechiffrierung, bei welcher die Ziffern 0-9 um je 5 Stellen " - "verschoben werden. Aus 0 wird 5, aus 1 wird 6, aus 7 wird 2,usw. Kodieren und Dekodieren " - "geschieht hier mit ein und derselben Funktion, alle Zeichen die keine Ziffern sind werden " - "unverändert wiedergegeben.") + return hilfetexte.rot5 else: atxt = "" for z in eingabetext: @@ -388,12 +342,7 @@ def rot13(eingabetext): 'X': 'K', 'Y': 'L', 'Z': 'M'} eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### ROT 13\n" - "ROT 13 bezeichnet eine Verschiebechiffrierung, bei welcher die 26 Buchstaben (A-Z) um genau " - "13 Stellen verschoben werden. Da dies genau die Hälfte des Alphabets ist, wird z.B. aus einem " - "A ein N und aus einem N ein A und somit wird über die selbe Funktion sowohl kodiert als auch " - "dekodiert. Die Klein- und Großschreibung bleibt erhalten und alle Zeichen die keine Buchstaben " - "sind werden unverändert wiedergegeben.") + return hilfetexte.rot13 else: atxt = "" for z in eingabetext: @@ -414,11 +363,7 @@ def rot18(eingabetext): "0": "5", "1": "6", "2": "7", "3": "8", "4": "9", "5": "0", "6": "1", "7": "2", "8": "3", "9": "4"} eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### ROT 18\n" - "ROT 18 ist eigentlich nix anderes als, daß hier ROT 5 mit ROT 13 kombiniert wird. Die Buchstaben " - "A-Z werden um 13 Stellen verschoben und die Ziffern 0-9 um 5 Stellen. Alle sonstigen Zeichen " - "bleiben unverändert und die Klein- oder Großschreibung bleibt auch erhalten, und auch hier " - "kodiert/dekodiert ein und dieselbe Funktion.") + return hilfetexte.rot18 else: atxt = "" for z in eingabetext: @@ -434,12 +379,7 @@ def rot18(eingabetext): def rot47(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### ROT 47\n" - "Bei ROT47 geschieht eigentlich nix anderes als bei ROT5 oder ROT13 nur das hier die druckbaren " - "ASCII-Zeichen mit den Werten 33-126(dezimal) zur Auswahl stehen, also nahezu alle Zeichen die auf " - "eine Standardtastatur aufgedruckt sind. Das Ergebnis ist aber deutlich unlesbarer als z.B. bei " - "ROT13. Alle weiteren Zeichen (z.B. ÄÖÜß) werden unverändert wiedergegeben und auch hier " - "kodiert/dekodiert ein und dieselbe Funktion.") + return hilfetexte.rot47 else: x = [] for i in eingabetext: @@ -453,8 +393,7 @@ def rot47(eingabetext): def ascii_to_dez(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Text zu Dezimalzahlen\n" - "Der eingegebene Text wird in Dezimalzahlen umgewandelt.") + return hilfetexte.ascii_to_dez else: z = [] for i in eingabetext: @@ -465,11 +404,7 @@ def dez_to_ascii(eingabetext): seperator = ("|,", "_", ".", "-", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Dezimalzahlen zu Text\n" - "Die eingegebenen Dezimalzahlen werden in die entsprechenden UNICODE-Zeichen umgewandelt. Als " - "Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und Leerzeichen. " - "Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den Zahlen verwendet " - "werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + return hilfetexte.dez_to_ascii else: se = "" for s in seperator: @@ -506,8 +441,7 @@ def dez_to_ascii(eingabetext): def ascii_to_hex(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Text zu Hexadezimalzahlen\n" - "Der eingegebene Text wird in Hexadezimalzahlen umgewandelt.") + return hilfetexte.ascii_to_hex else: z = [] for i in eingabetext: @@ -519,11 +453,7 @@ def hex_to_ascii(eingabetext): seperator = ("|,", "_", ".", "-", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Hexadezimalzahlen zu Text\n" - "Die eingegebenen Hexadezimalzahlen werden in die entsprechenden UNICODE-Zeichen umgewandelt. " - "Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und " - "Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den " - "Zahlen verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + return hilfetexte.hex_to_ascii else: se = "" for s in seperator: @@ -560,8 +490,7 @@ def hex_to_ascii(eingabetext): def ascii_to_octal(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Text zu Octalzahlen\n" - "Der eingegebene Text wird in Octalzahlen umgewandelt.") + return hilfetexte.ascii_to_octal else: z = [] for i in eingabetext: @@ -572,11 +501,7 @@ def octal_to_ascii(eingabetext): seperator = ("|,", "_", ".", "-", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Octalzahlen zu Text\n" - "Die eingegebenen Octalzahlen werden in die entsprechenden UNICODE-Zeichen umgewandelt. Als " - "Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und Leerzeichen. " - "Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den Zahlen verwendet " - "werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + return hilfetexte.octal_to_ascii else: se = "" for s in seperator: @@ -613,9 +538,7 @@ def octal_to_ascii(eingabetext): def ascii_to_bin16(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Text zu Binärzahlen\n" - "Der eingegebene Text wird in Binärzahlen mit einer festgelegten Breite von 16bit (16 Zeichen) " - "umgewandelt.") + return hilfetexte.ascii_to_bin16 else: z = [] for i in eingabetext: @@ -625,9 +548,7 @@ def ascii_to_bin16(eingabetext): def ascii_to_bin8(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Text zu Binärzahlen\n" - "Der eingegebene Text wird in Binärzahlen mit einer festgelegten Breite von 8bit (8 Zeichen) " - "umgewandelt.") + return hilfetexte.ascii_to_bin8 else: z = [] for i in eingabetext: @@ -641,11 +562,7 @@ def bin_to_ascii(eingabetext): seperator = ("|,", "_", ".", "-", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Binärzahlen zu Text\n" - "Die eingegebenen Binärzahlen werden in die entsprechenden UNICODE-Zeichen umgewandelt. Als " - "Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: | , _ . - / ; , und " - "Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den Zahlen " - "verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + return hilfetexte.bin_to_ascii else: se = "" for s in seperator: @@ -682,10 +599,7 @@ def bin_to_ascii(eingabetext): def zahlwortsuche_de(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Zahlwortsuche DE 0-12\n" - "Diese Funktion versucht deutsche Zahlworte zwischen 0 und 12 in einem Text aufzuspüren. Da alle " - "Zeichen ignoriert werden, welche keine Buchstaben sind, werden auch Zahlwörter gefunden welche sich " - "z.B. über zwei Worte verteilen.") + return hilfetexte.zahlwortsuche_de else: zahlen = ["null", "eins", "zwei", "drei", "vier", "fünf", "fuenf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zwölf", "zwoelf", "zwanzig", "hundert", "tausend"] @@ -721,10 +635,7 @@ def zahlwortsuche_de(eingabetext): def zahlwortsuche_en(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Zahlwortsuche EN 0-15\n" - "Diese Funktion versucht englische Zahlworte zwischen 0 und 15 in einem Text aufzuspüren. " - "Da alle Zeichen ignoriert werden, welche keine Buchstaben sind, werden auch Zahlwörter gefunden " - "welche sich z.B. über zwei Worte verteilen.") + return hilfetexte.zahlwortsuche_en else: zahlen = ["eleven", "twelve", "thirteen", "fourteen", "fifteen", "fourty", "sixty", "seventy", "eighty", "ninety", "zero", "one", "two", "three", "four", "five", "six", "seven", @@ -773,10 +684,7 @@ def kenny_kodieren(eingabetext): } eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Kennyspeak kodieren\n" - "Hilfe sie haben Kenny getötet.. ach nee er kann ja noch seine unverständlichen m p f -Laute von " - "sich geben und hier geht es darum normalen Text in genau diese Laute umzusetzen, wo jedem Buchstaben " - "A-Z eine 3 Zeichen-Kombination zugeordnet ist die sich aus m,p,f zusammensetzt.(a=mmm h=mfp x=fpf)") + return hilfetexte.kenny_kodieren else: atxt = "" for b in eingabetext: @@ -789,9 +697,7 @@ def kenny_kodieren(eingabetext): def kenny_dekodieren(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Kennyspeak dekodieren\n" - "Wie? Du verstehst Kenny's mpf-Gebrabbel nicht? Na gut da kann ich helfen!! Nicht kennifiziertes " - "wird unverändert ausgegeben.") + return hilfetexte.kenny_dekodieren else: return helper.unkennify(eingabetext) @@ -803,12 +709,7 @@ def kenny_raten(eingabetext): } eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### KENNYspeak raten\n" - "Diese Funktion dient zum dekodieren von kennyfizierten Texten, bei denen die 3 Buchstaben mpf " - "vertauscht oder durch andere Zeichen ersetzt wurden. Hierzu werden vor der Dekodierung die 3 " - "häufigsten Zeichen im Text ermittelt und alle anderen Zeichen entfernt bevor die 6 möglichen " - "Lösungen ausgegeben werden. (Falls zum kodieren die Zahlen 0,1 oder 2 verwendet wurden, werden " - "sie durch Buchstaben a,b,c.. ersetzt)") + return hilfetexte.kenny_raten else: wtxt = eingabetext.replace(chr(9),"").replace(chr(32),"").replace(chr(10),"").lower() # erstmal leerzeichen, tab, linefeed raus und alles klein @@ -856,10 +757,7 @@ def kenny_raten(eingabetext): def primzahlalphabet_dekodieren(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Primzahlalphabet dekodieren\n" - "Hier können Primzahlen kleiner als 1 Million in Buchstaben umgewandelt werden. Es wird dabei davon " - "ausgegangen, daß den Primzahlen wiederholend die Buchstaben A-Z zugeordnet werden,2=A 3=B 5=C 7=D " - "11=E ... 97=Y 101=Z 103=A 107=B ... usw.") + return hilfetexte.primzahlalphabet_dekodieren else: grenze = 1000000 primes = helper.primzahlliste(grenze) @@ -912,10 +810,7 @@ def primzahlalphabet_dekodieren(eingabetext): def primzahlpruefen(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Primzahl prüfen\n" - "Für eine eingegebene Zahl wird überprüft, ob es sich um eine Primzahl handelt. Ist die eingegebene " - "Zahl eine Primzahl wird auch informiert, die wievielte Primzahl es ist. Zahlen über 1,299,709 (der " - "100,000. Primzahl) werden abgelehnt.") + return hilfetexte.primzahlpruefen else: try: ausz = int(eingabetext) @@ -934,9 +829,7 @@ def primzahlpruefen(eingabetext): def nte_primzahl(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### n.te Primzahl\n" - "Du willst wissen wie z.B. die 1,000. Primzahl lautet, dann bist du hier genau richtig. Die Funktion " - "liefert maximal die 100,000. Primzahl.") + return hilfetexte.nte_primzahl else: try: ausz = int(eingabetext) @@ -951,11 +844,7 @@ def nte_primzahl(eingabetext): def primfaktoren(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Primfaktorenzerlegung\n" - "Für die eingegebene Zahl werden die Primfaktoren ermittelt und ausgegeben. Sollte die Zahl einen " - "Primfaktoren haben, welcher größer als 100 Millionen ist, wird die Suche abgebrochen, da die Suche " - "sonst zu lange dauert. Die Funktion läßt sich damit also auch, bei Zahlen kleiner als 200 Millionen, " - "dazu benutzen um festzustellen, ob die eingegebene Zahl eine Primzahl ist.") + return hilfetexte.primfaktoren else: try: n = int(eingabetext) @@ -983,12 +872,7 @@ def dez_to_hex_oct_bin(eingabetext): seperator = ("|,", "_", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Dezimal zu HEX, Octal, Binär\n" - "Die eingegebenen dezimalen Ganzzahlen werden in die entsprechenden hexadezimalen, octalen und " - "binären Zahlen umgerechnet. Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: " - "| , _ / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen " - "zwischen den Zahlen verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte " - "Zeichen behandelt).") + return hilfetexte.dez_to_hex_oct_bin else: se = "" for s in seperator: @@ -1029,12 +913,7 @@ def hex_to_dez_oct_bin(eingabetext): seperator = ("|,", "_", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Hexadezimal zu Dezimal, Octal, Binär\n" - "Die eingegebenen hexadezimalen Zahlen werden in die entsprechenden dezimalen, octalen und binären " - "Zahlen umgerechnet. Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: " - "| , _ / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen " - "zwischen den Zahlen verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte " - "Zeichen behandelt).") + return hilfetexte.hex_to_dez_oct_bin else: se = "" for s in seperator: @@ -1075,12 +954,7 @@ def oct_to_hex_dez_bin(eingabetext): seperator = ("|,", "_", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Octal zu HEX, Dezimal, Binär\n" - "Die eingegebenen octalen Zahlen werden in die entsprechenden hexadezimalen, dezimalen und binären " - "Zahlen umgerechnet. Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: " - "| , _ / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen " - "zwischen den Zahlen verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte " - "Zeichen behandelt).") + return hilfetexte.oct_to_hex_dez_bin else: se = "" for s in seperator: @@ -1121,12 +995,7 @@ def bin_to_hex_dez_oct(eingabetext): seperator = ("|,", "_", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Binär zu HEX, Dezimal, Octal\n" - "Die eingegebenen binären Zahlen werden in die entsprechenden hexadezimalen, dezimalen und octalen " - "Zahlen umgerechnet. Als Trennungszeichen zwischen den Zahlen sind folgende Zeichen erlaubt: " - "| , _ / ; , und Leerzeichen. Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen " - "zwischen den Zahlen verwendet werden (überzählige Leerzeichen werden sonst als nicht erkannte " - "Zeichen behandelt).") + return hilfetexte.bin_to_hex_dez_oct else: se = "" for s in seperator: @@ -1171,10 +1040,7 @@ def abc_to_tomtom(eingabetext): "x": "\\\\\\\\// ", "y": "\\\\/\\\\/ ", "z": "/\\\\/\\\\ " } # schräg aber wir brauchen zum kodieren doppel-doppelte backslashs damit die Ausgabe im Browser passt if eingabetext == "": - return ("### Text zu Tomtom\n" - "Beim Tomtom Code werden die einzelnen Buchstaben durch Kombinationen von / und \\ dargestellt. " - "Zwischen den einzelnen Buchstaben steht ein Leerzeichen zwischen Worten zwei Leerzeichen. Kodiert " - "werden, können nur die Buchstaben A-Z.") + return hilfetexte.abc_to_tomtom else: ausgabetext = "" atxt = "" @@ -1203,10 +1069,7 @@ def tomtom_to_abc(eingabetext): } # schräg aber wir brauchen zum kodieren doppel-doppelte backslashs damit die Ausgabe im Browser passt eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Tomtom zu Text\n" - "Beim Tomtom Code werden die einzelnen Buchstaben durch Kombinationen von / und \\ dargestellt. " - "Zwischen den einzelnen Buchstaben steht ein Leerzeichen zwischen Worten zwei Leerzeichen. Kodiert " - "werden, können nur die Buchstaben A-Z.") + return hilfetexte.tomtom_to_abc else: tomtom = eingabetext.replace(" ", " _ ") tomtom = tomtom.split() @@ -1229,9 +1092,7 @@ def text_to_slashpipe(eingabetext): } # jweils doppelte backslashs da python sonst versucht Escapecodes draus zu machen \\ = \ eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Text zu Slash and Pipe\nVergleichbar mit dem Tomtom-Code nur das hier für die Buchstabenkodierung " - "auch | eingesetzt wird. Zwischen den einzelnen Buchstaben steht ein Leerzeichen zwischen Worten zwei " - "Leerzeichen. Kodiert werden, können nur die Buchstaben A-Z.") + return hilfetexte.text_to_slashpipe else: ausgabetext = "" atxt = "" @@ -1258,9 +1119,7 @@ def slashpipe_to_text(eingabetext): # jeweils doppelte backslashs da python sonst versucht Escapecodes draus zu machen \\ = \ eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Slash and Pipe zu Text\nVergleichbar mit dem Tomtom-Code nur das hier für die Buchstabenkodierung " - "auch der | mit eingesetzt wird. Zwischen den einzelnen Buchstaben steht ein Leerzeichen zwischen " - "Worten zwei Leerzeichen. Dekodiert werden, können nur die Buchstaben A-Z.") + return hilfetexte.slashpipe_to_text else: tomtom = eingabetext.replace(" ", " _ ") tomtom = tomtom.split() @@ -1293,14 +1152,7 @@ def periodensystem(eingabetext): um_pse = {v: k for k, v in pse.items()} eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Periodensystem: Ordnungszahl<->Symbol\n" - "Eingegebenen Ordnungszahlen 1-118 aus dem Periodensystem der Elemente werden in die ihnen zugehörigen " - "Elementsymbole umgewandelt und anschließend als Text ausgegeben, außerdem erscheint noch eine Ausgabe " - "bei welcher nur die Anfangsbuchstaben der Symbole ausgegeben werden. Werden in der Eingabe Symbole " - "(z.B. N, He) erkannt werde diese zusammen mit ihren Ordnungszahlen ausgegeben. Als Trennungszeichen " - "zwischen den Zahlen und/oder Symbolen sind folgende Zeichen erlaubt: | , _ . - / ; , und Leerzeichen. " - "Bei Verwendung von Leerzeichen sollten möglichst nur 1 Leerzeichen zwischen den Zahlen verwendet " - "werden (überzählige Leerzeichen werden sonst als nicht erkannte Zeichen behandelt).") + return hilfetexte.periodensystem else: se = "" for s in seperator: @@ -1355,14 +1207,7 @@ def naknak_to_text(eingabetext): "naknaknak": "F", "nak?": "5"} eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### NakNak to Text\n" - "Nak-Nak / Entensprache / Duck Speak ist eine Spaßsprache, welche vom Owner der Website " - "[https://schnatterente.net](https://web.archive.org/web/20230807065421/https://www.schnatterente.net/)" - " entwickelt wurde. Diese Funktion übersetzt das Geschnatter in verständliche Buchstaben/Zeichen. " - "!!Bitte unbedingt die Groß- und Kleinschreibung beibehalten!! Wer diesen Quatsch unbedingt umgekehrt " - "übersetzten will, wird wohl etwas suchen müssen, da der Original-Übersetzer, der unter " - "http://uebersetzer.schnatterente.net erreichbar war, nicht mehr online ist und ich ganz bestimmt " - "keinen hier integrieren werde.") + return hilfetexte.naknak_to_text else: txt = eingabetext.split() utxt = "" @@ -1392,17 +1237,7 @@ def navajo_to_text(eingabetext): "BESH-DO-TLIZ": "Z", "BESH-DO-GLIZ": "Z", "BE-TKAH": " "} eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Navajo-ABC to Text\n" - "Die Sprache der Navajo-Indianer wurde im zweiten Weltkrieg für den verschlüßelten Funkverkehr " - "eingesetzt. Vorteile waren, daß nahezu niemand außer Navajo-Volk die Sprache verstand und es keine " - "schriftlichen Aufzeichnungen über die Sprache gab. Das Alphabet und die Codewörter wurden dabei von " - "den Codesprechern (natürlich Navajo's) auswendig gelernt. Die Dekodierfunktion hier übersetzt das " - "Codealphabet (A-Z), bei welchem es auch so ist, daß unterschiedliche Worte für den selben Buchstaben " - "stehen, in normalen Text. Leider existieren leicht unterschiedliche Alphabete was die Wörter bzw. " - "deren Schreibweise angeht im Netz, mit welchen codiert wird, weshalb ich hier nur die Dekodierung " - "anbiete. weitere Codewörter und Erklärungen gibt es z.B. hier: " - "https://ww2db.com/other.php?other_id=29 oder hier: " - "http://math.ucsd.edu/~crypto/Projects/RobertoSandoval/NavajoWindtalkers.pdf") + return hilfetexte.navajo_to_text else: txt = eingabetext.split() atxt = "" @@ -1415,11 +1250,7 @@ def navajo_to_text(eingabetext): def pi_suche(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### PI Nachkommastellensuche\n" - "Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle auszugeben " - "und das erst Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen von PI " - "(3.141592653589793238462643...) zu ermitteln. Aus Performance- und Speicherplatzgründen ist die Suche " - "auf die ersten 10 Millionen Nachkommastellen beschränkt.") + return hilfetexte.pi_suche else: try: piread = open("./data/pi.txt", "r") @@ -1454,11 +1285,7 @@ def pi_suche(eingabetext): def euler_suche(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Eulersche Zahl - Nachkommastellensuche\n" - "Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle auszugeben " - "und das erst Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen von e " - "(2.71828182845904523.....) zu ermitteln. Aus Performance- und Speicherplatzgründen " - "ist die Suche auf die ersten 10 Millionen Nachkommastellen beschränkt.") + return hilfetexte.euler_suche else: try: eread = open("./data/e.txt", "r") @@ -1493,11 +1320,7 @@ def euler_suche(eingabetext): def goldener_schnitt_suche(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### phi(Goldener Schnitt) Nachkommastellensuche\n" - "Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle auszugeben " - "und das erst Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen von phi " - "(1.618033988749894848204586...) zu ermitteln. Aus Performance- und Speicherplatzgründen ist die " - "Suche auf die ersten 10 Millionen Nachkommastellen beschränkt.") + return hilfetexte.goldener_schnitt_suche else: try: phiread = open("./data/phi.txt", "r") @@ -1532,10 +1355,7 @@ def goldener_schnitt_suche(eingabetext): def anagramm_suche_de(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Anagrammsuche mit Wörterbuch DE\n" - "Diese Funktion benutzt eine deutsche Wörterbuchdatei vom Project " - "https://sourceforge.net/projects/germandict um zu überprüfen ob sich unter Verwendung __aller__ " - "eingegebenen Buchstaben Wörter bilden lassen, welche im Wörterbuch vorkommen.") + return hilfetexte.anagramm_suche_de else: try: wbfile = open("./data/german.dic", "r", @@ -1559,11 +1379,7 @@ def anagramm_suche_de(eingabetext): def anagramm_suche_en(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Anagrammsuche mit Wörterbuch EN\n" - "Diese Funktion benutzt die englische Wörterliste en_US-large.txt vom Project " - "https://sourceforge.net/projects/wordlist um zu überprüfen ob sich unter Verwendung aller " - "eingegebenen Buchstaben Wörter bilden lassen, welche im Wörterbuch vorkommen. Dieses Wörterbuch " - "kennt übrigens auch viele Wörter mit Apostroph wie z.B. say's.") + return hilfetexte.anagramm_suche_en else: try: wbfile = open("./data/en_US-large.txt", "r", encoding="UTF-8") @@ -1586,17 +1402,7 @@ def anagramm_suche_en(eingabetext): def wortsuche_de(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Wortsuche mit Wörterbuch DE\n" - "Wer kennt es nicht? Man sucht ein Wort mit einer bestimmten Anzahl an Buchstaben und weiß aber z.B. " - "nur den Anfangsbuchstaben und die letzten 3 Buchstaben. Hierbei soll diese Funktion helfen. " - "Unbekannte Buchstaben werden dabei einfach durch * ersetzt. Klein-/Großschreibung in der Eingabe " - "wird dabei ignoriert. \n" - "Beispiel: \n" - "Ge*ca**i** -> Geocaching \n" - "ge*ca**i** -> Geocaching \n" - "T*****dose -> Tupperdose, Tabaksdose" - "Diese Funktion nutzt dafür die deutsche Wörterbuchdatei vom Project " - "https://sourceforge.net/projects/germandict") + return hilfetexte.wortsuche_de else: try: wbfile = open("./data/german.dic", "r", encoding="iso-8859-15") @@ -1622,18 +1428,7 @@ def wortsuche_de(eingabetext): def wortsuche_en(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### Wortsuche mit Wörterbuch EN\n" - "Wer kennt es nicht? Man sucht ein Wort mit einer bestimmten Anzahl an Buchstaben und weiß aber z.B. " - "nur den Anfangsbuchstaben und die letzten 3 Buchstaben. Hierbei soll diese Funktion helfen. " - "Unbekannte Buchstaben werden dabei einfach durch * ersetzt. Klein-/Großschreibung in der Eingabe " - "wird dabei ignoriert. \n" - "Beispiel: \n" - "Ge*ca**i** -> geocaching \n" - "ge*ca**i** -> geocaching \n" - "say*s -> say's (Die Wortliste kennt viele Wörter mit Apostroph) \n" - "coordinat** -> coordinator, coordinates, coordinated \n" - "Diese Funktion nutz dafür die englische Wörterliste en_US-large.txt vom Project " - "https://sourceforge.net/projects/wordlist") + return hilfetexte.wortsuche_en else: try: wbfile = open("./data/en_US-large.txt", "r", encoding="UTF-8") @@ -1659,16 +1454,7 @@ def wortsuche_en(eingabetext): def remorse_de(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### RE-Morse DE\n" - "Es gibt ja so Leute, die finden es lustig einen Morsecode so aufzuschreiben, daß zwar Wort für Wort " - "getrennt wird, aber ansonsten einfach mal die Leerzeichen weggelassen werden. Bei genau solchen " - "fiesen Gemeinheiten hilft diese Funktion. Diese Funktion benutzt die deutsche Wörterbuchdatei vom " - "Project https://sourceforge.net/projects/germandict \n" - "Da eine Abfrage relativ lange dauert gibt es die Möglichkeit ein ca. 100 MB großes remorse-de.dic " - "generieren zu lassen, welches ab der nächsten Abfrage dann genutzt wird und wodurch dann nur noch " - "ca. 20% der Zeit pro Abfrage benötigt wird. Um die Erstellung zu starten muß das Wort GENERATE " - "(Großschreibung beachten!) ins Eingabefeld eingetragen werden und der Funktionsknopf betätigt " - "werden.") + return hilfetexte.remorse_de else: try: wbfile = open("./data/morse-de.dic", "r", @@ -1714,12 +1500,7 @@ def remorse_en(eingabetext): ualphabet["...--.."] = "ß" eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### RE-Morse EN\n" - "Es gibt ja so Leute, die finden es lustig einen Morsecode so aufzuschreiben, daß zwar Wort für Wort " - "getrennt wird, aber ansonsten einfach mal die Leerzeichen weggelassen werden. Bei genau solchen " - "fiesen Gemeinheiten hilft diese Funktion. Mit Hilfe der englischen Wörterliste en_US-large.txt vom " - "Project https://sourceforge.net/projects/wordlist wird überprüft, für welches Wort der eingegebene " - "Morsecode stehen könnte.") + return hilfetexte.remorse_en else: try: wbfile = open("./data/en_US-large.txt", "r", encoding="UTF-8") @@ -1745,17 +1526,7 @@ def remorse_en(eingabetext): def t9_de(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### T9-DE\n" - "Diese Funktion benutzt die deutsche Wörterbuchdatei german.dic vom Project " - "https://sourceforge.net/projects/germandict ermittelt diese Funktion alle im Wörterbuch " - "enthaltenen Wörter die zu der eingegebenen T9-kodierten Ziffernfolge passen und gibt " - "diese aus. \n" - "Bsp. 56673462836 liefert das Wort Koordinaten \n" - "Da eine Abfrage relativ lange dauert gibt es die Möglichkeit ein spezielles t9-Wörterbuch " - "generieren zu lassen, welches ab der nächsten Abfrage dann genutzt wird und wodurch dann nur noch ca. " - "15% der Zeit pro Abfrage benötigt wird. Um die Erstellung des t9-de.dic zu starten muß das Wort " - "GENERATE (Großschreibung beachten!) ins Eingabefeld eingetragen werden und der Funktionsknopf " - "betätigt werden.") + return hilfetexte.t9_de else: try: wbfile = open("./data/t9-de.dic", "r", encoding="iso-8859-15") @@ -1795,11 +1566,7 @@ def t9_en(eingabetext): '-': '1', ',': '1', '+': '0', ')': '1', '(': '1', 'SS': '7'} eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### T9-EN\n" - "Mit Hilfe der englischen Wörterliste en_US-large.txt vom Project " - "https://sourceforge.net/projects/wordlist ermittelt diese Funktion alle im Wörterbuch " - "enthaltenen Wörter die zu der eingegebenen T9-kodierten Ziffernfolge passen und gibt diese aus. \n" - "Bsp. 26673462837 liefert das Wort coordinates") + return hilfetexte.t9_en else: try: wbfile = open("./data/en_US-large.txt", "r", encoding="UTF-8") @@ -1821,25 +1588,16 @@ def t9_en(eingabetext): return ausgabetext def vigenere(eingabetext, pw): - hilfetext = ("### Vigenere-Chiffre\n" - "Die Eingabe eines Schlüsselwortes ist hier erforderlich!!! Die Vigenere-Chiffre baut auf dem Prinzip " - "der Cesar-Chiffre auf, wobei hier die Verschiebung jedes einzelnen Buchstaben durch die " - "Buchstabenwerte eines Schlüsselwortes definiert werden. Da der zu verschlüsselnde Text im " - "allgemeinen länger als das Schlüsselwort ist, wird das Schlüsselwort immer wieder wiederholt. " - "Ist der Schlüssel mindestens genauso lang wie der Klartext entspricht dies dann dem " - "One-Time-Pad-Chiffre. Der eingegebene Text wird hier mit dem eingegebenen Schlüsselwort kodiert und " - "dekodiert ausgegeben und zwar sowohl in der Variante, daß Sonderzeichen Schlüsselbuchstaben " - "verbrauchen als auch nicht.") bw = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 10, 'K': 11, 'L': 12, 'M': 13, 'N': 14, 'O': 15, 'P': 16, 'Q': 17, 'R': 18, 'S': 19, 'T': 20, 'U': 21, 'V': 22, 'W': 23, 'X': 24, 'Y': 25, 'Z': 26} ubw = {v: k for k, v in bw.items()} if pw is None: - return hilfetext + return hilfetexte.vigenere pw = pw.strip() text = eingabetext.rstrip() if text == "" or pw == "": - return hilfetext + return hilfetexte.vigenere else: for b in pw: if b.upper() not in bw: @@ -1899,29 +1657,13 @@ def vigenere(eingabetext, pw): return ausgabetext def wolseley(eingabetext, pw): - hilfetext = ("### Wolseley-Chiffre\n" - "Die Eingabe eines Schlüsselwortes ist hier erforderlich!!! Die Woseley-Chiffre arbeitet mit einem " - "Schlüsselwort über welches dann ein Codealphabet/Codequadrat gebildet wird mit welchem dann sowohl " - "kodiert als auch dekodiert wird. Angefangen wird dabei mit dem jeweils ersten Vorkommen eines " - "Buchstaben im Schlüsselwort und danach folgen die restlichen Buchstaben des Alphabets die nicht im " - "Schlüsselwort vorkommen. Da hier nur 25 Zeichen zur Verfügung stehen wird das J mit dem I " - "zusammengefasst und als I behandelt und dargestellt. Sonstige Zeichen die nicht im Codealphabet " - "vorhanden sind werden unverändert ausgegeben. \n \n" - "Codealpahbet mit Schlüsselwort: Teebaum \n" - "| | | | | | | | | | | | | | | | | | | | | | | | | |\n" - "|-|-|-|-|-|-|-|-|-|-|-|---|-|---|-|-|-|-|-|-|-|-|-|-|-|\n" - "|T|E|B|A|U|M|C|D|F|G|H|I/J|K|L |N|O|P|Q|R|S|V|W|X|Y|Z|\n" - "|Z|Y|X|W|V|S|R|Q|P|O|N|L |K|I/J|H|G|F|D|C|M|U|A|B|E|T|\n \n" - "Bei der Chiffrierung/Dechiffrierung wird im Text nun der erste Buchstabe mit dem letzten getauscht, " - "der 2. mit dem Vorletzten, usw. also aus T wird Z und umgekehrt,E<->Y, B<->X, A<->W usw.. nur ein " - "K bleibt ein K") abc = "ABCDEFGHIKLMNOPQRSTUVWXYZ" # j wird als i chiffriert if pw is None: - return hilfetext + return hilfetexte.wolseley text = eingabetext.rstrip() pw = pw.strip() if text == "" or pw == "": - return hilfetext + return hilfetexte.wolseley else: for b in pw: if b.upper() not in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": @@ -1956,19 +1698,9 @@ def wolseley(eingabetext, pw): return atxt def atbash(eingabetext): - hilfetext = ("### Atbash-Chiffre\n" - "Atbash ist eine einfache Ersetzungschiffre die für das hebräische Alphabet entwickelt wurde, welche " - "später auf das lateinische Alphabet übertragen wurde. Dabei wird dem normalen Alphabet ein " - "rückwärts gelesenes Alphabet gegenüber gestellt. A wird zu Z, B zu Y usw. Kodierung und Dekodierung " - "erfolgt über die selbe Funktion. \n \n" - "Codealpahbet: \n" - "| | | | | | | | | | | | | | | | | | | | | | | | | | |\n" - "|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|\n" - "|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|\n" - "|Z|Y|X|W|V|U|T|S|R|Q|P|O|N|M|L|K|J|I|H|G|F|E|D|C|B|A|") text = eingabetext.rstrip() if text == "": - return hilfetext + return hilfetexte.atbash else: abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" uabc = abc[::-1] @@ -1987,25 +1719,12 @@ def atbash(eingabetext): return atxt def monoalphasubstitution(eingabetext, pw): - hilfetext = ("### Monoalphabetische Substitutions-Chiffre\n" - "Bei der monoalphabetischen Substitution wird jedem Buchstaben des Alphabets der Buchstabe eines " - "Schlüsselalphabets zugeordnet: \n" - "|Bsp.| |\n" - "|----|-|\n" - "|Klartextalphabet|ABCDEFGHIJKLMNOPQRSTUVWXYZ|\n" - "|Schlüsselalphabet|DSBJFALKNVPOQXYWCEGHIMRTUZ|\n \n" - "Spezialformen dieser Chiffre sind Atbash, Cesar, Rot13. Die Funktion hier arbeitet so, daß entweder " - "ein komplettes Schlüsselalphabet oder ein Schlüsselwort verwendet werden kann. Bei Verwendung eines " - "Schlüsselwortes, wird der Rest des Schlüsselalphabets automatisch aufgefüllt. \n" - "Aus dem Schlüsselwort GutenMorgenLiebeSonne wird z. B. dann das Schlüsselalphabet: " - "GUTENMORLIBSACDFHJKPQVWXYZ \n" - "| | |\n|-|-|\n|Schlüsselwort|GutenMorgenLiebeSonne|\n|Schlüsselalphabet|GUTENMORLIBSACDFHJKPQVWXYZ|") if pw is None: - return hilfetext + return hilfetexte.monoalphasubstitution text = eingabetext.rstrip() pw = pw.strip() if text == "" or pw == "": - return hilfetext + return hilfetexte.monoalphasubstitution else: abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" for b in pw: @@ -2044,17 +1763,12 @@ def monoalphasubstitution(eingabetext, pw): return ausgabetext def autokey(eingabetext, pw): - hilfetext = ("### Autokey-Chiffre\n" - "Die Autokey-Chiffre arbeitet nach dem selben Prinzip wie Vignere-Chiffre mit dem Unterschied, dass " - "hier am Ende des Schlüsselwortes nicht wieder und wieder das Schlüsselwort angehängt wird, sondern " - "der Klartext an das Schlüsselwort angehangen wird. Der eingegebene Text wird hier mit dem " - "eingegebenen Schlüsselwort kodiert und dekodiert ausgegeben.") if pw is None: - return hilfetext + return hilfetexte.autokey text = eingabetext.rstrip() pw = pw.strip() if text == "" or pw == "": - return hilfetext + return hilfetexte.autokey else: bw = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 10, 'K': 11, 'L': 12, 'M': 13, 'N': 14, @@ -2111,31 +1825,12 @@ def autokey(eingabetext, pw): return ausgabetext def polybios_encode(eingabetext, pw): - hilfetext = ('### Polybios-Chiffre kodieren\n' - 'Die 5x5 Polybios-Chiffre kodiert Buchstaben zu zweistelligen Zahlen dazu wird das Schlüsselalphabet ' - 'in ein 5x5-Quadrat eingetragen. Die Buchstaben werden dann sozusagen zu ihren entsprechenden ' - '"Koordinaten" kodiert. Im unten gezeigten Quadrat wird so aus A 11, aus B 12, aus Q 41, usw. Da in ' - 'ein 5x5 Quadrat nur 25 Buchstaben passen wird typischer Weise J und I zusammengefasst, (alternativ ' - 'auch U und V), sollen auch Ziffern kodiert werden wird mit einem 6x6-Quadrat gearbeitet, bei ' - 'welchem dann für das komplette Alphabet und die Ziffern 0-9 Platz ist. \n' - '| |1|2|3|4|5|\n' - '|-|-|-|-|-|-|\n' - '|1|A|B|C|D|E|\n' - '|2|F|G|H|I|K|\n' - '|3|L|M|N|O|P|\n' - '|4|Q|R|S|T|U|\n' - '|5|V|W|X|Y|Z|\n\n' - 'Kommt für die Chiffre ein Schlüsselwort zum Einsatz wird das Code-Quadrat so abgeändert das die ' - 'Buchstaben des Schlüsselwortes entsprechend ihres ersten Vorkommens Zeile für Zeile in das ' - 'Codequadrat eingetragen werden, der Rest wird mit den verbliebenen Buchstaben aufgefüllt. Zur ' - 'Information wird für jede Polybios-Variante auch noch einmal der verwendete Klartext und das ' - 'verwendete Passwort ausgegeben.') if pw is None: - return hilfetext + return hilfetexte.polybios_encode text = eingabetext.rstrip() pw = pw.strip() if text == "": - return hilfetext + return hilfetexte.polybios_encode else: qz5 = [11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55] alpha5ij = "ABCDEFGHIKLMNOPQRSTUVWXYZ" # j wird durch i ersetzt @@ -2221,30 +1916,12 @@ def polybios_encode(eingabetext, pw): return ausgabetext def polybios_decode(eingabetext, pw): - hilfetext = ('### Polybios-Chiffre dekodieren\n' - 'Die 5x5 Polybios-Chiffre kodiert Buchstaben zu zweistelligen Zahlen dazu wird das Schlüsselalphabet ' - 'in ein 5x5-Quadrat eingetragen. Die Buchstaben werden dann sozusagen zu ihren entsprechenden ' - '"Koordinaten" kodiert. Im unten gezeigten Quadrat wird so aus A 11, aus B 12, aus Q 41, usw. Da in ' - 'ein 5x5 Quadrat nur 25 Buchstaben passen wird typischer Weise J und I zusammengefasst, (alternativ ' - 'auch U und V), sollen auch Ziffern kodiert werden wird mit einem 6x6-Quadrat gearbeitet, bei ' - 'welchem dann für das komplette Alphabet und die Ziffern 0-9 Platz ist. \n' - '| |1|2|3|4|5|\n' - '|-|-|-|-|-|-|\n' - '|1|A|B|C|D|E|\n' - '|2|F|G|H|I|K|\n' - '|3|L|M|N|O|P|\n' - '|4|Q|R|S|T|U|\n' - '|5|V|W|X|Y|Z|\n\n' - 'Kommt für die Chiffre ein Schlüsselwort zum Einsatz wird das Code-Quadrat so abgeändert das die ' - 'Buchstaben des Schlüsselwortes entsprechend ihres ersten Vorkommens Zeile für Zeile in das ' - 'Codequadrat eingetragen werden, der Rest wird mit den verbliebenen Buchstaben aufgefüllt. Zur ' - 'Information wird für jede Polybios-Variante auch noch einmal das verwendete Passwort ausgegeben.') if pw is None: - return hilfetext + return hilfetexte.polybios_decode text = eingabetext.rstrip() pw = pw.strip() if text == "": - return hilfetext + return hilfetexte.polybios_decode else: qz5 = [11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55] alpha5ij = "ABCDEFGHIKLMNOPQRSTUVWXYZ" # j wird durch i ersetzt @@ -2319,19 +1996,9 @@ def polybios_decode(eingabetext, pw): return ausgabetext def klopfcode_encode(eingabetext): - hilfetext = ('"### Klopfcode kodieren\nDer Klopfcode ist im Prinzip eine Polybios Chiffre mit einem festen ' - 'Schlüsselquadrat bei welchem nicht I und J sondern C und K zusammengefasst werden. \n' - 'siehe hier: \n' - '| |1|2|3|4|5|\n' - '|-|-|-|-|-|-|\n' - '|1|A|B|C|D|E|\n' - '|2|F|G|H|I|J|\n' - '|3|L|M|N|O|P|\n' - '|4|Q|R|S|T|U|\n' - '|5|V|W|X|Y|Z|') text = eingabetext.rstrip() if text == "": - return hilfetext + return hilfetexte.polybios_encode else: qz5 = [11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55] alpha = "ABCDEFGHIJLMNOPQRSTUVWXYZ" # k wird durch c ersetzt @@ -2352,19 +2019,9 @@ def klopfcode_encode(eingabetext): return ausgabetext def klopfcode_decode(eingabetext): - hilfetext = ('"### Klopfcode kodieren\nDer Klopfcode ist im Prinzip eine Polybios Chiffre mit einem festen ' - 'Schlüsselquadrat bei welchem nicht I und J sondern C und K zusammengefasst werden. \n' - 'siehe hier: \n' - '| |1|2|3|4|5|\n' - '|-|-|-|-|-|-|\n' - '|1|A|B|C|D|E|\n' - '|2|F|G|H|I|J|\n' - '|3|L|M|N|O|P|\n' - '|4|Q|R|S|T|U|\n' - '|5|V|W|X|Y|Z|') text = eingabetext.rstrip() if text == "": - return hilfetext + return hilfetexte.polybios_decode else: qz5 = [11, 12, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55] alpha = "ABDEFGHIJLMNOPQRSTUVWXYZ" # k wird durch c ersetzt @@ -2382,33 +2039,9 @@ def klopfcode_decode(eingabetext): return f"Klopfcode dekodiert: \n{ctext}" def maptiles_kachelkoordinaten(eingabetext): - hilfetext = ('### Maptiles / Kachelkoordinaten\n' - 'Bei vielen Online-Kartendiensten wie Openstreetmap oder Google-Maps erfolgt die Kartendarstellung ' - 'über vorberechnete "Kachel"-Grafikdateien, welche ein Adressierungssystem benötigen damit je nach ' - 'Koordinate und Zoomstufe auch der richtige Kartenausschnitt dargestellt wird und klar ist welche ' - 'Kacheln daneben darzustellen sind. \n' - 'Solche Kacheln sind typischer Weise PNG-Grafiken mit 256x256 oder ' - '512x512 Pixeln und je nach Zoomstufe ist eine unterschiedliche Anzahl solcher Kacheln/Tiles ' - 'notwendig um die ganze Welt abzubilden. Da je Zoomstufe sich die Anzahl der benötigten Kacheln ' - 'vervierfacht und damit auch die Datenmenge werden in der Praxis keine Zoomlevel über 20 ' - 'verwendet. \n' - 'Um die einzelnen Kacheln beim tilemap-Server abzufragen braucht man die Zoomstufe, einen X- und ' - 'einen Y-Wert wobei dies alles ganzzahlige Werte sind. Abgerufen vom Tilemap-Server werden die ' - 'Kacheln dann nach dem Muster: `http://servername/Zoom/X/Y.png` Den Fernsehturm mit Zoomstufe 18 ' - 'findet man z.B. bei Openstreetmap hier: https://tile.openstreetmap.org/18/140836/85970.png \n' - 'Die Funktion arbeitet hier auf die Art und Weise, dass man 2 durch ein Freizeichen getrennte Zahlen ' - 'eingibt. Handelt es sich bei den angegebenen Zahlen um "Kommazahlen" welche allerdings mit Punkt ' - 'anzugeben sind (Bsp: 52.520803 13.4088653 ) geht die Funktion davon aus, daß es sich um Koordinaten ' - 'in Dezimalgrad handelt und sofern es gültige Koordinaten sind erfolgt eine Ausgabe der X und Y Werte ' - 'für die Zoomstufen und 1-25. (Positive Zahlen stehen für Nord und Ost, negative für Süd und West) ' - 'Handelt es sich bei den beiden Zahlen um Ganzzahlen wird davon ausgegangen, dass es sich um X und Y ' - 'Werte handelt und es werden für alle Zoomstufen von 1-25 Koordinaten in Dezimalminuten und ' - 'Dezimalgrad ausgegeben, sofern dies sinnvolle Koordinaten ergibt und sie werden auf einer Karte ' - 'angezeigt.') - text = eingabetext.rstrip() if text == "": - return hilfetext, None + return hilfetexte.maptiles_kachelkoordinaten, None else: text = text.split() if "." in text[0] and len(text) == 2: @@ -2440,22 +2073,9 @@ def maptiles_kachelkoordinaten(eingabetext): return "Zahlen konnten nicht ermittelt werden!", None def quadtree_koordinaten(eingabetext): - hilfetext = ("### Quadtree-/Quadkeykoordinaten\n" - "Diese Koordinatenkodierung spielt in der alltäglichen Praxis eigentlich kaum noch ein Rolle, " - "außer scheinbar bei bing-maps und beim Geocaching. Sie dient ähnlich wie das Maptiles-System dazu " - "Grafikdateien für unterschiedliche Zoomstufen einer Karte zu adressieren. Die Länge der Zahl " - "entspricht hier zugleich auch dem Detailgrad bzw. der Zoomstufe. Es finden nur die Zahlen 0,1,2 " - "und 3 Verwendung, wobei die 0 den Nordwestlichen Quadranten, 1 den Nordöstlichen, 2 SW und 3 SO. \n" - "Ein kleines Beispiel: 230 würde bedeuten es geht im südwestlichen Quadranten (2) um den " - "südöstlichen Quadranten(3) und in diesem wiederum um den nordwestlichen Quadranten. Je länger " - "also diese Zahlenreihe aus 0,1,2 und 3 wird um so genauer wird ein bestimmter Ort angegeben. \n" - "Weitere Infos gibt es unter folgendem Link zu finden: " - "https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system \n" - "Die Funktion ermittelt aus einer Quadtreekoordinate die Maptileskoordinaten und die " - "WGS84-Koordinaten und zeigt diese auf einer Karte an.") text = eingabetext.rstrip() if text == "": - return hilfetext, None + return hilfetexte.quadtree_koordinaten, None else: tile_x = 0 tile_y = 0 @@ -2489,26 +2109,9 @@ def quadtree_koordinaten(eingabetext): "0,1,2,3 enthält)"), None def chronogramm(eingabetext): - hilfetext = ('### Chronogramm/ römische Ziffern zählen\n' - 'Ein Chronogramm (oder Eteostichon) ist ein Satzteil, ein Satz, ein Sinnspruch oder eine Inschrift, ' - 'meist ein Vers in lateinischer Sprache, in dem diejenigen Buchstaben, die auch als römische ' - 'Zahlzeichen gelesen werden können (I, V, X, L, C, D, M), in ihrer Summe die Jahreszahl des ' - 'Ereignisses angeben, auf das sich der Text bezieht. Entscheidend ist allein die Summe der ' - 'Zahlenwertbuchstaben, die sonst bei römischen Zahlen übliche Subtraktion kleinerer Zahlenwerte von ' - 'folgenden größeren erfolgt nicht. Die Zahlbuchstaben sind meist hervorgehoben, etwa durch ' - 'Großschreibung oder Verdickung der Buchstaben bzw. durch farbliche Abhebung mittels Rötung oder ' - 'Vergoldung. \n' - 'Eine Besonderheit bilden Krypto(chrono)gramme, bei denen die Zahlbuchstaben nicht gekennzeichnet ' - 'sind und "verborgen" bleiben. Bei der einfachen Analyse werden hier die Buchstaben I(1), V(5), ' - 'X(10), L(50), C(100), D(500), M(1000) berücksichtigt und addiert, bei der erweiterten Analyse wird ' - 'zunächst einmal berücksichtigt, daß im Lateinischen Alphabet der Buchstabe J als I und der ' - 'Buchstabe U als V geschrieben wird. Außerdem erfolgt wird in der extremen Variante auch noch ' - 'W=10(V+V) und Y=2(I+I) berücksichtigt. \n' - 'Des Weiteren wird auch für jeden relevanten Buchstaben einzeln noch einmal die Anzahl und Summe' - ' angezeigt. Eine Unterscheidung zwischen Klein- und Großschreibung findet nicht statt.') text = eingabetext.rstrip() if text == "": - return hilfetext + return hilfetexte.chronogramm else: text = text.upper() i, v, x, ll, c, d, m, y, w, u, j = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 @@ -2556,15 +2159,6 @@ def chronogramm(eingabetext): return ausgabetext def zahlen_roemisch_arabisch_umwandeln(eingabetext): - hilfetext = ("### Römische in Arabische Zahlen umwandeln und umgekehrt\n" - "Es werden römische Zahlen in arabische umgewandelt und umgekehrt, die Funktion arbeitet dabei bei " - "der Umwandlung von arabisch zu römisch mit Werten bis maximal 500000. Es werden folgende Zeichen " - "verwendet: I=1, V=5, X=10, L=50, C=100, D=500, M=1000, \u2181=5000, \u2182=10000, \u2187=50000, " - "\u2188=100000 \nEtwas Vorsicht sollte bei einer Umwandlung von römischen in arabische Zahlen " - "geboten sein, wenn mit untypischen Schreibweisen gearbeitet wird bei welchen mehr als ein Zeichen " - "von dem nachfolgenden Zeichen abgezogen werden soll. Die eigentlich inkorrekte Schreibweise IIX " - "für die Zahl 8 wird hier die Zahl 10 als Ergebnis haben (+1-1+10), dafür wird aber allerdings die " - "ebenfalls falsche Schreibweise IM genauso als 999 wie die korrekte Schreibweise CMXCIX erkannt.") rza = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000, '\u2181': 5000, '\u2182': 10000, '\u2187': 50000, '\u2188': 100000} azr = [(100000, '\u2188'), (90000, '\u2182\u2188'), (50000, '\u2187'), (40000, '\u2182\u2187'), @@ -2574,7 +2168,7 @@ def zahlen_roemisch_arabisch_umwandeln(eingabetext): (1, 'I')] rz = eingabetext.rstrip() if rz == "": - return hilfetext + return hilfetexte.zahlen_roemisch_arabisch_umwandeln else: rz = rz.upper() try: @@ -2606,13 +2200,7 @@ def zahlen_roemisch_arabisch_umwandeln(eingabetext): def url_decode(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ("### URL-decode\n" - "Nachdem Groundspeak nun inzwischen sämtliche Bilddateien über einen Proxy umleitet bevor sie im " - "Listing erscheinen wird es manchmal schwer die ursprüngliche URL und/oder den Dateinamen des " - "Bildes noch lesen zu können. Die URL hat dort nun jeweils folgendes Muster: " - "`https://imgproxy.geocaching.com/......?url=.....` wobei nach dem `?url=` dann die ursprüngliche " - "Bild-URL folgt, allerdings wird dabei dann aus `http://` folgendes `http%3A%2F%2F` und um genau " - "dieses wieder normal lesbar zu machen dient diese Funktion") + return hilfetexte.url_decode else: atxt = urllib_parse_unquote(eingabetext) return f"dekodierte URL: `{atxt}`" @@ -2621,18 +2209,7 @@ def reversewig(eingabetext): seperator = ("|,", "_", "/", ";", ",") eingabetext = eingabetext.rstrip() if eingabetext == "": - return ('### Reverse Wherigo zu Koordinaten\n' - 'Mit dem Reverse Wherigo hat -Waldmeister- eigentlich eine coole Sache erfunden. Man hat anfangs ' - 'keine Koordinaten sondern nur 3 Zahlen, welche man nach Start des Wherigo-Cartridges eingibt und ' - 'dann erfährt man wie weit der Cache entfernt ist. Nun kann man immer wieder von unterschiedlichen ' - 'Positionen aus diese Entfernungsfragen durchführen und sich damit dem Cache nähern. Je weniger ' - 'Abfragen man braucht umso besser. Leider gibt es inzwischen genügend Tools die genau wie diese ' - 'Funktion hier aus den 3 Zahlen direkt die Finalkoordinaten ermitteln können. \n' - ' Leider??? Ja leider denn das führt auch dazu, das es inzwischen so extrem viele dieser ' - 'Reverse-Wherigos gibt wo sich die Owner anscheinend auch denken "Die spielt doch sowieso keiner ' - 'mehr normal..." anders kann ich mir ganze Trails mit Reverse-Wherigos nicht erklären. Um die ' - 'Funktion zu nutzen braucht man nur die 3 Zahlen durch ein entsprechendes Trennzeichen: ' - '| , _ / ; , oder Leerzeichen eingeben und auf den Knopp klicken und bekommt Koordinaten.') + return hilfetexte.reversewig else: se = "" for s in seperator: @@ -2665,16 +2242,7 @@ def reversewig(eingabetext): def base64_ascii(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": - return ('### Base64 <-> ASCII\n' - 'Base64 ist ein Kodierungsverfahren, welches dazu verwendet wird um beliebige Binärdaten nur Hilfe ' - 'einer Zeichenkette aus A-Z, a-z, 0-9, +, / sowie am Ende = übertragen zu können. Ein Einsatzzweck ' - 'dafür ist z.B. wenn bei EMails Dateianhänge verwendet werden, dort werden nahezu alle Dateiformate ' - 'base64-kodiert übertragen. Auch bei dem einem oder anderen Mystery sind mir solche kodierten ' - 'Zeichenketten schon begegnet. Wenn am Ende einer Zeichenkette ein oder zwei "="-Zeichen stehen ist ' - 'die Wahrscheinlichkeit recht groß, das hier base64 verwendet wurde. Das "="-Zeichen dient hier ' - 'nämlich als "Lückenfüller" am Ende. Die Funktion hier versucht zunächst eine Dekodierung ' - 'Base64->ASCII gelingt dies nicht, erscheint ein Hinweis und der eingegeben Text wird dann ' - 'Base64-kodiert ausgegeben.') + return hilfetexte.base64_ascii else: try: ascii_string = binascii.a2b_base64(eingabetext).decode() @@ -2684,22 +2252,12 @@ def base64_ascii(eingabetext): return f"Umwandlung Base64 -> ASCII war nicht möglich. \nASCII -> Base64: \n{base64_string.decode()}" def jaegerzaun_encrypt(eingabetext, pw): - hilfetext = ("### encrypt Jägerzaun\n" - "Jägerzaun (auch Railfence oder ZigZag-Chiffre genannt) Bei dieser Chiffre wird kodiert, indem man " - "einen Text im Zickzackmuster in ein Feld aus z.B. 3 Zeilen und so vielen Spalten wie der Text lang " - "ist schreibt. Man beginnt in Spalte 1 - Zeile 1, dann geht es in Spalte 2 - Zeile 1 weiter danach " - "Spalte 3 - Zeile 3, dann Spalte 4 - Zeile 2, Spalte 5 - Zeile 1 usw. Danach werden die Buchstaben " - "einfach Zeile für Zeile hintereinander geschrieben. Unterschiedliche Varianten entstehen einfach " - "dadurch, dass man mit unterschiedlich vielen Zeilen arbeitet welche im Schlüsselfeld anzugeben " - "ist. \n" - "Die Funktion erzeugt hierbei einmal eine Ausgabe bei welcher auch Leerzeichen mitgeschrieben werden " - "und eine Ausgabe wo zuvor die Leerzeichen entfernt werden.") if pw is None: - return hilfetext + return hilfetexte.jaegerzaun_encrypt eingabetext = eingabetext.strip().replace("\n", " ") pw = pw.strip() if eingabetext == "": - return hilfetext + return hilfetexte.jaegerzaun_encrypt elif pw == "" or not pw.isdigit(): return "Bitte eine Zahl im Schlüsselfeld eingeben!!" else: @@ -2712,24 +2270,12 @@ def jaegerzaun_encrypt(eingabetext, pw): return "Schlüsselzahl fehlerhaft oder kleiner als 2." def jaegerzaun_decrypt(eingabetext, pw): - hilfetext = ("### decrypt Jägerzaun\n" - "Jägerzaun (auch Railfence oder ZigZag-Chiffre genannt) Bei dieser Chiffre wird kodiert, indem man " - "einen Text im Zickzackmuster in ein Feld aus z.B. 3 Zeilen und so vielen Spalten wie der Text " - "lang ist schreibt. Man beginnt in Spalte 1 - Zeile 1, dann geht es in Spalte 2 - Zeile 1 weiter " - "danach Spalte 3 - Zeile 3, dann Spalte 4 - Zeile 2, Spalte 5 - Zeile 1 usw. Danach werden die " - "Buchstaben einfach Zeile für Zeile hintereinander geschrieben. Unterschiedliche Varianten " - "entstehen einfach dadurch, dass man mit unterschiedlich vielen Zeilen arbeitet welche im " - "Schlüsselfeld angegeben werden kann. \n" - "Die Funktion erzeugt hierbei einmal eine Ausgabe bei welcher auch Leerzeichen mitgeschrieben " - "werden und eine Ausgabe wo zuvor die Leerzeichen entfernt werden. \n" - "Wird im Schlüsselfeld keine Zahl angegeben erfolgt automatisch die Dekodierung für alle " - "Zeilenanzahlen von 2-12.") if pw is None: - return hilfetext + return hilfetexte.jaegerzaun_decrypt eingabetext = eingabetext.strip().replace("\n", " ") pw = pw.strip() if eingabetext == "": - return hilfetext + return hilfetexte.jaegerzaun_decrypt elif pw == "": ausgabtext = "" ausgabtext += "_inkl. Leerzeichen_ \n" @@ -2750,48 +2296,23 @@ def jaegerzaun_decrypt(eingabetext, pw): return ausgabetext except ValueError: return "Schlüsselzahl fehlerhaft oder kleiner als 2.\n" -''' -def adfgx_kodieren(): - hilfetext = """HILFE: [ADFGX kodieren] -Die ADFGX-Chiffre arbeitet mit zwei Passwörtern, wobei jedes für je einen -Kodierungsschritt verwendet wird. Das erste wird benutzt um eine Variation -der Polybios-Kodierung mit einem 5x5 Quadrat und J=I durchzuführen bei -welcher die Zahlen 1-5 durch die Buchstaben ADFGX ersetzt werden. -Mit dem Text "Ein Beispiel",dem Passwort "PASSWORT" und einem -mit A->Z aufgefülltem Schlüsselquadrat ergibt der erste Schritt z.B. die -Zeichenfolge: "FA FX GG DF FA FX AF AA FX FA GD". Nun kommt das zweite Passwort -zum Einsatz als Beispiel hier:"Tester". Zunächst einmal wird die Zeichenfolge - 5 1 4 6 2 3 in der Breite des Passwort Zeilenweise darunter geschrieben, - T E S T E R nun werden diese Spalten dem Passwort entsprechend - F A F X G G alphabetisch sortiert und dann von oben nach unten abgelesen. - D F F A F X Im Beispiel fängt es also mit der Spalte 1 dem E an dann das - A F A A F X zweite E, dann R usw. was dann als kodierten Text, welcher - F A G D typischer Weise in 5er-Blöcken ausgegeben wird folgendes - ergibt: AFFAG FFGXX FFAGF DAFXA AD ergibt. -Die beiden Varianten, welche ausgegeben werden, unterscheiden sich nur -darin, wie das Schlüsselquadrat im ersten Kodierungsschritt aufgefüllt -wird. Entweder in alphabetischer Reihenfolge A->Z oder umgekehrt Z->A. -""" - eingabetext = Eingabe.get(1.0, END) +def adfgx_kodieren(eingabetext, pw): + if pw is None: + return hilfetexte.adfgx_kodieren text = eingabetext.rstrip() - pw = PW_Eingabe.get() pw = pw.strip() if text == "": - Ausgabe.insert(1.0, hilfetext + "\n") + return hilfetexte.adfgx_kodieren else: rn = ["AA", "AD", "AF", "AG", "AX", "DA", "DD", "DF", "DG", "DX", "FA", "FD", "FF", "FG", "FX", "GA", "GD", "GF", "GG", "GX", "XA", "XD", "XF", "XG", "XX"] alpha_az = "ABCDEFGHIKLMNOPQRSTUVWXYZ" # j wird durch i ersetzt alpha_za = "ZYXWVUTSRQPONMLKIHGFEDCBA" - text = text.upper() - text = text.replace("J", "I") - pw = pw.upper() - pw = pw.replace("J", "I") - pw = pw.split(",") + text = text.upper().replace("J", "I") + pw = pw.upper().replace("J", "I").split(",") if len(pw) != 2: - Ausgabe.insert(1.0, "Es es werden genau zwei durch Komma getrennte Passwörter benötigt!\n", "re") - return + return "Es es werden genau zwei durch Komma getrennte Passwörter benötigt!" pw[0] = pw[0].strip() pw[1] = pw[1].strip() pw1az = "" @@ -2855,42 +2376,19 @@ wird. Entweder in alphabetischer Reihenfolge A->Z oder umgekehrt Z->A. else: ausgabe_za += i[j + 1] z += 1 - Ausgabe.insert(1.0, ausgabe_za + "\n") - Ausgabe.insert(1.0, "kodiert mit Variante Z-A:\n") - Ausgabe.insert(1.0, ausgabe_az + "\n") - Ausgabe.insert(1.0, "kodiert mit Variante A-Z:\n") - Ausgabe.insert(1.0, "Passwort 2: {}\n".format(pw2), "gr") - Ausgabe.insert(1.0, "Passwort 1: {}\n".format(pw[0]), "gr") + ausgabetext = f"_Passwort 1:_ {pw[0]} \n" + ausgabetext += f"_Passwort 2:_ {pw2} \n \n" + ausgabetext += f"_kodiert mit Variante A-Z:_ \n{ausgabe_az} \n \n" + ausgabetext += f"_kodiert mit Variante Z-A:_ \n{ausgabe_za}" + return ausgabetext - -def adfgx_dekodieren(): - hilfetext = """HILFE: [ADFGX dekodieren] -Die ADFGX-Chiffre arbeitet mit zwei Passwörtern, wobei jedes für je einen -Kodierungsschritt verwendet wird. Das erste wird benutzt um eine Variation -der Polybios-Kodierung mit einem 5x5 Quadrat und J=I durchzuführen bei -welcher die Zahlen 1-5 durch die Buchstaben ADFGX ersetzt werden. -Mit dem Text "Ein Beispiel",dem Passwort "PASSWORT" und einem -mit A->Z aufgefülltem Schlüsselquadrat ergibt der erste Schritt z.B. die -Zeichenfolge: "FA FX GG DF FA FX AF AA FX FA GD". Nun kommt das zweite Passwort -zum Einsatz als Beispiel hier:"Tester". Zunächst einmal wird die Zeichenfolge - 5 1 4 6 2 3 in der Breite des Passwort Zeilenweise darunter geschrieben, - T E S T E R nun werden diese Spalten dem Passwort entsprechend - F A F X G G alphabetisch sortiert und dann von oben nach unten abgelesen. - D F F A F X Im Beispiel fängt es also mit der Spalte 1 dem E an dann das - A F A A F X zweite E, dann R usw. was dann als kodierten Text, welcher - F A G D typischer Weise in 5er-Blöcken ausgegeben wird folgendes - ergibt: AFFAG FFGXX FFAGF DAFXA AD ergibt. -Die beiden Varianten, welche ausgegeben werden, unterscheiden sich nur -darin, wie das Schlüsselquadrat im ersten Kodierungsschritt aufgefüllt -wird. Entweder in alphabetischer Reihenfolge A->Z oder umgekehrt Z->A. -""" - - eingabetext = Eingabe.get(1.0, END) +def adfgx_dekodieren(eingabetext, pw): + if pw is None: + return hilfetexte.adfgx_dekodieren text = eingabetext.rstrip() - pw = PW_Eingabe.get() pw = pw.strip() if text == "": - Ausgabe.insert(1.0, hilfetext + "\n") + return hilfetexte.adfgx_dekodieren else: rn = ["AA", "AD", "AF", "AG", "AX", "DA", "DD", "DF", "DG", "DX", "FA", "FD", "FF", "FG", "FX", "GA", "GD", "GF", "GG", "GX", "XA", "XD", "XF", "XG", "XX"] @@ -2902,8 +2400,7 @@ wird. Entweder in alphabetischer Reihenfolge A->Z oder umgekehrt Z->A. pw = pw.replace("J", "I") pw = pw.split(",") if len(pw) != 2: - Ausgabe.insert(1.0, "Es es werden genau zwei durch Komma getrennte Passwörter benötigt!\n", "re") - return + return "Es es werden genau zwei durch Komma getrennte Passwörter benötigt!" pw[0] = pw[0].strip() pw[1] = pw[1].strip() pw1az = "" @@ -2950,29 +2447,19 @@ wird. Entweder in alphabetischer Reihenfolge A->Z oder umgekehrt Z->A. bi = ctext[i:i + 2] if bi in w_bza: klartext_za += w_bza[bi] - Ausgabe.insert(1.0, klartext_za + "\n") - Ausgabe.insert(1.0, "dekodiert mit Variante Z-A:\n") - Ausgabe.insert(1.0, klartext_az + "\n") - Ausgabe.insert(1.0, "dekodiert mit Variante A-Z:\n") - Ausgabe.insert(1.0, "Passwort 2: {}\n".format(pw2), "gr") - Ausgabe.insert(1.0, "Passwort 1: {}\n".format(pw[0]), "gr") + ausgabetext = f"_Passwort 1:_ {pw[0]} \n" + ausgabetext += f"_Passwort 2:_ {pw2} \n \n" + ausgabetext += f"_dekodiert mit Variante A-Z:_ \n{klartext_az} \n \n" + ausgabetext += f"_dekodiert mit Variante Z-A:_ \n{klartext_za}" + return ausgabetext - -def adfgvx_kodieren(): - hilfetext = """HILFE: [ADFGVX kodieren] -Die ADFGVX-Chiffre erweitert das 5x5-Schlüsselquadrat der ADFGX-Chiffre -ersten Kodierungsschritt auf 6x6 so, daß das komplette Alphabet und die -Zahlen 0-9 verwendet werden können. Die beiden ausgegebenen Varianten -unterscheiden sich in der Variante wie das Schlüsselquadrat aufgefüllt -wird (A->Z + 0->9 oder 9->0 + Z->A). -""" - - eingabetext = Eingabe.get(1.0, END) +def adfgvx_kodieren(eingabetext, pw): + if pw is None: + return hilfetexte.adfgvx_kodieren text = eingabetext.rstrip() - pw = PW_Eingabe.get() pw = pw.strip() if text == "": - Ausgabe.insert(1.0, hilfetext + "\n") + return hilfetexte.adfgvx_kodieren else: rn = ["AA", "AD", "AF", "AG", "AV", "AX", "DA", "DD", "DF", "DG", "DV", "DX", "FA", "FD", "FF", "FG", "FV", "FX", "GA", "GD", "GF", "GG", "GV", "GX", "VA", "VD", "VF", "VG", "VV", "VX", "XA", "XD", "XF", "XG", @@ -2980,11 +2467,9 @@ wird (A->Z + 0->9 oder 9->0 + Z->A). alpha_az09 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" alpha_90za = "9876543210ZYXWVUTSRQPONMLKJIHGFEDCBA" text = text.upper() - pw = pw.upper() - pw = pw.split(",") + pw = pw.upper().split(",") if len(pw) != 2: - Ausgabe.insert(1.0, "Es es werden genau zwei durch Komma getrennte Passwörter benötigt!\n", "re") - return + return "Es es werden genau zwei durch Komma getrennte Passwörter benötigt!" pw[0] = pw[0].strip() pw[1] = pw[1].strip() pw1az09 = "" @@ -3047,29 +2532,19 @@ wird (A->Z + 0->9 oder 9->0 + Z->A). else: ausgabe_90za += i[j + 1] z += 1 - Ausgabe.insert(1.0, ausgabe_90za + "\n") - Ausgabe.insert(1.0, "kodiert mit Variante 9-0,Z-A:\n") - Ausgabe.insert(1.0, ausgabe_az09 + "\n") - Ausgabe.insert(1.0, "kodiert mit Variante A-Z,0-9:\n") - Ausgabe.insert(1.0, "Passwort 2: {}\n".format(pw2), "gr") - Ausgabe.insert(1.0, "Passwort 1: {}\n".format(pw[0]), "gr") + ausgabetext = f"_Passwort 1:_ {pw[0]} \n" + ausgabetext += f"_Passwort 2:_ {pw2} \n \n" + ausgabetext += f"_kodiert mit Variante A-Z,0-9:_ \n{ausgabe_az09} \n \n" + ausgabetext += f"_kodiert mit Variante 9-0,Z-A:_ \n{ausgabe_90za}" + return ausgabetext - -def adfgvx_dekodieren(): - hilfetext = """HILFE: [ADFGVX dekodieren] -Die ADFGVX-Chiffre erweitert das 5x5-Schlüsselquadrat der ADFGX-Chiffre -ersten Kodierungsschritt auf 6x6 so, daß das komplette Alphabet und die -Zahlen 0-9 verwendet werden können. Die beiden ausgegebenen Varianten -unterscheiden sich in der Variante wie das Schlüsselquadrat aufgefüllt -wird (A->Z + 0->9 oder 9->0 + Z->A). -""" - - eingabetext = Eingabe.get(1.0, END) +def adfgvx_dekodieren(eingabetext, pw): + if pw is None: + return hilfetexte.adfgvx_dekodieren text = eingabetext.rstrip() - pw = PW_Eingabe.get() pw = pw.strip() if text == "": - Ausgabe.insert(1.0, hilfetext + "\n") + return hilfetexte.adfgvx_dekodieren else: rn = ["AA", "AD", "AF", "AG", "AV", "AX", "DA", "DD", "DF", "DG", "DV", "DX", "FA", "FD", "FF", "FG", "FV", "FX", "GA", "GD", "GF", "GG", "GV", "GX", "VA", "VD", "VF", "VG", "VV", "VX", "XA", "XD", "XF", "XG", @@ -3080,8 +2555,7 @@ wird (A->Z + 0->9 oder 9->0 + Z->A). pw = pw.upper() pw = pw.split(",") if len(pw) != 2: - Ausgabe.insert(1.0, "Es es werden genau zwei durch Komma getrennte Passwörter benötigt!\n", "re") - return + return "Es es werden genau zwei durch Komma getrennte Passwörter benötigt!" pw[0] = pw[0].strip() pw[1] = pw[1].strip() pw1az09 = "" @@ -3128,14 +2602,13 @@ wird (A->Z + 0->9 oder 9->0 + Z->A). bi = ctext[i:i + 2] if bi in wb90za: klartext_90za += wb90za[bi] - Ausgabe.insert(1.0, klartext_90za + "\n") - Ausgabe.insert(1.0, "dekodiert mit Variante 0-0,Z-A:\n") - Ausgabe.insert(1.0, klartext_az09 + "\n") - Ausgabe.insert(1.0, "dekodiert mit Variante A-Z,0-9:\n") - Ausgabe.insert(1.0, "Passwort 2: {}\n".format(pw2), "gr") - Ausgabe.insert(1.0, "Passwort 1: {}\n".format(pw[0]), "gr") - + ausgabetext = f"_Passwort 1:_ {pw[0]} \n" + ausgabetext += f"_Passwort 2:_ {pw2} \n \n" + ausgabetext += f"_dekodiert mit Variante A-Z,0-9:_ \n{klartext_az09} \n \n" + ausgabetext += f"_dekodiert mit Variante 9-0,Z-A:_ \n{klartext_90za}" + return ausgabetext +''' def brainfuck_interpreter(): eingabetext = Eingabe.get(1.0, END) eingabetext = eingabetext.rstrip()