Bergervei/Caesar-Verschlüsselung

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SchemeJS</language>
<code id="5bc3035bb1d9a" hidden>
(define mod
  (lambda (n m)
    (if (< n 0)
        (- m (modulo (abs n) m))
        (modulo n m))))

(define string-car
  (lambda (str)
    (string-ref str 0)))

(define string-cdr
  (lambda (str)
    (substring str 1 (string-length str))))

(define char-pos
  (lambda (z str)
    (letrec 
        ([pos
          (lambda (n str)
            (cond
              [(= (string-length str) 0) 0]
              [(equal? z (string-car str)) n]
              [else
               (pos (+ n 1) (string-cdr str))]))])
      (pos 1 str))))

(define pos-char
  (lambda (n str)
    (string-ref str (mod (- n 1) (string-length str)))))

(define char-cons
  (lambda (z str)
    (string-append (string z) str)))

(define char-in-string?
  (lambda (z str)
    (cond
      [(= (string-length str) 0) #f]
      [(equal? z (string-car str)) #t]
      [else
       (char-in-string? z (string-cdr str))])))

(define korrekt?
  (lambda (str)
    (and (char-in-string? (string-car str) alphabet) (= (string-length str) 1))))
</code>

== Monoalphabetische Verschlüsselung ==

[[Bild:Caesar_Verschiebung.png|miniatur|hochkant=1.5|Schematische Darstellung einer Verschiebung um drei Buchstaben]]
[[Bild:Julius_Caesar.jpg|miniatur|links|Gaius Julius Caesar]]
Bei der monoalphabetischen Verschlüsselung wird jeder Buchstabe des Klartexts auf einen Geheimtextbuchstaben abgebildet. Diese Abbildung ergibt sich, indem man die Zeichen eines geordneten Alphabets um eine bestimmte Anzahl zyklisch nach rechts verschiebt (rotiert), d.h. beim Verschieben über Z hinaus bei A beginnend weiterzählt. Die Anzahl der verschobenen Zeichen bildet den Schlüssel, der für die gesamte Verschlüsselung unverändert bleibt. Als Schlüsselbuchstaben bezeichnen wir den Anfangsbuchstaben des "Geheimalphabets", das aus dem Klaralphabet durch Verschieben um den Schlüssel hervorgegangen ist.

Der Name der Caesar-Verschlüsselung leitet sich vom römischen Feldherrn '''Gaius Julius CAESAR''' (* 13. Juli 100 v. Chr.; † 15. März 44 v. Chr.) ab, der nach der Überlieferung diese Art der geheimen Kommunikation für seine militärische Korrespondenz verwendet hat. Dabei benutzte er eine Verschiebung des Alphabets um drei Buchstaben.

== Implementation ==

Zunächst definieren wir das zulässige Alphabet, bestehend aus Groß- und Kleinbuchstaben sowie Ziffern. Um Textstrukturen zu erhalten, wollen wir die Sonderzeichen nicht in die Verschlüsselung einbeziehen.<br />
Den Schlüsselbuchstaben entspricht einer Zeichenkette mit der Länge 1. 
Das Ver- und Entschlüsseln soll mit den gleichen Prozeduren erfolgen. Lediglich "verschiedene Richtungen" müssen dabei berücksichtigt werden. 

<code id="5bc3035bb1e14">
(define gross "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
(define klein "abcdefghijklmnopqrstuvwxyz")
(define number "1234567890")
(define sonder ".,;:!? ")
(define platzhalter #\*)
(define alphabet (string-append gross klein number))

(define vor +)
(define rueck -)

(define wandeln
  (lambda (z step)
    (cond
      [(char-in-string? z sonder) z]
      [(char-in-string? z alphabet)
       (let ([pos (modulo (+ (char-pos z alphabet) step -1) (string-length alphabet))])
         (string-ref alphabet pos))]
      [else
       platzhalter])))

(define codieren
  (lambda (str key richtung)
    (if (= (string-length str) 0) 
        ""
        (let ([step (+ (char-pos key alphabet) 1)])
         (char-cons (wandeln (string-car str) (richtung step)) 
                    (codieren (string-cdr str) key richtung))))))
</code>

Wir legen einen gültigen Schlüsselbuchstaben fest:

<code id="5bc3035bb1e87">
(define schluesselbuchstabe "B")
</code>

<check>
(korrekt? schluesselbuchstabe) 
</check>

Wir verschlüsseln nun einen einfachen Text:

<code id="5bc3035bb1ee8">
(define klartext "Das ist ein brisanter Informatik-Text!")
(define geheimtext (codieren klartext schluesselbuchstabe vor))
</code>

<run id="5bc3035bb1f58">
geheimtext
</run>