Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi einfaches Entschlüsselungsproblem (https://www.delphipraxis.net/59953-einfaches-entschluesselungsproblem.html)

Penelopee 31. Dez 2005 12:17


einfaches Entschlüsselungsproblem
 
Habe einen Text so versclüsselt:
Delphi-Quellcode:
var i,j:integer;
    key:string;
begin

key:=Edit1.Text;

for j:=1 to length(key) do begin

for i:=1 to length(s) do
 begin

S[i]:=Chr(65 + ((Ord(S[i]) - 65) + (Ord(Key[j]) - 65)) mod 26 );
 end;
 end;
Memo1.Lines.Text:=s;
Nun die Frage , wie kann man das Entschlüsseln???Wenn ich das + durch ein Minus ersetze:
Delphi-Quellcode:
S[i]:=Chr(65 + ((Ord(S[i]) - 65) - (Ord(Key[j]) - 65)) mod 26 );
kommt nicht der Klartext raus.Was mache ich falsch????

MFG und ALlen einen GUTEN Rutsch!!!

marabu 31. Dez 2005 13:08

Re: einfaches Entschlüsselungsproblem
 
Auch dir alles Gute für das kommende Jahr, Penelopee.

Was du falsch gemacht hast kann ich dir nur sagen, wenn du vorher verrätst, was du eigentlich machen wolltest.

Dein Code sieht etwas seltsam aus. Die Nachricht wird mit jedem Zeichen aus dem Schlüssel einmal "verschlüsselt". Das Alphabet für deine Nachricht und den Schlüssel muss in beiden Fällen ['A'..'Z'] sein, sonst funktioniert es nicht.

Delphi-Quellcode:
// Einfachverschlüsselung, rollender Schlüssel
function Cipher(const text, key: string; encoding: boolean): string;
var
  i: integer;
  t, k, c: integer;
begin
  SetLength(Result, Length(text));
  for i := 1 to Length(text) do
  begin
    t := Ord(text[i]) - 65 + 26;
    k := Ord(key[Succ(Pred(i) mod Length(key))]) - 65;
    if encoding
      then c := t + k
      else c := t - k;
    Result[i] := Chr(65 + (c mod 26));
  end;
end;

function Encode(const text, key: string): string;
begin
  Result := Cipher(Text, key, true);
end;
Wie könnte denn die Funktion Decode() aussehen?

Silvestergrüße vom marabu


Nachtrag:

Du wolltest wahrscheinlich gar keinen rollenden Schlüssel!?

Delphi-Quellcode:
// Mehrfachverschlüsselung
function Cipher(const text, key: string; encoding: boolean): string;
var
  i, j: integer;
  t, k, c: integer;
begin
  SetLength(Result, Length(text));
  for j := 1 to Length(key) do
    for i := 1 to Length(text) do
    begin
      t := Ord(text[i]) - 65 + 26;
      k := Ord(key[j]) - 65;
      if encoding
        then c := t + k
        else c := t - k;
      Result[i] := Chr(65 + (c mod 26));
  end;
end;
Nachtrag zum Nachtrag:

Diese Form der Mehrfachverschlüsselung hat keinen Einfluss auf die Sicherheit, vervielfacht aber den Rechenaufwand.

DP-Maintenance 31. Dez 2005 13:15

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Multimedia" nach "Sonstige Fragen zu Delphi" verschoben.
Ist irgenwie nicht so richtig etwas für Multimedia.

tomsel 31. Dez 2005 16:54

Re: einfaches Entschlüsselungsproblem
 
Ich hab deine Verschlüsselung leicht abgeändert (Klammerung) und die passende Entschlüsselung mitgeliefert. Das Ganze funktioniert aber nur im Bereich der Grossbuchstaben.

Delphi-Quellcode:
procedure Encode;
var i,j:integer;
      s,key:string;
begin
   key:=Edit1.Text;
   s:=memo1.lines.text;
   for j:=1 to length(key) do begin
      for i:=1 to length(s) do begin
         S[i]:=Chr(65 + ((Ord(S[i]) - 65) + (Ord(Key[j]) - 65) mod 26 ));
      end;
   end;
   Memo1.Lines.Text:=s;
end;

procedure Decode;
var x,i,j:integer;
      s,key:string;
begin
   key:=Edit1.Text;
   s:=memo1.lines.text;
   for j:=1 to length(key) do begin
      for i:=1 to length(s) do begin
         x:=(Ord(S[i]) - 65) - (Ord(Key[j]) - 65);
         if x<0 then
            x:=26+x;
         S[i]:=Chr(65 + x);
      end;
   end;
   Memo1.Lines.Text:=s;
end;

Penelopee 31. Dez 2005 19:08

Re: einfaches Entschlüsselungsproblem
 
Zitat:

Zitat von tomsel
Ich hab deine Verschlüsselung leicht abgeändert (Klammerung) und die passende Entschlüsselung mitgeliefert. Das Ganze funktioniert aber nur im Bereich der Grossbuchstaben.

Delphi-Quellcode:
procedure Encode;
var i,j:integer;
      s,key:string;
begin
   key:=Edit1.Text;
   s:=memo1.lines.text;
   for j:=1 to length(key) do begin
      for i:=1 to length(s) do begin
         S[i]:=Chr(65 + ((Ord(S[i]) - 65) + (Ord(Key[j]) - 65) mod 26 ));
      end;
   end;
   Memo1.Lines.Text:=s;
end;

procedure Decode;
var x,i,j:integer;
      s,key:string;
begin
   key:=Edit1.Text;
   s:=memo1.lines.text;
   for j:=1 to length(key) do begin
      for i:=1 to length(s) do begin
         x:=(Ord(S[i]) - 65) - (Ord(Key[j]) - 65);
         if x<0 then
            x:=26+x;
         S[i]:=Chr(65 + x);
      end;
   end;
   Memo1.Lines.Text:=s;
end;


das funktioniert leider nicht , trotzdem danke!!!!!

tomsel 1. Jan 2006 16:37

Re: einfaches Entschlüsselungsproblem
 
Bei mir funktioniert's, aber eben nur im Alphabet 'A'..'Z'. Man darf insbesondere auch kein Leerzeichen und keine Umlaute verwenden. Hast du dies beim testen beachtet?

Penelopee 2. Jan 2006 02:21

Re: einfaches Entschlüsselungsproblem
 
Zitat:

Zitat von tomsel
Bei mir funktioniert's, aber eben nur im Alphabet 'A'..'Z'. Man darf insbesondere auch kein Leerzeichen und keine Umlaute verwenden. Hast du dies beim testen beachtet?

Wie kann ich den Quellqode denn umbauen , dass es mit Leerzeichen funktioniert???

tomsel 2. Jan 2006 08:51

Re: einfaches Entschlüsselungsproblem
 
Zitat:

Zitat:

Zitat von Penelopee
Zitat:

Zitat von tomsel
Bei mir funktioniert's, aber eben nur im Alphabet 'A'..'Z'. Man darf insbesondere auch kein Leerzeichen und keine Umlaute verwenden. Hast du dies beim testen beachtet?

Wie kann ich den Quellqode denn umbauen , dass es mit Leerzeichen funktioniert???


So zum Beispiel:

Delphi-Quellcode:
procedure TForm1.Encode;
var i,j:integer;
     s,key:string;
begin
   key := Edit1.Text;
   s := memo1.lines.text;
   for j := 1 to length(key) do begin
     for i := 1 to length(s) do begin
       S[i] := Chr( Ord(S[i]) + Ord(Key[j]) mod 256 );
     end;
   end;
   Memo1.Lines.Text := s;
end;

procedure TForm1.Decode;
var x,i,j:integer;
     s,key:string;
begin
   key := Edit1.Text;
   s := memo1.lines.text;
   for j := 1 to length(key) do begin
     for i := 1 to length(s) do begin
       x := Ord(S[i]) - Ord(Key[j]);
       if x < 0 then
         x := 256 + x;
       S[i] := Chr(x);
     end;
   end;
   Memo1.Lines.Text := s;
end;

Cicaro 13. Jan 2006 11:39

Re: einfaches Entschlüsselungsproblem
 
Zitat:

Zitat von Penelopee
Zitat:

Zitat von tomsel
Bei mir funktioniert's, aber eben nur im Alphabet 'A'..'Z'. Man darf insbesondere auch kein Leerzeichen und keine Umlaute verwenden. Hast du dies beim testen beachtet?

Wie kann ich den Quellqode denn umbauen , dass es mit Leerzeichen funktioniert???

Nur mit Leerzeichen und Buchstaben ist es schwierig.
Hier ein kleiner Ausschnitt aus dem ASCII-Code:
Delphi-Quellcode:
var Ch:Char;

case Ord(Ch) of
  32,160:Ch:=' ';
  65:Ch:='A';
  66:Ch:='B';
  67:Ch:='C';
  ...
  192:Ch:='&#9492;';
end;
@Penelope:
Sag mal, wie nennt sich deine Verschlüsselungsart ?
Du verschlüsselst jedes Zeichen deines Klartextes mit jedem Zeichen deines Keys.
Oder sollte es eine One-Time-Pad-Geschichte werden ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 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