Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

sehr einfache Verschlüsselung

  Alt 21. Jul 2004, 16:28
Hallo,

falls man mal nicht mit 4096bit und starkem Verschlüsselungsalgorithmus auf Spatzen schießen möchte,
hier ein kleiner Algorithmus um z.B. Log-Files zu verschlüsseln, die nur zu Debuggingzwecken verwendet werden sollen.

Dies ist keine "sichere" Verschlüsselung.

Aber vielleicht postet ja Hagen noch seinen "sicheren" RC4 Algorithmus [edit]hier in der Codelib[/edit].


Delphi-Quellcode:
// written by MaBuSE, member of delphipraxis.net
function myCoder(s: string; password: Integer; decode: Boolean):string;
var
  i, c, x: Integer;
begin
  if decode then x := -1 else x := 1;
  RandSeed := password;
  Result := '';
  for i := 1 to length(s) do
  begin
    c := ord(s[i]);
    if c in [32..122] then
    begin
      c := c+(x*Random(90));
      if (c<32) or (c>122) then c := c-(x*90);
    end;
    Result := Result + chr(c);
  end;
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
  // von Edit2 nach Edit3 mit Passwort aus Edit1 verschlüsseln
  Edit3.Text := myCoder(Edit2.Text, StrToInt(Edit1.Text), False);

  // und wieder von Edit3 nach Edit4 entschlüsseln.
  Edit4.Text := myCoder(Edit3.Text, StrToInt(Edit1.Text), True);
end;
Hallo,

in den obigen Algorithmus hat sich leider ein kleiner Fehler eingeschlichen.

Fehlerbeschreibung:
  • Wenn man den Buchstaben 'z' verschlüsselt und danach wieder entschlüsselt bekommt man ein Leerzeichen (' ').
Erläuterung:
  • Der Zahlenraum 32..122 ist genau 90 Zahlen groß.
  • Wenn eine verschlüsselte Zahl aus diesem Rahmen fällt (sprich größer als 122 ist),
    wurde einfach 90 abgezogen, damit ist diese Zahl wieder in dem Zahlenraum.
  • Wenn nun ein 'z' (=#122) verschlüsselt wurde, zog der Algorithmus vom Ergebnis 90 ab.
  • Beim Entschlüsseln kommt der Algorithmus zu dem Ergebnis ' ' (=#32).
  • Er kann das Leerzeichen (#32) nicht vom 'z' (#122) unterscheiden, da 32 + 90 = 122 ist.
Lösung:
  • Es muss 91 abgezogen werden.
    Damit bleiben die Zahlen immer noch im Zahlenraum (123 - 91 = 32)
    Aber aus der 122 wird eine 31 die wiederum kleiner als 32 ist
Ich hoffe ich habe Euch mit dieser Erklärung nicht verwirrt.

Folgende Zeile muss im Algorithmus geändert werden, dann klappt es auch mit dem 'z'

Delphi-Quellcode:
...
      // Wenn Das Ergebnis > 122 ist, dann Subtrahiere 91 um
      // den Wert nochmal in den Bereich zu bekommen
      if (c<32) or (c>122) then c := c-(x*91);
...
Vielen Dank an blackdrake, der diesen Fehler gefunden hat.

Liebe Grüße
MaBuSE

[edit=flomei]Irgendwie war hier kein Codehighlighting... Jetzt geht´s... Mfg, flomei[/edit]
[edit=Phoenix]Algorithmuskorrektur eingefügt. Mfg, Phoenix[/edit]
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat