dh-Materialien
Maple   
Anwendungen

Textverschlüsselung nach Vigenère

> restart; with(StringTools):

Der zu verschlüsselnde Klartext:

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

vigenere1 

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