Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kryptologie (https://www.delphipraxis.net/123570-delphi-kryptologie.html)

LEmax474 4. Nov 2008 16:16


Delphi Kryptologie
 
Hallo ihr Lieben,
ich soll für die Schule ein kleines Verschlüsselungsprogramm schreiben, indem wir auch die VErschlüsselung uns ausdenken. Es muss nichts hochsicheres sein aber es sollte funktionieren. Es ist eine Vigenere-Verschlüsselung.
Ich möchte, dass der Benutzer ein Passwort eingibt und dann beginnt folgendes:
Das Programm soll die erste Hälfte des Textes mit der Procedure Vigenere Verschlüsseln, die zweite Hälfte des Textes mit der Procedure Vigenerzwei: Vigenerezwei nutzt den umgedrehten Schlüssel.
BSP: Hallo_wie_geht_es sind 17 Buchstaben (Leerzeichen ist _) Somit sollen die ersten 9 mit dem richtigen PW (zb.Hallo) verschlüsselt werden, die restlichen 8 mit dem umgerehten PW (ollah)
Nun ist meine Frage: kann sich jemand mal meinen Quelltext anschauen und mir sagen wie man diese Unterteilung macht? (am betsen auch noch für das entschlüsseln)
Dazu sei gesagt dass ich und mein Kumpel uns schon 3Stunden damit aberackert haben das zuschreiben mit :
for i := 1 to (length(klartext) div 2) usw hat es nicht richtig funktioniert.



Delphi-Quellcode:
UNIT uKryptobox;
(* ******************************************************************** *)
(* K L A S S E : TKryptobox                                            *)
(* -------------------------------------------------------------------- *)
(* Aufgabe    : Einen Text ver- und entschluesseln nach dem Caesar-    *)
(*               verfahren. Der Rohtext wird vorbehandelt: nur 'A'..'Z' *)
(*               zugelassen, kleine Buchstaben werden in grosse umgewan-*)
(*               Blanks, Satzzeichen als Blanks, der Rest wird ausgefil-*)
(*               tert.                                                 *)
(* ******************************************************************** *)

INTERFACE
(* ========================== Export ================================== *)
uses Sysutils, classes, dialogs, StrUtils;

type
  TKryptoBox = class
              private
               Klartext,
               Geheimtext : string;
               Schluessel : string;
               key       : integer;
              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;
               procedure vigenere;
               procedure entvigenere;
               procedure vigenerezwei;
               procedure entvigenerezwei;
               procedure umdrehen;

              private
               function GetStellenWertVon (Zeichen : char) : integer;
               function GetZeichenVon (StellenWert : integer) : char;
               procedure Vorbehandeln (var txt : string);
             end;




IMPLEMENTATION
(* ==================================================================== *)

constructor TKryptobox.Init;
(* -------------------------------------------------------------------- *)
begin
  Klartext  := '';
  Geheimtext := '';
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
   if s =''
   then Schluessel := 'a'
   else schluessel := s ;
end;


procedure TKryptobox.Verschluesseln;
(* -------------------------------------------------------------------- *)
var
i : integer;
begin
  vigenere;
  vigenerezwei;
   end;


procedure TKryptobox.Entschluesseln;
begin
 entvigenere;
 entvigenerezwei;
end;

function TKryptoBox.GetStellenWertVon (Zeichen : char) : integer;
(* -------------------------------------------------------------------- *)
begin
   case Zeichen of
    'A'..'Z' : Result := ord(Zeichen) - 65 ;
     ' '    : Result := 26;
   end;
end;


function TKryptoBox.GetZeichenVon (StellenWert : integer) : char;
(* -------------------------------------------------------------------- *)
begin
   case Stellenwert of
     0..25 : Result := chr(Stellenwert + 65);
        26 : Result := ' ';
   end;
end;


procedure TKryptoBox.Vorbehandeln (var txt : string);
(* -------------------------------------------------------------------- *)
(* Auftrag: Rohtext von störenden Zeichen befreien                     *)
(* vorher :                                                            *)
(* nachher: kleine in GROSSE Buchstaben gewandelt; Umlaute umgewandelt; *)
(*          LeerZeichen, Satzzeichen als BLANK;                        *)
(* -------------------------------------------------------------------- *)
var
  i        : integer;
  Zeichen  : char;
  Hilfstext : string;

begin
   Hilfstext := '';

   for i := 1 to Length(txt) do
   begin
     Zeichen := txt[i];

     case Zeichen of

     'A'..'Z' : begin
                   Hilfstext := Hilfstext + Zeichen;
                end;

     'a'..'z' : begin
                   Zeichen  := UPCASE(Zeichen);
                   Hilfstext := Hilfstext + Zeichen;
                end;


     'Ä', 'ä' : begin
                   Zeichen  := 'A';
                   Hilfstext := Hilfstext + Zeichen;
                   Zeichen  := 'E';
                   Hilfstext := Hilfstext + Zeichen;
                end;

     'Ö', 'ö' : begin
                   Zeichen := 'O';
                   Hilfstext := Hilfstext + Zeichen;
                   Zeichen := 'E';
                   Hilfstext := Hilfstext + Zeichen;
                end;

     'Ü', 'ü' : begin
                   Zeichen  := 'U';
                   Hilfstext := Hilfstext + Zeichen;
                   Zeichen  := 'E';
                   Hilfstext := Hilfstext + Zeichen;
                 end;

     'ß'     : begin
                   Zeichen  := 'S';
                   Hilfstext := Hilfstext + Zeichen;
                   Zeichen  := 'S';
                   Hilfstext := Hilfstext + Zeichen;
                end;

     chr(32) : begin
                  Zeichen  := ' ';
                  Hilfstext := Hilfstext + Zeichen;
                end;

     chr(13) : begin
                  Zeichen  := ' ';
                  Hilfstext := Hilfstext + Zeichen;
                end;

     '.'     : begin
                  Zeichen  := ' ';
                  Hilfstext := Hilfstext + Zeichen;
                end;

     ','     : begin
                  Zeichen  := ' ';
                  Hilfstext := Hilfstext + Zeichen;
                end
       else
               begin   (* den Rest ueberlesen *)
               end;
     end; (* case *)
   end;  (* while *)

   txt := '';  // urspruenglichen Text loeschen und neuen zuweisen
   txt := Hilfstext;
end;


procedure TKryptobox.vigenere;
 var
  i,a,b,c,
  KTWert,
  GTWert : integer;
  Zeichen : char;
begin
  Geheimtext := '' ;
  Vorbehandeln(Klartext);
  Vorbehandeln(schluessel)  ;
    // hier kommt Ihr Verschluesselungsalgorithmus hin!
  b:= 1;
  for i := 1 to (length(klartext)) do
  begin
  Zeichen := klartext[i]        ;
  Ktwert := Getstellenwertvon(klartext[i]) ;
  c := Getstellenwertvon(schluessel[b]) ;
  a := KTwert +  c  ;
  Zeichen := Getzeichenvon(a mod 27);
  Geheimtext:= Geheimtext + zeichen ;
  b := (b + 1) mod (length(schluessel)+1) ;
  If b = 0 then
  b := 1 ;
  end;


END;

procedure tkryptobox.entvigenere;
var
  i,b,a,c ,d ,
  KTWert,
  GTWert : integer;
  Zeichen : char;

begin
  Klartext := '' ;

  Vorbehandeln(schluessel)  ;
  // hier kommt Ihr Verschluesselungsalgorithmus hin!
  b:= 1;
  for i := 1 to (length(Geheimtext)-2) do
  begin

  Zeichen := Geheimtext[i]        ;
  Ktwert := Getstellenwertvon(Geheimtext[i]) ;
  c := Getstellenwertvon(schluessel[b]) ;
   a := (KTwert -  c+27) mod 27   ;
  Zeichen := Getzeichenvon((a));
  Klartext := Klartext + Zeichen ;
  d:=     (length(schluessel)+1) ;
  b:= b + 1     ;
  b := (b) mod d;
  If b = 0 then
  b := 1 ;

end;
end;


procedure tkryptobox.vigenerezwei;
 var
  i,a,b,c,
  KTWert,
  GTWert : integer;
  Zeichen : char;
begin
umdrehen;
  Geheimtext := '' ;
  Vorbehandeln(Klartext);
  VOrbehandeln(schluessel)  ;
  showmessage(schluessel);
  // hier kommt Ihr Verschluesselungsalgorithmus hin!
  b:= 1;
  for i := 1 to (length(klartext)) do
  begin
  Zeichen := klartext[i]        ;
  Ktwert := Getstellenwertvon(klartext[i]) ;
  c := Getstellenwertvon(schluessel[b]) ;
  a := KTwert +  c  ;
  Zeichen := Getzeichenvon(a mod 27);
  Geheimtext:= Geheimtext + zeichen ;
  b := (b + 1) mod (length(schluessel)+1) ;
  If b = 0 then
  b := 1 ;
  end;


END;



procedure tkryptobox.entvigenerezwei;

var
  i,b,a,c ,d ,
  KTWert,
  GTWert : integer;
  Zeichen : char;

begin
  umdrehen;
  Klartext := '' ;

  Vorbehandeln(schluessel)  ;
  // hier kommt Ihr Verschluesselungsalgorithmus hin!
  b:= 1;
  for i := 1 to (length(Geheimtext)-2) do
  begin

  Zeichen := Geheimtext[i]        ;
  Ktwert := Getstellenwertvon(Geheimtext[i]) ;
  c := Getstellenwertvon(schluessel[b]) ;
   a := (KTwert -  c+27) mod 27   ;
  Zeichen := Getzeichenvon((a));
  Klartext := Klartext + Zeichen ;
  d:=     (length(schluessel)+1) ;
  b:= b + 1     ;
  b := (b) mod d;
  If b = 0 then
  b := 1 ;
 end;
end;

procedure tkryptobox.umdrehen;
begin
 schluessel := reverseString(schluessel)
end;

end.
Anbei kann ich euch den link geben dass ihr euch das auf den rechner ladet.

[edit=Phoenix]Code in Delphi-Tags geändert. Mfg, Phoenix[/edit]

Phoenix 4. Nov 2008 16:24

Re: Delphi Kryptologie
 
So, mit der richtigen Formatierung für Delphi sieht das gleich besser aus *g*
Du kannst das Ding auch gleich hier an den Beitrag anhängen. Das ist geschickter als Links zu posten.

LEmax474 4. Nov 2008 16:30

Re: Delphi Kryptologie
 
als link hatte ich nen rs link

http://rapidshare.com/files/16061173...habet.rar.html

Mikescher 4. Nov 2008 18:46

Re: Delphi Kryptologie
 
Zitat:

Zitat von LEmax474
for i := 1 to (length(klartext) div 2) usw hat es nicht richtig funktioniert.

Wa hat denn daran genau nicht funktioniert ??? ... so hätte ich es auch gemacht :gruebel:

Entenzwerg 4. Nov 2008 19:02

Re: Delphi Kryptologie
 
wir wissen nicht genau was falsch ist der hat immer nur eine Hälfte kodiert demzufolge war das dekodieren natürlich unsinn

bigben37 4. Nov 2008 19:11

Re: Delphi Kryptologie
 
vielleicht mal ein Ansatz:
Delphi-Quellcode:
procedure Verschluessle;
var
  l: Integer;
  text1, text2: string;
begin
  l := Length(klartext);
  text1 := Copy(klartext, 1, l div 2);
  text2 := Copy(klartext, l div 2 + 1, l);
end;
Jetzt kannst du ja text1 mit Vigenere verschlüsslen und text2 mit Vigenere2.

Für das Entschlüsseln genau das gleiche.

Noch ein Anmerkung:
Man kann das natürlich so machen wie Du ihr, aber ich würde die Verschlüsselungsproceduren mit Paramenter und Rückgabewert schreiben, das finde ich übersichtlicher.

Edit:
Mir fällt an eurem Code auf, dass ihr das da gar nicht macht, sondern Vigenere und Vigenere2 auf den gesammten Text anwenden. Wenn ihr mal euren Versuch, der nicht funktioniert posten könntet, dann wüssten wir, woran wir wären. ;-)

[edit=Admin]Cache aktualisiert. Mfg, Daniel[/edit]

Mikescher 4. Nov 2008 19:54

Re: Delphi Kryptologie
 
@Benjamin:

Deine Code würde aber wenn Length(klartext) gerade wäre nicht richtig funktionieren machs lieber so :


procedure Verschluessle;
var
l: Integer;
text1, text2: string;
begin
l := Length(klartext);
text1 := Copy(klartext, 1, l div 2);
text2 := Copy(klartext, l div 2 + 1, l);
if Length(klartext) mod 2 = 0 then
text2 := Copy(klartext, l div 2 + 1, l);
end;


Vergiss es hab drei Quelltexte die ich hier zum testen geschrieben hab zusammen gemischt und ... naja ... man sieht ja was dabei herausgekommen ist :mrgreen:

MfG Mike

PS:

Diese vier Zeilen :

Delphi-Quellcode:
                   Zeichen  := 'A';
                   Hilfstext := Hilfstext + Zeichen;
                   Zeichen  := 'E';
                   Hilfstext := Hilfstext + Zeichen;
könnte man auch einfach so schreiben (wegen der Übersichtlichkeit) :
Delphi-Quellcode:
Hilfstext := Hilfstext + 'AE'

bigben37 4. Nov 2008 20:06

Re: Delphi Kryptologie
 
Delphi-Quellcode:
var
  l: Integer;
  text1, text2: string;
  klartext : string;
begin
  klartext := '123456';
  l := Length(klartext);
  text1 := Copy(klartext, 1, l div 2);
  text2 := Copy(klartext, l div 2 + 1, l);
  ShowMessage(text1);
  ShowMessage(text2);
end;

Zitat:

Zitat von Mikescher
@Benjamin:

Deine Code würde aber wenn Length(klartext) gerade wäre nicht richtig funktionieren machs lieber so :

Wieso. Bei dem Quelltext da oben gibt er 123 und 456 aus.

Entenzwerg 4. Nov 2008 20:09

Re: Delphi Kryptologie
 
Zitat:

Zitat von bigben37
Edit:
Mir fällt an eurem Code auf, dass ihr das da gar nicht macht, sondern Vigenere und Vigenere2 auf den gesammten Text anwenden. Wenn ihr mal euren Versuch, der nicht funktioniert posten könntet, dann wüssten wir, woran wir wären. ;-)

mh wie meinst du das wir verwenden die 2 verschlüsselungen auf den ganzen Text steht auch oben(wenn du willst kann ich dir das auch schnell raussuchen weiß aber net genau was du meinst^^)

edit : mir fällt gerade auf, dass Max den falschen Quelltext hochgeladen hat... das kann so ja net klappen
natürlich sollte bei vigenere for i := 1 to length(Klartext) div 2 stehen und bei vigenere 2 eben die zweite hälfte...

Entenzwerg 5. Nov 2008 18:49

Re: Delphi Kryptologie
 
erledigt


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz