Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Algorithmus umgekehrt darstellen (https://www.delphipraxis.net/185300-algorithmus-umgekehrt-darstellen.html)

DavidJNG 29. Mai 2015 08:01

Algorithmus umgekehrt darstellen
 
Hallo, folgender Algorithmus zum kodieren:
Code:
  summe := (ord(zeile[i]) - 32) + (ord(code[j]) - 32);
  summe := summe MOD 94;
  summe := summe + 32;
  hilf := hilf + chr(summe);
Beispielsweise der Buchstabe "H" für zeile[i] und "C" für code[j].

Verschlüsselt kommt ein "k" raus.
Nun möchte ich es dekodieren.

Bisher habe ich folgendes:
Code:
   summe := ord(zeile[i]);
   summe := summe - 32;
   summe := summe MOD 94;
zeile[i] ist hier das oben kodierte "k".
Das Einzige was jetzt noch "umgedreht" werden muss, ist diese Zeile:
Code:
summe := (ord(zeile[i]) - 32) + (ord(code[j]) - 32);
Vielen Dank im Voraus!

frankyboy1974 29. Mai 2015 08:15

AW: Algorithmus umgekehrt darstellen
 
Hallo,

ich wüsste nicht, wie das funktionieren sollte. Du addierst zwei Zahlen miteinander. Dies ergibt eine Summe, wie willst du jetzt von der Summe zurück auf die beiden Zahlen kommen. Ob du 10 + 15 oder aber 12 + 13 addiert hast, beides würde 25 ergeben.
Desweiteren benutzt du die MOD-Funktion (Restwert); 102 MOD 94 ergibt 8, aber 8 MOD 94 ergibt nicht 102.

Oder habe ich etwas falsch verstanden?:gruebel:

mfg

Frank

DavidJNG 29. Mai 2015 08:26

AW: Algorithmus umgekehrt darstellen
 
Hab's:
Code:
  summe := (ord(zeile[i]) - 32) - (ord(code[j]) - 32);
  if summe < 0
   then summe := summe + 94;
  summe := summe + 32;
  hilf := hilf + chr(summe);

KarstenK 29. Mai 2015 08:35

AW: Algorithmus umgekehrt darstellen
 
zeile[i]:=chr(summe+32-ord(code[j]-32))

himitsu 29. Mai 2015 08:43

AW: Algorithmus umgekehrt darstellen
 
Delphi-Quellcode:
if summe < 0 then summe := summe + 94;
sollte sich bestimmt auch als
Delphi-Quellcode:
summe := (summe + 94) mod 94;
darstellen lassen.

Delphi-Quellcode:
// verschlüsseln
summe := (ord(zeile[i]) - 32) + (ord(code[j]) - 32);
summe := summe mod 94; // summe := (summe + 94) mod 94; siehe PS
hilf := hilf + chr(summe + 32); // hilf[i] := chr(summe + 32);  wenn man vorher SetLength(Hilf, Length(Zeile)); macht oder man verschlüsselt direkt in Zeile, ohne Hilf

// entschlüsseln
summe := (ord(zeile[i]) - 32) - (ord(code[j]) - 32);
summe := (summe + 94) mod 94;
hilf := hilf + chr(summe + 32);
Fällt dir was auf? (so vonwegen fast gleicher Code und so :stupid:)


PS: Wenn man im positiven Bereich ganze Vielfache von 94 dazuaddiert, dann ändert das am Ergebnis von
Delphi-Quellcode:
(x + 94*x) div 94
nichts (i=1 geht natürlich auch).

OlafSt 29. Mai 2015 14:44

AW: Algorithmus umgekehrt darstellen
 
Der MOD-Operator macht ein zurückrechnen unmöglich - vermutlich wurde er deswegen auch gewählt ;) Es gibt unendlich viele Zahlen, die durch 94 geteilt, den Wert von summe-32 ergeben. Selbst, wenn man den Zahlenbereich auf den IsAlpha()-bereich begrenzt, gibt es noch immer mehr als einen möglichen Kandidaten.

himitsu 29. Mai 2015 15:14

AW: Algorithmus umgekehrt darstellen
 
Nee, hier ist es vermutlich etwas anders.

Diese Verschlüsselung funktioniert aber natürlich nur für einen kleinen Wertebereich.
Es werden alle Zeichen vom Leerzeich bis zur Tilde verschlüsselt. Steuerzeichen und alles oberhalb des ASCII geht unwiderruflich kaputt, womit man also nur einfache einzeilige ASCII-Texte ohne Tabulator und Zeilenumbruch verschlüsseln kann.

Innerhalb dieses 94-Zeichen großen Bereichs wird mit einem Integer-Überlauf gearbeitet.
Also genauso, wie man es bei einem 256-Zeichen-Bereich machen kann, wenn man es als Byte speichert (AnsiChar halt) ... dort kannst du d#10 - 32 rechnen = #234 (-22)
und bei #234 + 32 kommt wieder #10 (266) raus.


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