dh-Materialien
Einführung in Maple    
Anwendungen
 

Textverschlüsselung nach Vigenère

> restart; with(StringTools):

Der zu verschlüsselnde Klartext:

> plaintxt:="Dieser Text ist ganz geheim.";

plaintxt 

ASCII-Kodierung einiger Zeichen in dezimaler Schreibweise:

> Ord("A");
  Ord("a");
  Ord("0");

65
97
48 

Herstellung der ersten Zeile eines Vigenère-Quadrates:

> extra:= [32, 33, 34, 39, 40, 41, 44, 46, 61, 62, 63, 91, 93]:
  charlst:= "":
  j:= 0:
  for i from 1 to 26 do
    charlst:= cat(charlst, Char(i+64), Char(i+96)):
    if (i mod (2) = 0) then
      charlst:= cat(charlst, Char(j+48), Char(op(j+1, extra))):
      j:= j+1:
    fi:
  od:
  charlst; 

Alphabet

Definition des zu verwendenden Schlüssels:

> key:= "m=Iq?b!"; 

key

Der Verschlüsselungsalgorithmus:

> encode:= proc(txt, lst, key)
    local i, k, len, pos, leftpart, rightpart,
    keystr, code, keyrow;

    len:= length (txt):
 
    #
    keyrow:= "":
    while (length(keyrow) < len) do
      keyrow:= cat(keyrow, key):
    od:
    keyrow:= substring(keyrow, 1..len):
    # dient nur zur Veranschaulichung des Verfahrens
    
    printf("%s%s\n", " ", txt);
    printf("%s%s\n\n", " ", keyrow);
    printf("%s%s\n", " ", lst);

    k:= length(key):
    len:= length(lst):

    for i from 1 to k do
      pos:= SearchText(key[i],lst);
      rightpart:= substring(lst, pos..len);
      leftpart:= substring(lst, 1..pos-1);
      keystr[i]:= cat(rightpart, leftpart);
      printf("%s%s\n", " ", keystr[i]);
    od;

    code:= "";
    for i from 1 to length(txt) do
      pos:= SearchText(txt[i], lst):
      code:= cat(code, keystr[((i-1)mod(k))+1][pos]);
    od:
    printf("\n%s%s", " ", code):
    RETURN (code);
  end:

Verschlüsselung des anfangs definierten Klartextes:

> code:= encode(plaintxt, charlst, key):

Die relevanten Vigenere-Zeilen

Algorithmus zur Dekodierung des Vigenère-Geheimtextes mit bekanntem Schlüssel:

> decode:= proc(code, lst, key)
    local i, k, len, pos, leftpart, rightpart,
    keystr, plaintxt;

    len:= length (lst):
    k:= length(key):

    for i from 1 to k do
      pos:= SearchText(key[i], lst);
      rightpart:= substring(lst, pos..len);
      leftpart:= substring(lst, 1..pos-1);
      keystr[i]:= cat(rightpart, leftpart);
    od;

    printf ("\n%s%s\n", " ", code):
 
    plaintxt:= "";
    for i from 1 to length(code) do
      pos:= SearchText(code[i], keystr[((i-1)mod(k))+1]):
      plaintxt:= cat(plaintxt, lst[pos]);
    od:
    printf("\n%s%s", " ", plaintxt):
    RETURN (plaintxt);
  end:

Entschlüsselung des eben produzierten Geheimtextes:

> plaintxt:= decode(code, charlst, key):

Decoding

Vigenère (1523-1596) hat ursprünglich für die erste Quadratzeile die folgende Zeichenkette verwendet:

> charlst:= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

charlst

Definition eines Schlüssels:

> key:= "SCHLUESSEL";

key

Kodierung und Dekodierung eines Textes:

> plaintxt:= "IMSECHZEHNTENJAHRHUNDERTWARDIESNICHTZUKNACKEN":
  code:= encode(plaintxt, charlst, key):
  decode(code, charlst, key):

Viginere-Tableau


 Home   Back   Top