Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Caesar Verschlüsselung und seine Varianten (https://www.delphipraxis.net/56982-caesar-verschluesselung-und-seine-varianten.html)

Zeih 14. Nov 2005 17:03


Caesar Verschlüsselung und seine Varianten
 
Aufgabe:
Verschlüsselung/Entschlüsselung von Text durch einfache Umwandlung in ASCII, Caesar-Addition, Caesar-Multiplikation und Caesar (Addition-Multiplikation)... tjoar...
----------------------------------------------------------
ASCCI, Caesar-Addition - verschlüsselung/entschlüsselung funtzt...
-------------------------------------------------------------
Bin momentan noch an der Entschlüsselung von einem Caesar-Additionstext...
meine Variante momentan funtzt nur mit:
-wenn mir die Anzahl(k) bekannt ist, mit der das Alphabet verschoben wurde...
brauch aber eine ohne die Kenntnis dieser Zahl... also Brute Force-mäßig...

soweit erstma der Quelltext:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls, ExtCtrls, Spin;

type
  TForm1 = class(TForm)
    BtnPrepare: TButton;
    BtnDelete1: TButton;
    BtnCode: TBitBtn;
    BtnDelete2: TButton;
    BtnDecode: TBitBtn;
    BtnClose: TBitBtn;
    SpinEdit1: TSpinEdit;
    PUe1: TPanel;
    ComboBox1: TComboBox;
    EKlar: TMemo;
    EGeheim: TMemo;
    Eergebnis: TMemo;
    Label1: TLabel;
    procedure ComboBox1Change(Sender: TObject);
    procedure BtnDelete1Click(Sender: TObject);
    procedure BtnDelete2Click(Sender: TObject);
    procedure BtnPrepareClick(Sender: TObject);
    procedure BtnCodeClick(Sender: TObject);
    procedure BtnDecodeClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  quelltext: string;
  Klartext: string;
  Geheimtext:string;

implementation

{$R *.dfm}

procedure TForm1.BtnDelete1Click(Sender: TObject);
begin
EKlar.text:='';
end;

procedure TForm1.BtnDelete2Click(Sender: TObject);
begin
EGeheim.Text:='';
end;

procedure TForm1.BtnPrepareClick(Sender: TObject);
var i: integer;
    c: char;
begin
klartext:=EKlar.text;
quelltext:='';
for i:=1 to length(klartext) do
  begin
    c:=klartext[i];
    case c of
      'A' .. 'Z' : quelltext := quelltext + c;
      'a' .. 'z' : quelltext := quelltext + upcase(c);
      'ß'       : quelltext := quelltext + 'SS';
      'ä'       : quelltext := quelltext + 'AE';
      'ö'       : quelltext := quelltext + 'OE';
      'ü'       : quelltext := quelltext + 'UE';
      'Ä'       : quelltext := quelltext + 'AE';
      'Ö'       : quelltext := quelltext + 'OE';
      'Ü'       : quelltext := quelltext + 'UE';
    end;
  end;
EKlar.text:=quelltext;
end;

procedure TForm1.BtnCodeClick(Sender: TObject);
var i, ASCII, k:Integer;
    c:char;

begin
Geheimtext:='';
for i:=1 to length(Quelltext) do
case combobox1.ItemIndex of
 0: begin
    c:=Quelltext[i];
    ASCII:=ord(c);
    Geheimtext:=Geheimtext + IntToStr(ASCII);
    end;
 1: begin
    ASCII:=ord(quelltext[i]);
    k:=spinedit1.value;
    ASCII:=ASCII-k;
    if ASCII<65 then ASCII:=ASCII+26;
    geheimtext:=geheimtext+chr(ASCII);
    end;
 2: begin

    end;

 end;
 EGeheim.Text:=Geheimtext;
 end;

procedure TForm1.BtnDecodeClick(Sender: TObject);
var paar:string;
    ascii, i, k:integer;
    zeichen:char;
begin
geheimtext:=EGeheim.text;
klartext:='';
case ComboBox1.ItemIndex of
 0: begin
    for i:=1 to length(geheimtext) div 2 do
    begin
      paar:= geheimtext[2*i-1] + geheimtext[2*i];
      ascii:= StrToInt(paar);
      klartext:=klartext + chr(ascii);
    end;
    end;
 1: begin
    for i:=1 to length(geheimtext) do
    begin
      zeichen:=geheimtext[i];
      ASCII:=ord(zeichen);
      k:=spinedit1.value;
      ASCII:=ASCII+k;
      if ASCII>90 then ASCII:=ASCII-26;
      klartext:=klartext + chr (ASCII);
    end;
    end;
end;
EKlar.text:=klartext;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if Combobox1.itemindex=1
then
  begin
     spinedit1.visible:=true;
     label1.Visible:=true;
  end;
if Combobox1.ItemIndex=0
then
  begin
     spinedit1.Visible:=false;
     label1.Visible:=false;
  end;
end;

end.
http://www.directupload.net/images/0...p/xh3jgs7m.jpg

ps: Bin neu hier... Falls es hier irgendwelche Regeln gibt, wie "nicht den ganzen quelltext posten" oder sowas... schonmal sry vorweg ;-)

hanselmansel 14. Nov 2005 17:32

Re: Caesar Verschlüsselung und seine Varianten
 
Also Bruteforcen dürfte bei Verschlüsselungen methodisch ziemlich falsch sein. Sicherlich ist es mit moderner Prozessorleistung möglich, alle Kombinationen durchzuprobieren, aber schon im Altertum hat man Cäsar-Texte mittels Häufigkeitsverteilung decodiert. Ich empfehle dir das gleiche, weil es einfach die "schönste" Lösung ist.

MfG,

hanselmansel

k-weddige 14. Nov 2005 17:44

Re: Caesar Verschlüsselung und seine Varianten
 
Schau dir dazu mal diesen Artikel. *eigenwerbungmach*
Bei einem Caesar reicht schon ein einziger geknackter Buchstabe, da die anderen dann nur verschoben sind.

k-w

//Nachtrag: Kurz: Heufigster Buchstabe ist E. Daraus lässt sich der Rest berechnen. -> Fertig

Binärbaum 14. Nov 2005 17:47

Re: Caesar Verschlüsselung und seine Varianten
 
Häufigkeitsverteilung mag zwar die "schönste" Methode sein, aber dafür ist diese Verteilung auch in jeder Sprache etwas anders. Die Methode arbeitet also gut, wenn man vor dem Entschlüsseln die Sprache des Orginaltextes kennt. Sonst ist sie mehr oder weniger wertlos. :?

Noch ein Tipp zur Codeverbesserung:
statt
Delphi-Quellcode:
case c of
  'A' .. 'Z' : quelltext := quelltext + c;
  'a' .. 'z' : quelltext := quelltext + upcase(c);
  'ß'       : quelltext := quelltext + 'SS';
  'ä'       : quelltext := quelltext + 'AE';
  'ö'       : quelltext := quelltext + 'OE';
  'ü'       : quelltext := quelltext + 'UE';
  'Ä'       : quelltext := quelltext + 'AE';
  'Ö'       : quelltext := quelltext + 'OE';
  'Ü'       : quelltext := quelltext + 'UE';
end;
kann man auch folgendes schreiben:
Delphi-Quellcode:
case c of
  'A' .. 'Z' : quelltext := quelltext + c;
  'a' .. 'z' : quelltext := quelltext + upcase(c);
  'ß'       : quelltext := quelltext + 'SS';
  'ä','Ä'   : quelltext := quelltext + 'AE';
  'ö','Ö'   : quelltext := quelltext + 'OE';
  'ü','Ü'   : quelltext := quelltext + 'UE';
end;

k-weddige 14. Nov 2005 17:52

Re: Caesar Verschlüsselung und seine Varianten
 
Zitat:

Zitat von Binärbaum
Häufigkeitsverteilung mag zwar die "schönste" Methode sein, aber dafür ist diese Verteilung auch in jeder Sprache etwas anders. Die Methode arbeitet also gut, wenn man vor dem Entschlüsseln die Sprache des Orginaltextes kennt. Sonst ist sie mehr oder weniger wertlos. :?

Wenn du die Sprache nciht kennt ist jede andere Methode genauso wertlos: wie willst du sonst erkennen, ob du den richtigen Schlüssel hast?

k-w

PS: Man könnte eine DB mit den Verteilungen für verschiedene Sprachen anlegen. Dann wird die sprache genommen, deren Verteilung am besten auf den Text zutrifft.

Sharky 14. Nov 2005 17:55

Re: Caesar Verschlüsselung und seine Varianten
 
Zitat:

Zitat von Zeih
...
ps: Bin neu hier... Falls es hier irgendwelche Regeln gibt, wie "nicht den ganzen quelltext posten" oder sowas... schonmal sry vorweg ;-)

Hai Zeih,

esteinmal: "Herzlich Willkommen in der Delphi-PRAXiS" :hi:

Ja, wir haben hier Regeln. Diese hast Du ja sicher auch gelesen ;-)

In deinem Thread sehe ich allerdings noch keinen "schlimmen" Verstoss gegen diese.
Grundsätzlich solltest Du keine "zu langen" Quellcodes in deinem Thread posten. Aber was ist "zu lange?" Tja, dafür gibt es keine Regel. Dies solltest Du einfach versuchen selber zu entscheiden.
Ich persönlich mag es zum Beispiel nicht wenn ich mir die Flossen wund scrollen muss weil ein sehr langes Code-Beispiel in einem Beitrag steht :stupid:

Für mich gilt die Formel -> Wenn es, ohne den Sinn zu verfremden möglich ist sollte bei ca. 60 Zeilen schluss sein. Ab dieser Länge hänge ich dann lieber eine Demoprojekt an (oder auch nur die Unit).

Aber dies ist, wie gesagt, meine persönliche Meinung. Wenn Du, wie ich hoffe, noch länger in der DP bist wirst Du sicher merken das wir im großen und ganzen ein umgänglicher und lustiger Haufen sind ;-)

ichbins 14. Nov 2005 18:09

Re: Caesar Verschlüsselung und seine Varianten
 
teste einfach den entschlüsselten Text auf bestimmte Wörter, wie "der", "die", "das", "und" usw... die Version die am meisten dieser Wörter enthält gibst du als Text aus.

Zeih 15. Nov 2005 12:03

Re: Caesar Verschlüsselung und seine Varianten
 
erstma danke für eure beiträge...
meine brute force variante funtzt...

Delphi-Quellcode:
begin
    for k:=0 to 25 do
      begin
         klartext:='';
         for i:=1 to length(geheimtext) do
           begin
           zeichen:=geheimtext[i];
           ASCII:=ord(zeichen);
           ASCII:=ASCII+k;
           if ASCII>90 then ASCII:=ASCII-26;
           klartext:=klartext + chr (ASCII);
           end;
       Eergebnis.Lines.add(Klartext);
      end;
    end;
so...

nächstes Problem wäre nun die Verschlüsselung eines Textes per Caesar-Multiplikation...kann mir jemand ma nen Tipp geben wie ich da ran gehen soll?

hab nur das mathematische zeugs(Beispiel):
f(k)=k*s(Schlüssel) mod p(Primzahl)
k="E"
s=2, p=31
f(5)=(5*2) mod 31
=10 = "J"

nunja... :kotz:

Luckie 15. Nov 2005 12:11

Re: Caesar Verschlüsselung und seine Varianten
 
Zitat:

Zitat von Zeih
erstma danke für eure beiträge...
meine brute force variante funtzt...

Und wie entscheidest du, ob du die richtige Verschiebung gefunden hast? :gruebel:

Zeih 15. Nov 2005 12:21

Re: Caesar Verschlüsselung und seine Varianten
 
Zitat:

Zitat von Luckie
Und wie entscheidest du, ob du die richtige Verschiebung gefunden hast? :gruebel:

öhm.... sind doch nur 26möglichkeiten... scrollst kurz durch... eine ergibt nur sinn...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 Uhr.
Seite 1 von 2  1 2      

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