Track Crypto

Diese Coding-Spur leitet durch einfache Programmieraufgaben im Themenfeld Kryptologie - sowohl aus dem Bereich der Kryptographie als auch der Kryptoanalyse.

Der römische Feldherr und Kaiser Julius Cäsar (100-44 v. Chr.) hat für seine militärische und staatliche Kommunikation bei Bedarf eine Verschlüsselung eingesetzt. Dabei hat er das Alphabet um 3 Buchstaben verschoben: dabei wird z.B. A zu D und Y zu B.

Diese Chiffre ist eine symmetrische monoalphabetische Substitutionschiffre. Symmetrisch, weil der Schlüssel für die Verschlüsselung wie auch die Entschlüsselung gleich ist und monoalphabetisch, weil ein Buchstabe immer durch das selbe Zeichen ersetzt wird.

Aufgabe: Erweitern Sie den untenstehenden Basiscode in Etappen, damit Sie zum Schluss eine Chiffrierhilfe nach folgendem Vorbild erhalten:

  1. Testen und analysieren Sie den Basiscode und begründen Sie, warum der folgende Codeausschnitt notwendig wird:
    (schluessel[i] + rot) % 26
  2. Codieren Sie analog eine zweite Buchstabenleiste "Geheimtext" in rot und ergänzen Sie Verbindungslinien.
  3. Stellen Sie sicher, dass die Verschiebung nicht fix um drei Zeichen vorgenommen wird, sondern dass der Wert des Sliders übernommen und der Sketch interaktiv wird. Tipp: Zugriff auf den Sliderwert mit:
    rotSlider.value()
  4. Ergänzen Sie unten noch weitere vier Zeilen mit Feldern, damit Sie eine Chiffrierhilfe erhalten, die Sie mit Taste 's' als Bild speichern können.
  5. Speichern Sie eine persönliche Chiffrierhilfe und benutzen Sie diese digital oder auf Papier zum Chiffrieren eines kurzen Satzes.

Basiscode


let schluessel = [];
let s = 25;
let rotSlider;
let rot = 13;

function setup() {
  createCanvas(652, 320);
  rotSlider = createSlider(0, 25, 3, 1);
  rotSlider.position(width-210, 105);
  rotSlider.style("width", "200px");
  for (let i=0; i<26; i++) {
    schluessel.push(i);
  }
  console.log(schluessel);
  textSize(16);
}

function draw() {
  background(245);
  translate(1, 0);

  // Klartext Buchstabenleiste
  for (let i=0; i<26; i++) {
    noFill();
    stroke(70);
    rect(i*s, s, s, s);
    fill(40, 40, 200);
    noStroke();
    textAlign(CENTER, CENTER);
    text(char(i+65), i*s, s, s, s);
    textAlign(LEFT);
    text("Klartext", 3, 0.6*s);
    // Verbindungslinien
	
  }

  // Geheimtext Buchstabenleiste


  // Platzhalter Codierung
  
  
}

Referenzlinks

Mit einem Ersetzungscode verschlüsselte Nachrichten lassen sich einer Häufigkeitsanalyse unterziehen. Ein derartiges Analysetool wollen wir programmieren.

Aufgabe: Erweitern Sie den Basiscode mit Hilfe folgender Etappen:

  1. Stellen Sie im Hintergrund die durchschnittliche Häufigkeit der Buchstaben in deutschen Texten als graue Säulen dar. Die Häufigkeiten finden sind im Array charsDE.
  2. Stellen Sie für alle Buchstaben des analysierten Textes die entsprechende Häufigkeit als blaue Säule dar.
  3. Geben Sie dem Slider eine andere Funktion, er soll die Darstellung des blauen Säulensets um n Positionen verschieben. Damit können Verschiebechiffren einfach erkannt werden.

Basiscode


let myTextarea;
let mySlider;
let aktIndex;
let charsDE = [6.166, 2.293, 2.773, 4.447, 17.756, 1.725, 2.689, 3.743, 7.886, 0.239, 1.446, 4.019, 2.846, 9.742, 3.125, 1.405, 0.083, 6.831, 6.444, 6.216, 3.869, 0.893, 1.471, 0.299, 0.296, 1.267];
let b = 24;

function setup() {
  createCanvas(640, 320);
  mySlider = createSlider(0, 25, 7, 1);
  mySlider.position(width-210, 15);
  mySlider.style("width", "200px");
  myTextarea = createElement("textarea", "Aus nur Buchstaben bestehender Text für die Analyse hierhin kopieren oder hier eingeben");
  myTextarea.style("width", "630px");
  myTextarea.style("height", "60px");
  textSize(24);
  textAlign(CENTER);
}

function draw() {

  background(245);
  aktIndex = mySlider.value();
  fill(80, 80, 255);
  textSize(16);
  text(aktIndex, width-225, 32);
  // alle Buchstaben anzeigen
  fill(30);
  for (let i=0; i<26; i= i+1) {
    text(char(i + 65), 20+i*b, 70);
  }

  // durchschnittliche Häufigkeit der Buchstaben aus dem Array charsDE ausgeben


  // Eingabetext aufbereiten
  let eingabeText = myTextarea.value();
  eingabeText = eingabeText.replaceAll(' ');
  eingabeText = eingabeText.toUpperCase();

  // Anzahl Vorkommen eines einzelnen Buchstabens im Eingabetext zählen
  let anzahl = 0;
  for (let j=0; j < eingabeText.length; j=j+1) {
    if (eingabeText.charCodeAt(j)-65 ==  aktIndex) {
      anzahl = anzahl + 1;
    }
  }

  // Berechnungen
  fill(90);
  textSize(16);
  text(anzahl, 20+aktIndex*b, 100);
  let haeufigkeit = anzahl / eingabeText.length;
  text(nf(haeufigkeit, 1, 2), 20+aktIndex*b, 125);

  // Häufigkeit als Säule ausgeben
  fill(80, 80, 255, 127);
  let hoehe = map(haeufigkeit, 0, 0.2, 0, 160);
  rect(10+aktIndex*b, height-hoehe, 20, hoehe);
}

Referenzlinks

Die Cäsar Verschiebechiffre kann durch Umstellung (Permutation) des Geheimtextalphabetes zu einer Ersetzungschiffre verbessert werden. Neu wird jedes Zeichen des Klartextalphabetes mit einem bestimmten, fixen Buchstaben chiffriert.

Aufgabe: Erweitern Sie den untenstehenden Basiscode in Etappen, damit Sie zum Schluss eine Chiffrierhilfe folgender Art erstellen können:

  1. Setzen Sie beim Basissketch verschiedene Codewörter. Wie wird die Ersetzungschiffre beeinflusst? Warum macht eine derartige Eingabemöglichkeit Sinn?
  2. Ergänzen Sie die fehlende Buchstabescheibe für die Ablesung der Geheimzeichen.
  3. Übernehmen Sie aus dem vorherigen Sketch den Slider. Lassen Sie die rote Scheibe entsprechend des Sliders rotieren.
  4. Ergänzen Sie eine Möglichkeit die Zeichenfläche (Canvas) per Tastendruck zu speichern.
  5. Erstellen Sie sich nun eine persönliche Chiffrierhilfe mit einem langen Codewort. Wie sicher ist eine derartige Substitutions-Chiffre?

Basiscode


let schluesselSet = [];
let schluessel = [];
let s = 25;
let rot = 3;
let btnInput;
let myInput;
let cWort = '';

function setup() {
  createCanvas(652, 480);
  myInput = createInput();
  myInput.style("width", "380px");
  btnInput = createButton('Wort setzen...');
  btnInput.mousePressed(myEvent);
  myEvent();
}

function draw() {
  background(245);
  translate(1, 0);
  textSize(16);
  for (let i=0; i<26; i++) {
    // Klartext  Buchstabenleiste
    noFill();
    stroke(70);
    rect(i*s, s, s, s);
    fill(40, 40, 200);
    noStroke();
    textAlign(CENTER, CENTER);
    text(char(i+65), i*s, s, s, s);
    textAlign(LEFT);
    text("Klartext", 3, 15);

    // Geheimtext Buchstabenleiste
    noFill();
    stroke(70);
    rect(i*s, 3*s, s, s);
    fill(200, 40, 40);
    textAlign(CENTER, CENTER);
    noStroke();
    text(char(schluessel[i]+65), i*s, 3*s, s, s);
    textAlign(LEFT);
    text("Geheimtext", 3, 110);
    stroke(170);

    // Verbindungslinien
    line(i*s+s/2, 53, i*s+s/2, 72);
  }
  
  // Koordinaten-Ursprung verschieben  
  textAlign(CENTER);
  translate(width/2, 0.63*height);

  
  // Scheibe Klartext
  fill(240, 240, 255);
  stroke(170);
  circle(0, 0, 230);
  noStroke();

  for (i=0; i<26; i=i+1) {
    translate(100, 0);
    rotate(HALF_PI);
    fill(40, 40, 200);
    textSize(24);
    text(char(i+65), 0, 0);
    rotate(-HALF_PI);
    translate(-100, 0);
    rotate(TWO_PI/26.0);

    // Mittelpunkt
    noFill();
    stroke(70);
    circle(0, 0, 10);
  }    
}

function myEvent() {
  schluesselSet = [];
  for (let i=0; i<26; i++) {
    schluesselSet.push(i);
  }
  schluessel = [];
  cWort = myInput.value().toUpperCase();

  //Eingegebene Buchstaben setzen
  for (let i = 0; i > cWort.length; i=i+1) {
    let pos = cWort.charAt(i);
    let buchstabenPos = cWort.charCodeAt(i)-65;
    if (schluesselSet[buchstabenPos] != -1) {
      schluessel.push(buchstabenPos);
      schluesselSet[buchstabenPos] = -1;
    }
  }
  // nicht verwendete Buchstaben anfügen, d.h. wenn != -1
  for (let i = 0; i < schluesselSet.length; i=i+1) {
    if (schluesselSet[i] != -1) {
      schluessel.push(i);
    }
  }
}

Referenzlinks

Das von Blaise de Vigenère (1523-1596) entwickelte Verfahren verschlüsselt ein Buchstabe in der Regel mit verschiedenen Buchstaben und wird entsprechend als polyalphabetisches Chiffrierverfahren bezeichnet. Dieses Verfahren galt lange Zeit als unknackbar.

Aufgabe I: Studieren Sie die Funktionsweise des Vigenère Verfahrens mit Hilfe der folgenden Simulation: Vigenère Simulation.

Aufgabe II: Analysieren und Verwenden Sie den folgenden Sketch:

  1. Codieren Sie einen Satz mit einem Schüssel der Länge vier und decodieren Sie diesen anschliessend.
  2. Entfernen Sie vor dem Decodieren einen Buchstaben aus Ihrem Chiffrat. Was beobachten Sie?
  3. Analysieren Sie im Sketchcode, wie das Chiffrieren und Dechiffrieren gelöst ist. Welchen Zweck erfüllt die Variable "richtung"?
  4. Chiffrieren Sie einen längeren Text mit Hilfe einem Schlüssel der Länge fünf. Sichern Sie dieses Chiffrat für die weitere Arbeit.
  5. Klären Sie mit Hilfe der Referenzlinks, was die folgende Codezeile bedeutet:
    let aktKeyCode = aktKey.charCodeAt(i%aktKey.length)-65
  6. Auf der Zeile zum Decodieren wird eine Problematik des Modulo Operators umschifft. Studieren Sie dazu in den Mozilla Developer Docs die Restoperation (remainder operator). Welcher einfache Kniff garantiert die korrekte Dechiffrierung?

Basiscode


let btnCode;
let btnDecode;
let inputArea;
let outputArea;
let schluessel;
let aktIndex;

function setup() {
  noCanvas();
  createElement("h2", "Vigenère Chiffre");  
  createP('Schlüssel:');
  schluessel = createInput("KEY");
  schluessel.style("width", "300px");
  btnCode = createButton("codieren...");
  btnCode.mousePressed(chiffrieren);
  btnDecode = createButton("decodieren...");
  btnDecode.mousePressed(dechiffrieren);
  createP('Eingabe:');
  inputArea = createElement("textarea", "Eingabe");
  inputArea.style("width", "630px");
  inputArea.style("height", "60px");
  createP('Ausgabe:');
  outputArea = createElement("textarea", "---");
  outputArea.style("width", "630px");
  outputArea.style("height", "60px");
  let absaetze = selectAll('p');
  for (let i = 0; i < absaetze.length; i += 1) {
    absaetze[i].style("margin", "0.5em 0 0.1em 0");
  }
  textSize(24);
  textAlign(CENTER);
}

function draw() {
  background(245);
  aktIndex = mySlider.value();
  fill(80, 80, 255);
  textSize(16);
  text(aktIndex, width-235, 32);
  // alle Buchstaben anzeigen
  fill(30);
  for (let i=0; i<26; i= i+1) {
    text(char(i + 65), 20+i*24, 70);
  }
}

function chiffrieren() {
  vigenere(true);
}

function dechiffrieren() {
  vigenere(false);
}

function vigenere(richtung) {
  let aktKey = schluessel.value();
  aktKey = aktKey.replaceAll(' ', '');
  aktKey = aktKey.toUpperCase();
  schluessel.value(aktKey);

  let aktInput = inputArea.value();
  aktInput = aktInput.replaceAll(' ', '');
  aktInput = aktInput.toUpperCase();
  inputArea.value(aktInput);

  let geheimtext = "";
  if (aktKey.length == 0) {
    alert("Bitte Schlüssel erfassen.");
  } else {
    if ( aktInput.length == 0) {
      alert("Bitte Eingabetext erfassen.");
    } else {
      for (let i= 0; i < aktInput.length; i=i+1) {
        let aktKeyCode = aktKey.charCodeAt(i%aktKey.length)-65;
        let aktCharCode = aktInput.charCodeAt(i)-65;
        if (richtung == true) {
          geheimtext = geheimtext + char((aktCharCode + aktKeyCode)%26 + 65) ;
        } else {
          geheimtext = geheimtext + char((aktCharCode - aktKeyCode+26)%26 + 65) ;
        }
      }
      outputArea.value(geheimtext);
    }
  }
}

Referenzlinks

Auch bei der Vigenère Chiffre hilft eine Häufigkeitsanalyse. Der preussische Major Friedrich Wilhelm Kasiski veröffentlichte 1863 die entscheidende Idee zum Brechen des Vigenère Codes. Er suchte den Geheimtext nach sogenannten Dubletten ab, sich wiederholenden Buchstabenfolgen unterschiedlicher Länge. Aus den beobachteten Abständen errechnete er den grössten gemeinsamen Teiler und deutete diesen als wahrscheinliche Schlüssellänge. Studieren Sie diese Idee mit Hilfe der folgenden Aufgaben:

  1. Analysieren Sie Ihr Vigenère Chiffrat aus TC04 auf Dubletten mit Hilfe des Interactives Vigenère Dubletten. Erhalten Sie Hinweise auf die verwendete Schlüssellänge?
  2. Analysieren die Buchstabenhäufigkeiten in Ihrem Chiffrat mit Hilfe der folgenden Simulation: Vigenère Analyse
  3. Was wäre, wenn Sie einen 20-stelligen Schlüssel verwendet hätten?
  4. Hätten Sie als Schlüssel einen Text eingesetzt, der gleichlang wie der Klartext ist, hätten Sie eine One Time Pad (OTP) Verschlüsselung umgesetzt. Deren Sicherheit gilt als "perfekt". Studieren Sie den entsprechenden Abschnitt "Sicherheit" auf Wikipedia OPT Sicherheit.
  5. Versuchen Sie nun einen der vier folgenden Beispieltexte zu knacken. Die Texte stehen im Dubletten-Tool unter den Tasten [6] bis [9] zur Verfügung.
    Nach der Dubletten Analyse hilft das OINF-Tool Vigenère-Verschlüsselung knacken weiter. Viel Spass!
    • Taste 6:
      KZSFFXIZSBPIEFYEEIADXSEFTTXTTXCSJAFKFLJLWNGVJIEJNOJSVQACYEIYEDNCSSINMTLZFOJNRJHPNMEJXEZEMJREWARJNONEDNSEGETJIYJRGNGPSECJVPWSNMLFJSDJLFSGXNTPGEYXOWFNRJMDHHWZEDXEWBIPPLLWTPCTOJRQFLW
    • Taste 7:
      OPPKOOSXILSAGTUQFTHYBYORZDSOTEOADSSOOVBUXYDRBTBZFIHGORFOGQJOFWJKSDDXFNVKOOKKOYAGOHSOTDRGTDSOORSNFTAZFIHSJEVGMWCGOQOKORHYPVOTOXOTCPFKJEGBJPFHVNVYULPKOKIUSOBKODCNBWTJFYPXJESTELGYETSJFFHYDSSCFSFSBNVZCPWJFYHGFRZODSTXJDQNWPFYDSZAFDGKMESTFYWMNLAKMOITHPBONXSXETSCPCHKXPHZFCJUSSSXTLUKCPFKJNVYJPPKOGCXBYGZFWZZFY
    • Taste 8:
      YBRRWFLRGUJSUSKULLUWPHUGGNHNUOKLDSJMSAFLGETUWYHEVDVZOZSGBFHVKLHOWWMIUCGPTGSPHLMKGPNGDGLRSOCYDSJUJHZMGZSSDGPNSJGPNSRWMAZDUMOZYGZOYSPUMOFUPCVWKUEBTGSISTKNEBCNHRHWZAGZWKJHSJNHEBYGHUGVGUKSFWUDSJMVEBFVLDSJTPCVLKNEUWYLSSFULIBTGUUHRVTABYGUAIKQSABYGZCVDWLSGWNDISVKLKZSTAELLGBNRNGYWSFFLTRAGZEBMTLIBECSSCKRYIQZVTABNQUOBWVPMSHCKVSJUJHZMGZSSDWUGODUVVCECIRSAUZBZGERBSAFLMXWFLSPDCATBSEODSJXLRKWPKUBYCIGSJKZSSFWUDJWTUIQZVLTKATK
    • Taste 9:
      GCTXSGOAZVHWWYYQAZPRQYCHMUUJDYQMTCIPUAWXDAWPYWYXDXGICYIUMILKZYANLHLLZGKYCEEJCHELHOIPMQE?EEJYCVPDLSPVJFTTGKYLTIKYJEILHSCILNPRIDFHZWRHCEEJGPELHGPEMVWWRIVYWPRIOTSVHHLTVHCCPKDHOKEKFXRIGCKTWLICXMWLTDXGOGNLHHIDGKYXOIQXXDXQOGOIULTDXGYGOMYCHZVKCTCWLYQPRZCGOEOMBZHXFQPDHCRSRHNJYHGCTREQTOLLOCVPVHMIOMYCHTSQEJCDDFHXSGVTKILWWYIWOCOMQJGZKUUBXMHLHAVDWWPRPYXDXPCIPMQYBAVRTTYXCYXNLHHSLVJYHEIOFI

    Fügen Sie in die entschlüsselten Texte die fehlenden Leerzeichen ein und speichern Sie diese Lehrtexte gemeinsam in einem Dokument.

fs in ksw