unit uFenster;
(* ************************************************************************** *)
(* K L A S S E :                                                              *)
(* -------------------------------------------------------------------------- *)
(* Version     : 1.X                                                          *)
(* Autor       : Michael Nicolai (Basis von Siegfried Spolwig)                *)
(* Beschreibung: Das Fenster ist das GUI fuer das Programm CyberKryptoX.      *)
(*               Es stellt den Rahmen für die Ver- und Ent-                   *)
(*               schluesselungen von Texten dar.                              *)
(* Compiler    : Delphi 4.0 + addons                                          *)
(* ************************************************************************** *)

interface
(* ========================================================================== *)
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, StdCtrls, ExtCtrls, uKryptobox;
type
  TFenster = class(TForm)
    KTxPnl              : TPanel;
    GTxPnl              : TPanel;
    KlartextMmo         : TMemo;
    GeheimtextMmo       : TMemo;
    OpenDialog1         : TOpenDialog;
    SaveDialog1         : TSaveDialog;
    MainMenu1           : TMainMenu;
    Label1              : TLabel;
    Label2              : TLabel;
    DateiMnu            : TMenuItem;
    BearbeitenMnu       : TMenuItem;
    KtxLadenMnu         : TMenuItem;
    KtxSpeichernMnu     : TMenuItem;
    KodierenMnu         : TMenuItem;
    DekodierenMnu       : TMenuItem;
    GtxLadenMnu         : TMenuItem;
    GtxSpeichernMnu     : TMenuItem;
    LoeschenKTxMnu      : TMenuItem;
    LoeschenGTxtMnu     : TMenuItem;
    BeendenMmu          : TMenuItem;
    procedure FormCreate (Sender: TObject);
    procedure KtxLadenMnuClick (Sender: TObject);
    procedure KtxSpeichernMnuClick (Sender: TObject);
    procedure KodierenMnuClick (Sender: TObject);
    procedure GtxLadenMnuClick (Sender: TObject);
    procedure GtxSpeichernMnuClick (Sender: TObject);
    procedure DekodierenMnuClick (Sender: TObject);
    procedure LoeschenKTxMnuClick (Sender: TObject);
    procedure LoeschenGTxtMnuClick (Sender: TObject);
    procedure BeendenMmuClick (Sender: TObject);
   private
    procedure DatenAktualisieren(var box : TKryptobox);
    procedure FensterAktualisieren(box : TKryptobox);
  end;
var
  Fenster    : TFenster;
  Kryptobox  : TKryptobox;
implementation
(* ========================================================================== *)
{$R *.DFM}
procedure TFenster.FormCreate (Sender: TObject);
(* ---------------------------------------------------------------------------*)
begin
  Kryptobox := TKryptobox.Create;
  Kryptobox.Init;
end;
procedure TFenster.KtxLadenMnuClick (Sender: TObject);
(* ---------------------------------------------------------------------*)
begin
   with OpenDialog1 do
   begin
    Filter := 'Klartextdateien (*.txt) | *.txt';
    DefaultExt := 'txt';
    if Execute
    then KlartextMmo.Lines.LoadfromFile(OpenDialog1.FileName);
   end;
end;
procedure TFenster.KtxSpeichernMnuClick (Sender: TObject);
(* ---------------------------------------------------------------------*)
begin
  with SaveDialog1 do
  begin
    Filter := 'Textdateien (*.TXT) | *.TXT';
    Options := [ofOverwriteprompt];
    if Execute
    then KlartextMmo.Lines.SaveToFile (FileName);
  end;
end;
procedure TFenster.KodierenMnuClick (Sender: TObject);
(* ---------------------------------------------------------------------*)
begin
  DatenAktualisieren(Kryptobox);
  Kryptobox.Verschluesseln;
  FensterAktualisieren(Kryptobox);
end;
procedure TFenster.GtxLadenMnuClick (Sender: TObject);
(* ---------------------------------------------------------------------*)
begin
  with OpenDialog1 do
  begin
    Filter := 'Kryptdateien (*.krp) | *.krp';
    DefaultExt := 'krp';
    if Execute
    then GeheimtextMmo.Lines.LoadfromFile (FileName);
  end;
end;
procedure TFenster.GtxSpeichernMnuClick (Sender: TObject);
(* ---------------------------------------------------------------------*)
begin
 with SaveDialog1 do
 begin
   Filter := 'KryptDateien (*.krp) | *.krp';
   DefaultExt := 'krp';
   Options := [ofOverwriteprompt];
   if Execute
   then GeheimtextMmo.Lines.SaveToFile (FileName);
 end;
end;
procedure TFenster.DekodierenMnuClick (Sender: TObject);
(* ---------------------------------------------------------------------*)
begin
  DatenAktualisieren (Kryptobox);
  Kryptobox.Entschluesseln;
  FensterAktualisieren (Kryptobox);
end;
procedure TFenster.LoeschenKTxMnuClick (Sender: TObject);
(* ---------------------------------------------------------------------*)
begin
  KlartextMmo.Lines.Clear;
  Kryptobox.SetKlartext('');
end;
procedure TFenster.LoeschenGTxtMnuClick(Sender: TObject);
(* ---------------------------------------------------------------------*)
begin
  GeheimtextMmo.Lines.Clear;
end;
procedure TFenster.BeendenMmuClick (Sender: TObject);
(* ---------------------------------------------------------------------*)
begin
  Fenster.Close;
end;
procedure TFenster.DatenAktualisieren (var box : TKryptobox);
(* ---------------------------------------------------------------------*)
begin
  box.SetSchluessel (Inputbox('Schlüssel','Bitte Schlüssel eingeben :',''));
  box.Setklartext (KlartextMmo.Lines.gettext);
  box.SetGeheimtext (GeheimtextMmo.lines.getText);
end;
procedure TFenster.FensterAktualisieren(box : TKryptobox);
(* ---------------------------------------------------------------------*)
begin
  KlartextMmo.Clear;
  GeheimTextMmo.Clear;
  GeheimtextMmo.lines.Add(box.GetGeheimtext);
  KlartextMmo.Lines.Add(box.GetKlartext);
end;
end.

UNIT uKryptobox;
(* ************************************************************************** *)
(*                                                                            *)
(* K L A S S E : TKryptobox                                                   *)
(* -------------------------------------------------------------------------- *)
(* Version     : 1.X                                                          *)
(* Autor       : Michael Nicolai (Basis Siegfried Spolwig)                    *)
(*                                                                            *)
(* Aufgabe     : Einen Text ver- und entschluesseln nach dem CyberKryptoX-    *)
(*               Verfahren                                                    *)
(*                                                                            *)
(* Compiler    : Delphi 4 + addons                                            *)
(*                                                                            *)
(* ************************************************************************** *)
INTERFACE
(* ========================== Export ======================================== *)
uses dialogs, sysutils;
type
  TKryptobox = class
              private
               Klartext,
               Geheimtext,
               Schluessel: string;
              public
               constructor Init;
               procedure  SetKlartext    (kt : string);
               function   GetKlartext    :     string;
               procedure  SetGeheimtext  (gt : string);
               function   GetGeheimtext  :     string;
               procedure  Verschluesseln;                virtual;
               procedure  Entschluesseln;                virtual;
               procedure  SetSchluessel  (s :  string);  virtual;
              private
               function StrEx(start,ende:integer; str: string) :string;
               function StrVorbehandeln(str : string) :string;
  end;
(* -------------------- B e s c h r e i b u n g -------------------------
Oberklasse     : -
Bezugsklassen  : CText
benutzte Module: -
Methoden
--------
Init
   Aufgabe: Alle benoetigten Objekte initialisieren
   vorher : -
   nachher:
Verschluesseln
  Aufgabe: Klartext verschluesseln
  vorher : init. und Klartext existiert.
  nachher: Text ist chiffriert
Entschluesseln
  Aufgabe: Geheimtext entschluesseln
  vorher : init. und Geheimtext existiert.
  nachher: Text ist dechiffriert
Vorbehandeln;
   Aufgabe: Rohtextlänge gegebenfalls auf gerade Anzahl erhöhen.
   vorher : Text ist nicht vorbehandelt.
   nacher : Originaltext bleibt erhalten und wird geg. nur um ein Leerzeichen
            ergänzt.
Schluesselcode;
   Aufgabe: Erzeugen eines Zahlenstrings auf Grundlage des Schluessels.
   vorher : Schluessel ist vorhanden.
   nachher: Zahlenstring liegt vor als Schluesselcode.
StrEx;
   Aufgabe: Extrahieren eines Teilstrings aus einem Quellstring mit Von-Bis-
            Position. Ausgabe des Teilstrings. Ersetzt die komische SubString-
            Methode!
   vorher : Quellstring vorhanden.
   nacher : Teilstring ist Ergebnis.
Set- und Getmethoden erübrigen sich...
----------------------------------------------------------------------- *)
IMPLEMENTATION
(* ========================================================================== *)
constructor TKryptobox.Init;
(* -------------------------------------------------------------------------- *)
begin
  Klartext   := '';
  Geheimtext := '';
  Schluessel := '';
end;
procedure TKryptobox.SetKlartext (kt : string);
(* -------------------------------------------------------------------- *)
begin
  Klartext := kt;
end;
function TKryptobox.GetKlartext : string;
(* -------------------------------------------------------------------- *)
begin
  Result := Klartext;
end;
procedure TKryptobox.SetGeheimtext (gt : string);
(* -------------------------------------------------------------------- *)
begin
  Geheimtext := gt;
end;
function TKryptobox.GetGeheimtext : string;
(* -------------------------------------------------------------------- *)
begin
  Result := Geheimtext;
end;
procedure TKryptobox.SetSchluessel (s : string);
(* -------------------------------------------------------------------- *)
begin
  Schluessel := s;
end;
function TKryptobox.StrEx(Start,Ende : integer; Str: string) :string;
(* -------------------------------------------------------------------- *)
var StrHilf : string;
          i : integer;
begin
 Strhilf:='';
 for i:=start to Ende do      // For Schleife mit von - bis Position
  begin
   StrHilf:=StrHilf+Str[i];   // Auslesen des Quellstrings in StrHilf
  end;
 result:=StrHilf;
end;
function TKryptobox.StrVorbehandeln(str : string) :string;
(* -------------------------------------------------------------------- *)
var StrLaenge,i : integer;
    StrHilf     : string;
begin
 Strlaenge:= Length(Str);
 {StrHilf:='';                        // Asci Zeichensätze sind überall anders
 For i:=1 to StrLaenge do             // so kommt die Transkryption fehlerhaft
  begin                               // zustande, da auch Leerzeichen gelöscht
   If ord(Str[i])>32                  // werden!
   Then StrHilf:=StrHilf+Str[i];
  end;
 Str:=StrHilf;}
 If odd(StrLaenge) Then Str:=Str+' ';
 result:=Str;
end;
procedure TKryptobox.Verschluesseln;
(* -------------------------------------------------------------------- *)
var Str,StrHilf,StrRest : string;
    Start,Ende,i                 : integer;
begin
  Geheimtext:='';
  Str:=GetKlartext;
  Str:=Str+Schluessel;        // Schlüssel anhängen zum mitverschlüsseln
  Str:=StrVorbehandeln(Str);  // Stringlänge gerade machen
  Start:=1;
  Ende:=2;
  StrHilf:=Str;               // Originalstring kopieren
  For i:=1 to (length(Str) div 2) do
   begin
    Strhilf:=StrEx(((Ende div 2)+1),Ende,StrHilf)+StrEx(Start,(Ende div 2),StrHilf);
    {Tauschbefehl nach Beschreibung in Anforderrungsdefinition...}
    If i=(length(Str) div 2)   // Stringrest wird gesichert
    Then StrRest:=''
    Else strRest:=StrEx((Ende+1),length(Str),Str);
    Ende:=Ende+2;
    StrHilf:=StrHilf+StrRest;  // Neuer String wird wieder zusammmengeführt
   end;                        // Ende For-Schleife
  Geheimtext :=StrHilf;
end;
procedure TKryptobox.Entschluesseln;
(* -------------------------------------------------------------------- *)
var  Str,StrHilf,StrRest,Schluesselcode : string;
     Start,Ende,i                       : integer;
begin
 Str := GetGeheimtext;
 Start:=1;
 Ende:=length(Str);
 StrHilf:=Str;
 For i:=(length(Str) div 2) downto 1 do     // Aufdröseln der Kodierung von hinten
   begin
   If i=(length(Str) div 2)
     Then StrRest:=''
     Else StrRest:=StrEx((Ende+1),length(Str),StrHilf);
     Strhilf:=StrEx(((Ende div 2)+1),Ende,StrHilf)+StrEx(Start,(Ende div 2),StrHilf);
     Ende:=Ende-2;
     StrHilf:=StrHilf+StrRest;
   end; // Ende For-Schleife
   Ende:=(Length(StrHilf));
   IF StrHilf[Ende]=' '
   Then
    begin
     StrHilf:=StrEx(1,ende-1,StrHilf);
     Ende:=Length(StrHilf);
    end;
  Schluesselcode:=StrEx(Ende-4,Ende,StrHilf);
  IF Schluesselcode=Schluessel                 //Schlüsselabfrage
   Then  Klartext:=StrEx(1,Ende-5,StrHilf)
   Else  KLartext:='Sie sind nicht authorisiert den Text zu entschlüsseln!';
end;
END.