Textverschlüsselung mit fiktivem Alphabet

Du hast eine Idee für ein Projekt?
Antworten
Roland0815
User
Beiträge: 1
Registriert: Montag 4. November 2019, 09:51

Guten Morgen,

ich möchte ein Programm schreiben, welches Texte über die Eingabe einließt und dann in einer "verschlüsselten Form" wieder ausgibt. Idealerweise als pdf.
Ziel ist es, dass meine Kids den verschlüsselten Text mit dem passenden Schlüssel wieder "von Hand" entschlüsseln.

Grundlage der Verschlüsselung soll einfach ein "alternatives, fiktives" Alphabet sein, welches möglichst im Programmcode verändert werden kann.
Es hat keinen sicherheitsrelevanten Hintergrund. Im Grunde ist es nur ein "Symbolaustauschscript"

Ein Beispiel:

Klartext: "Lieber Timmy, ..... " wird in das Progamm als Eingabe gegeben
Schlüssel im Programmcode "L = % , i = §, e = ! ... "
Ausgabe des Programms: " %§! ... " idealerweise als pdf, damit ich es gleich ausdrucken kann.

Kann mir jemand einen Hinweis geben, wie ich damit anfange?

Ich bin Anfänger aber mit den Grundlagen von Python durch codecademy und Bücher vertraut.
Wenn ich mich recht erinnere gibt es doch Funktionen, die Symbole austauschen. Z.B. alle Kleinbuchstaben in Großbuchstaben verwandeln.
So ähnlich müsste doch auch mein Programmfunktionieren. Oder?

Viele Grüße und Dank für eure Beiträge
Roland
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Erster Anlaufpunkt, wenn man etwas so triviales sucht, sollte die Dokumentation sein. Du willst etwas mit Zeichenketten (Strings) tun, also würde ich dort mal - und bei den - Funktionen für Zeichenkette schauen, ob es das gibt, was du brauchst.

Zumindest für den ersten Schritt.

Und wenn das klappt, würde ich mir Gedanken um die Ausgabe machen.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich wuerde mit einem expliziten Mapping in Form eines Woerterbuchs arbeiten. Denn damit ermoeglichst du auch spassigere Alphabete, wie zB Emoji.

Code: Alles auswählen

alphabet = {
    "a": "🐜",
    "b": "🐝",
    "c": "🦗",
}
Und dann einfach string.replace fuer alle Eintraege anwenden.

Die wichtigere Frage ist die nach dem PDF. Mir ist da nur reportlab bekannt, das wuerde ich mir an deiner Stelle mal anschauen. Ein Artikel dazu ist zB hier zu finden: https://kaviraj.me/generating-pdf-conta ... ji-python/
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: Ameise, Biene, Crasshüpfer? Für ein komplettes Alphabet könnte man auch str.translate benutzen.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Also ich würde sowas mit maketrans und translate machen, hier mal Beispielcode.

Die erste Stelle im String VON wird zu der ersten Stelle des Strings ZU, also a -> z, b -> y

Code: Alles auswählen

import string

VON = "abcdefghijklmnopqrstuvwxyz"
ZU = "zyxwvutsrqponmlkjihgfedcba"

def verschluesseln(text):
    trans = str.maketrans(ZU ,VON)
    return text.lower().translate(trans)

def main():
    text = input("Was soll uebersetzt werden?: ")
    print(verschluesseln(text))
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde mir da für das `maketrans()` noch eine Hilfsfunktion schreiben die ein bisschen prüft. Beispielsweise dass das Ziel kein Zeichen mehrfach enthält. Zudem ist die Angabe von zwei getrennten ”parallelen” Werten fehleranfällig bei Veränderungen. Ein Wörterbuch wie von __deets__ vorgeschlagen kann man `maketrans()` auch übergeben (und auch `translate()`!) und da sieht man einfacher die Zuordung.

Falls einem das schreiben eines literalen Wörterbuchs zu viel Syntax zu tippen ist, kann man das auch als Zeichenkette, beispielsweise "a=🐜 b=🐝 c=🦗" schreiben und ein bisschen Code der daraus dann ein Wörterbuch erstellt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sirius3 hat geschrieben: Montag 4. November 2019, 13:14 @__deets__: Ameise, Biene, Crasshüpfer?
Cricket. War etwas durch die Brust ;)

Ich dachte immer, translate geht nur Byte-Weise, und ist darum eben genau nicht unicode geeignet. Das mag sich aber mit Py3 geaendert haben, ich hab's nur mal bei Python 2 angeschaut, und auch das vor ewigen Zeiten.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: In Python 2 operiert `str.translate()` auf Bytes, aber `unicode.translate()` doch nicht. Was da ein bisschen unschön war ist das die Schlüssel der Abbildung Codepoints sein mussten. Das hätte man also beispielsweise so schreiben müssen:

Code: Alles auswählen

alphabet = {
    ord(u"a"): u"🐜",
    ord(u"b"): u"🐝",
    ord(u"c"): u"🦗",
}
Test in Python 2.7:

Code: Alles auswählen

>>> alphabet = {
...     ord(u"a"): u"🐜",
...     ord(u"b"): u"🐝",
...     ord(u"c"): u"🦗",
... }
>>> u"abc".translate(alphabet)
u'\U0001f41c\U0001f41d\U0001f997'
>>> print u"abc".translate(alphabet)
🐜🐝🦗
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Roland0815 hat geschrieben: Montag 4. November 2019, 10:39 ich möchte ein Programm schreiben, welches Texte über die Eingabe einließt und dann in einer "verschlüsselten Form" wieder ausgibt. Idealerweise als pdf.
Das Erzeugen von PDFs mit Python ist eine zweite, für sich stehende Frage, die von der Verschlüsselung unabhängig ist. Persönlich würde ich das in der Regel mit LaTeX machen. Also ein einfaches Template anlegen, dieses mit Python befüllen und dann mit pdflatex ein PDF daraus erzeugen. Es gibt aber wohl auch Python-Module zur PDF-Erzeugung (die den Vorteil haben, dass man keine LaTeX-Umgebung benötigt) wie pyPDF oder Reportlab. Mit diesen kenne ich mich aber nicht aus. Und wenn du nur zwei, drei Texte verschlüsseln möchtest, geht es per Copy & Paste in eine Textverarbeitung sicher schneller.
Antworten