Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:verschluesselung:caesar [2026-03-03 06:19] hofgf_informatik:verschluesselung:caesar [2026-04-09 06:38] (aktuell) hof
Zeile 4: Zeile 4:
  
 {{ :gf_informatik:caesar.png?nolink&400 |}} {{ :gf_informatik:caesar.png?nolink&400 |}}
 +
 #### Aufgabe 1: Caesar-Verschlüsselung in Python #### Aufgabe 1: Caesar-Verschlüsselung in Python
  
Zeile 15: Zeile 16:
 Du kannst über die Buchstaben eines Strings laufen wie über die Elemente einer Liste: Du kannst über die Buchstaben eines Strings laufen wie über die Elemente einer Liste:
  
-<code python>+<html><script type="module" src="https://bottom.ch/editor/stable/bottom-editor.js"></script></html> 
 +  
 +<html><bottom-editor>
 s = "Hallo KSR" s = "Hallo KSR"
 for buchstabe in s: for buchstabe in s:
     print(buchstabe)     print(buchstabe)
-</code>+</bottom-editor></html>
  
 Einen String in Grossbuchstaben umwandeln: Einen String in Grossbuchstaben umwandeln:
  
-<code python>+<html><bottom-editor>
 print("Hallo KSR".upper()) print("Hallo KSR".upper())
->>> HALLO KSR +</bottom-editor></html>
-</code>+
  
 Alle Grossbuchstaben können in `string.ascii_uppercase` abgefragt werden. Mit [[https://docs.python.org/3/library/stdtypes.html?highlight=upper#str.find|str.find()]] können wir den Index (oder -1) finden: Alle Grossbuchstaben können in `string.ascii_uppercase` abgefragt werden. Mit [[https://docs.python.org/3/library/stdtypes.html?highlight=upper#str.find|str.find()]] können wir den Index (oder -1) finden:
  
-<code python>+<html><bottom-editor>
 import string import string
  
 for buchstabe in "HALLO": for buchstabe in "HALLO":
     print(string.ascii_uppercase.find(buchstabe))     print(string.ascii_uppercase.find(buchstabe))
 +</bottom-editor></html>
  
->>> +Der Modulo-Operator `%` gibt uns den Rest der Ganzzahl-Division zurück. Das ist praktisch, um den Index wieder bei `A` starten zu lassen, wenn er grösser als `Z` wird:
-+
-+
-11 +
-11 +
-14 +
-</code>+
  
-Der Modulo-Operator `%` gibt uns den Rest der Ganzzahl-Division zurück. Das ist praktisch, um den Index wieder bei `A` starten zu lassen, wenn er grösser als `Z` wird: +<html><bottom-editor>
-<code python>+
 import string import string
  
Zeile 54: Zeile 50:
 ciphertext = string.ascii_uppercase[index] ciphertext = string.ascii_uppercase[index]
 print(ciphertext) print(ciphertext)
 +</bottom-editor></html>
  
->>>+<nodisp 1>
-</code> +
- +
-<nodisp 2>+
 ++++Lösung:| ++++Lösung:|
-<code python caesar.py> +<html><bottom-editor>
 def caesar(klartext, n): def caesar(klartext, n):
     alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 .,!?'     alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 .,!?'
     decrypted_text = ''     decrypted_text = ''
-    # Jeden Buchstaben b im Klartext durchgehen. for-Schleife +    # Jeden Grossbuchstaben b im Klartext durchgehen. for-Schleife 
-    for b in klartext:+    for b in klartext.upper():
     # Mit jedem Buchstaben:     # Mit jedem Buchstaben:
     #   - Position im Alphabet finden alphabet.find     #   - Position im Alphabet finden alphabet.find
Zeile 81: Zeile 74:
 print(encrypted) print(encrypted)
 print(caesar(encrypted, -key)) print(caesar(encrypted, -key))
-</code>+</bottom-editor></html>
 ++++ ++++
 </nodisp> </nodisp>
Zeile 119: Zeile 112:
    1. Eine mit der Caesar-Methode verschlüsselte Nachricht kann man problemlos mit Brute-Force entschlüsseln (alle Möglichkeiten ausprobieren). Funktioniert dies bei der monoalphabetische Verschlüsselung auch? Gibt es bessere Möglichkeiten, eine solche zu entziffern?    1. Eine mit der Caesar-Methode verschlüsselte Nachricht kann man problemlos mit Brute-Force entschlüsseln (alle Möglichkeiten ausprobieren). Funktioniert dies bei der monoalphabetische Verschlüsselung auch? Gibt es bessere Möglichkeiten, eine solche zu entziffern?
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung| ++++Lösung|
 Für den ersten Buchstaben A können wir unter 26 Möglichkeiten auswählen, um ihn umzuplatzieren. Für B bleiben noch 25, für C 24 Möglichkeiten, etc. Für den ersten Buchstaben A können wir unter 26 Möglichkeiten auswählen, um ihn umzuplatzieren. Für B bleiben noch 25, für C 24 Möglichkeiten, etc.
Zeile 140: Zeile 133:
 <nodisp 1> <nodisp 1>
 ++++Mehr Tipps| ++++Mehr Tipps|
-<code python>+<html><bottom-editor>
 def decrypt(ciphertext, key): def decrypt(ciphertext, key):
     # oder string.ascii_uppercase     # oder string.ascii_uppercase
Zeile 159: Zeile 152:
 key = "UELXBICNYAZJSQORTPKFMGVHWD" key = "UELXBICNYAZJSQORTPKFMGVHWD"
 print(decrypt(ciphertext, key)) print(decrypt(ciphertext, key))
-</code>+</bottom-editor></html>
 ++++ ++++
 </nodisp> </nodisp>
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung| ++++Lösung|
-<code python>+<html><bottom-editor>
 def decrypt(ciphertext, key): def decrypt(ciphertext, key):
     # oder string.ascii_uppercase     # oder string.ascii_uppercase
Zeile 183: Zeile 176:
 key = "UELXBICNYAZJSQORTPKFMGVHWD" key = "UELXBICNYAZJSQORTPKFMGVHWD"
 print(decrypt(ciphertext, key)) print(decrypt(ciphertext, key))
-</code>+</bottom-editor></html>
 ++++ ++++
 </nodisp> </nodisp>
Zeile 256: Zeile 249:
 ``` ```
 ++++ ++++
-<nodisp 2>+ 
 +<nodisp 1>
 ++++Python Lösung| ++++Python Lösung|
-<code python>+<html><bottom-editor>
 import string import string
  
Zeile 301: Zeile 295:
         print(f"{letter:2}{percent:6.2%}")         print(f"{letter:2}{percent:6.2%}")
  
 +faust = 'Habe nun, ach! Philosophie, Juristerei und Medizin, Und leider auch Theologie Durchaus studiert, mit heissem Bemühn. Da steh ich nun, ich armer Tor! Und bin so klug als wie zuvor; Heisse Magister, heisse Doktor gar Und ziehe schon an die zehen Jahr Herauf, herab und quer und krumm Meine Schüler an der Nase herum Und sehe, dass wir nichts wissen können! Das will mir schier das Herz verbrennen. Zwar bin ich gescheiter als all die Laffen, Doktoren, Magister, Schreiber und Pfaffen; Mich plagen keine Skrupel noch Zweifel, Fürchte mich weder vor Hölle noch Teufel Dafür ist mir auch alle Freud entrissen, Bilde mir nicht ein, was Rechts zu wissen, Bilde mir nicht ein, ich könnte was lehren, Die Menschen zu bessern und zu bekehren. Auch hab ich weder Gut noch Geld, Noch Ehr und Herrlichkeit der Welt; Es möchte kein Hund so länger leben! Drum hab ich mich der Magie ergeben, Ob mir durch Geistes Kraft und Mund Nicht manch Geheimnis würde kund; Dass ich nicht mehr mit saurem Schweiss Zu sagen brauche, was ich nicht weiss; Dass ich erkenne, was die Welt Im Innersten zusammenhält, Schau alle Wirkenskraft und Samen, Und tu nicht mehr in Worten kramen. O sähst du, voller Mondenschein, Zum letztenmal auf meine Pein, Den ich so manche Mitternacht An diesem Pult herangewacht. Dann über Büchern und Papier, Trübselger Freund, erschienst du mir! Ach! könnt ich doch auf Bergeshöhn In deinem lieben Lichte gehn, Um Bergeshöhle mit Geistern schweben, Auf Wiesen in deinem Dämmer weben, Von allem Wissensqualm entladen, In deinem Tau gesund mich baden!Weh! steck ich in dem Kerker noch? Verfluchtes dumpfes Mauerloch, Wo selbst das liebe Himmelslicht Trüb durch gemalte Scheiben bricht! Beschränkt mit diesem Bücherhauf, den Würme nagen, Staub bedeckt, Den bis ans hohe Gewölb hinauf Ein angeraucht Papier umsteckt; Mit Gläsern, Büchsen rings umstellt, Mit Instrumenten vollgepfropft, Urväter Hausrat drein gestopft Das ist deine Welt! das heisst eine Welt!Und fragst du noch, warum dein Herz Sich bang in deinem Busen klemmt? Warum ein unerklärter Schmerz Dir alle Lebensregung hemmt? Statt der lebendigen Natur, Da Gott die Menschen schuf hinein, Umgibt in Rauch und Moder nur Dich Tiergeripp und Totenbein.Flieh! auf! hinaus ins weite Land! Und dies geheimnisvolle Buch, Von Nostradamus eigner Hand, Ist dir es nicht Geleit genug? Erkennest dann der Sterne Lauf, Und wenn Natur dich Unterweist, Dann geht die Seelenkraft dir auf, Wie spricht ein Geist zum andren Geist. Umsonst, dass trocknes Sinnen hier Die heilgen Zeichen dir erklärt. Ihr schwebt, ihr Geister, neben mir; Antwortet mir, wenn ihr mich hört! (Er schlägt das Buch auf und erblickt das Zeichen des Makrokosmus.)Ha! welche Wonne fliesst in diesem Blick Auf einmal mir durch alle meine Sinnen! Ich fühle junges, heilges Lebensglück Neuglühend mir durch Nerv und Adern rinnen. War es ein Gott, der diese Zeichen schrieb, Die mir das innre Toben stillen, Das arme Herz mit Freude füllen, Und mit geheimnisvollem Trieb Die Kräfte der Natur rings um mich her enthüllen? Bin ich ein Gott? Mir wird so licht! Ich schau in diesen reinen Zügen Die wirkende Natur vor meiner Seele liegen. Jetzt erst erkenn ich, was der Weise spricht. "Die Geisterwelt ist nicht verschlossen; Dein Sinn ist zu, dein Herz ist tot! Auf, bade, Schüler, unverdrossen Die irdsche Brust im Morgenrot!" (er beschaut das Zeichen.) Wie alles sich zum Ganzen webt, Eins in dem andern wirkt und lebt! Wie Himmelskräfte auf und nieder steigen Und sich die goldnen Eimer reichen! Mit segenduftenden Schwingen Vom Himmel durch die Erde dringen, Harmonisch all das All durchklingen! Welch Schauspiel! Aber ach! ein Schauspiel nur! Wo fass ich dich, unendliche Natur? Euch Brüste, wo? Ihr Quellen alles Lebens, An denen Himmel und Erde hängt, Dahin die welke Brust sich drängt Ihr quellt, ihr tränkt, und schmacht ich so vergebens? (er schlägt unwillig das Buch um und erblickt das Zeichen des Erdgeistes.) Wie anders wirkt dies Zeichen auf mich ein! Du, Geist der Erde, bist mir näher; Schon fühl ich meine Kräfte höher, Schon glüh ich wie von neuem Wein. Ich fühle Mut, mich in die Welt zu wagen, Der Erde Weh, der Erde Glück zu tragen, Mit Stürmen mich herumzuschlagen Und in des Schiffbruchs Knirschen nicht zu zagen. Es wölkt sich über mir Der Mond verbirgt sein Licht Die Lampe schwindet! Es dampft! Es zucken rote Strahlen Mir um das HauptEs weht Ein Schauer vom Gewölb herab Und fasst mich an! Ich fühls, du schwebst um mich, erflehter Geist Enthülle dich! Ha! wies in meinem Herzen reisst! Zu neuen Gefühlen All meine Sinnen sich erwühlen! Ich fühle ganz mein Herz dir hingegeben! Du musst! du musst! und kostet es mein Leben! (Er fasst das Buch und spricht das Zeichen des Geistes geheimnisvoll aus. Es zuckt eine rötliche Flamme, der Geist erscheint in der Flamme.)'
 print_percentages(count_letters(faust)) print_percentages(count_letters(faust))
-</code>+</bottom-editor></html>
 ++++ ++++
 </nodisp> </nodisp>
Zeile 309: Zeile 304:
 ##### Option 2: Häufigkeitsanalyse von ganzem Buch (anspruchsvoll) ##### Option 2: Häufigkeitsanalyse von ganzem Buch (anspruchsvoll)
  
-Wie in Option 1, nur soll anstelle eines einzelnen Strings ein ganzes Buch eingelesen und analysiert werden. Auf [[https://www.gutenberg.org|Project Gutenberg]] findest du über $60'000$ gratis Ebooks. Wähle ein Buch aus und klicke dann auf "Plain Text UTF-8". Das Buch erscheint dann im einfachen Textformat direkt im Browser. Über den dazugehörigen Linkkannst du das Buch direkt in Python einlesen:+Wie in Option 1, nur soll anstelle eines einzelnen Strings ein ganzes Buch eingelesen und analysiert werden. Auf [[https://www.gutenberg.org|Project Gutenberg]] findest du über $60'000$ gratis Ebooks. Wähle ein Buch aus und klicke dann auf "Plain Text UTF-8". Das Buch erscheint dann im einfachen Textformat direkt im Browser. Über den dazugehörigen Link kannst du das Buch direkt in Python einlesen.
  
-<code python+Damit das auch im Browser funktioniert, können die Texte auch von folgenden Orten benutzt werden: 
-from urllib.request import urlopen +  * Erste 5000 Zeichen von Faust: [[https://bottom.ch/ksr/crypto/faust_5000.txt]] 
-count 0 +  * Gesamter Faust 1 (ca. 220KB): [[https://bottom.ch/ksr/crypto/faust.txt]] 
-data urlopen(<Pfad zur Datei>+  * Manns "Tod in Venedig" (ca. 190KB): [[https://bottom.ch/ksr/crypto/tod_in_venedig.txt]] 
-text data.read().decode('utf-8' # reads all downloaded bytes, convert to text + 
-</code>+<html><bottom-editor
 +from pyodide.http import pyfetch 
 +url 'https://bottom.ch/ksr/crypto/faust_5000.txt' 
 +response await pyfetch(url
 +faust await response.text() 
 + 
 +print(faust[:116]
 +</bottom-editor></html>
  
 Kontrolle: am häufigsten vorkommen sollte $E$ (gut $15\%$), gefolgt von $N$ (ca. $10\%$) und $S$. Die letzten Ränge machen typischerweise $Y$, $Q$ und $X$ unter sich aus. Kontrolle: am häufigsten vorkommen sollte $E$ (gut $15\%$), gefolgt von $N$ (ca. $10\%$) und $S$. Die letzten Ränge machen typischerweise $Y$, $Q$ und $X$ unter sich aus.
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung mit Gutenberg| ++++Lösung mit Gutenberg|
-<code python+<html><bottom-editor
-# Rest as above+import string 
-from urllib.request import urlopen + 
-  +def normalize(text): 
-faust urlopen('http://www.gutenberg.org/files/21000/21000-0.txt') +    """Replaces umlauts with base characters, and lower-case variants.""" 
-sfaust.read().decode('utf-8'+    text = text.lower() 
-print_percentages(count_letters(s)) +    text = text.replace('ä', 'a') 
-</code>+    text text.replace('ö', 'o'
 +    text = text.replace('ü', 'u'
 +    return text 
 +     
 +def count_letters(text): 
 +    """Computes relative frequency of lower-case ASCII letters in text.""" 
 +    # 1: Prepare empty data 
 +    alphabet = string.ascii_lowercase 
 +    counts = [0] * len(alphabet)  # Creates [0, 0, ..., 0] 
 +    total = 0 
 +     
 +    # 2: Count occurrences 
 +    for letter in text: 
 +        letter = normalize(letter) 
 +        index = alphabet.find(letter) 
 +        # find() returns negative numbers if not found 
 +        # (punctuation etc.) -> ignore these. 
 +        if index >= 0: 
 +            counts[index] = counts[index] + 1 
 +            total = total + 1 
 +     
 +    # 3: Divide by total to get relative frequencies. 
 +    for i in range(len(counts)): 
 +        counts[i] = counts[i] / total 
 +     
 +    return counts 
 + 
 +def print_percentages(counts): 
 +    """Pretty-print frequency data.""" 
 +    for i in range(len(counts)): 
 +        letter = string.ascii_lowercase[i] 
 +        percent = counts[i] 
 +        # Print the letter with width 2 
 +        # Print the frequency with width 6 and precision 2, in percent format. 
 +        print(f"{letter:2}{percent:6.2%}"
 + 
 +from pyodide.http import pyfetch 
 +url = 'https://bottom.ch/ksr/crypto/faust.txt' 
 +response await pyfetch(url) 
 +faust = await response.text() 
 +print_percentages(count_letters(faust)) 
 + 
 +</bottom-editor></html> 
 ++++ ++++
 </nodisp> </nodisp>
  • gf_informatik/verschluesselung/caesar.1772518761.txt.gz
  • Zuletzt geändert: 2026-03-03 06:19
  • von hof