![]() |
Alten Code von Delphi 5 benutzen
Hallo Delphianer,
ich wollte einen alten Code von Delphi 5 hier unter Tokyo benutzen. Leider funktioniert es nicht mehr. Kann mir jemand sagen wo es denn dran liegt. Ich möchte hier noch einfach Strings Ver- und Ent - schlüsseln um ein Passwort in einer Ini datei zu speichern. Es ist nichts super geheimes und hierzu genügt es mir es mit dieser Routine zu machen wenn diese denn funktionieren würde. Danke
Delphi-Quellcode:
function TFTPMailForm.Encrypt(const InString: string; StartKey, MultKey, AddKey: Integer): string; var I: Byte; begin Result := ''; for I:=1 to Length(InString) do begin Result := Result + CHAR(BYTE(InString[I]) xor (StartKey shr 8)); StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey; end; end; |
AW: Alten Code von Delphi 5 benutzen
Schade das du nicht schreibst was nicht funktioniert, ich könnte mir einen Überlauf an dieser Stelle hier vorstellen: Byte() falls der Wert über 255 hinaus geht.
|
AW: Alten Code von Delphi 5 benutzen
Wenn ein Zeichen (Char) größer als 1 Byte ist, wird dashier nicht mehr funktionieren: BYTE(InString[I]) bzw. Byte(Result[I])
|
AW: Alten Code von Delphi 5 benutzen
Ja natürlich sollte ich noch schreiben was nicht funtioniert. Ich habe noch eine Routine zum Decypt. Wenn ich einen Sring zuerst verschlüssele und dann entschlüsseln möchte kommt an Ende nicht mehr der ursprüngliche Sting an. Es funktioniert eigentlich nur mit dem ersten Zeichen.
|
AW: Alten Code von Delphi 5 benutzen
Zitat:
|
AW: Alten Code von Delphi 5 benutzen
Könntest Du eventuell ein kleinen beispiel code zeigen der all das beinhaltet?
also wo man alles sehen wie, wie dein encrypt, auch decrypt und wie du beides aufrufst meine ich. Vielleicht ist ja decrypt falsch, oder du rufst es falsch auf? Hier kann ich nur raten. PS: es kann gut sein das deine Routine aus einem String einen kaputten String macht (falls eines deiner Bytes ein $00 ist zum beispiel) |
AW: Alten Code von Delphi 5 benutzen
Hmm..
D5 ANSI Tokio Unicode Quick and Dirty:
Delphi-Quellcode:
function TFTPMailForm.Encrypt(const InString: AnsiString; StartKey, MultKey, AddKey: Integer): AnsiString;
var I: Byte; begin Result := ''; for I:=1 to Length(InString) do begin Result := Result + AnsiChar(BYTE(InString[I]) xor (StartKey shr 8)); StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey; end; end; |
AW: Alten Code von Delphi 5 benutzen
Bei Delphi 5 war ein Zeichen eines Strings ein Char.
Ein Char war ein Byte groß. Man konnte also aus einem Char ein Byte machen und aus 'nem Byte ein Char. Heute ist ein Char mehr als ein Byte groß, so das die Umwandlung mit Byte(Char) nicht mehr funktioniert. Ein Byte ist jetzt nur noch eine "Teilmenge" von 'nem Char. Keine Ahnung, wie man Deinen Quelltext nun anpassen muss, damit er weiterhin funktionstüchtig bleibt. |
AW: Alten Code von Delphi 5 benutzen
Jupp, soll er nur funktionieren und für aktuelle Delphis "komplett" nutzbar sein, dann Byte>Word und Char/String zu WideChar/UnicodeString
oder String>UTF8String und Char>AnsiChar. Aber soll es funktionieren und kompatibel zu den Berechnungen des alten Delphi sein, dann String>AnsiString und Char>AnsiChar. PS: Mit UTF8String wäre es für Unicode "vollständig" nutzbar und teilweise mit dem alten ANSI-Code kompatibel, also im Bereich des ASCII (Chars 0 bis 127, inkl. 0-9,a-z,A-Z). |
AW: Alten Code von Delphi 5 benutzen
Also ich habe da so meine Bedenken, das die ursprüngliche Version immer richtig funktioniert hat, da beim Verschlüsseln auch Werte unter x20 generiert werden könnten. Und je nach weiterer Verarbeitung könnte das unschöne Folgen zeitigen. M.M.n sollte das Ergebnis einer Verschlüsselung immer ein Array of Byte sein, das dann Hexadezimal oder Base64 o.ä. dargestellt wird.
Und wenn der übergebene String als Array of Byte gecastet wird und statt lenght sizeof, bzw length(str)*sizeof(char), genutzt wird, sollte man auf der sicheren Seite sein. Gruß K-H |
AW: Alten Code von Delphi 5 benutzen
Hallo,
ich denke ja, der Code soll funktionieren mit den geringsten Anpassungen, und das wäre die Lösung von HolgerX String -> AnsiString. |
AW: Alten Code von Delphi 5 benutzen
Zitat:
Früher zu D1-Zeiten hatte ich mal auch String als Buffer für Datenübertragung im Einsatz. Und dort sind auch $00 vorgekommen. Einzig wegen der 255-Zeicheneinschränkung habe ich irgendwann auf Byte-Stream gewechselt. Aber *schön* ist was anderes. |
AW: Alten Code von Delphi 5 benutzen
Zitat:
Hier liest man immer wieder, daß irgendjemand über
Delphi-Quellcode:
stolpert, und sich in irgendwelchen Kodierungen verheddert. Ebenso scheint die Adressierung von statischen und dynamischen Arrays in den Bereich des Voodoo zu gehören. Wenn dann noch Pointer ins Spiel kommen, wird es für viele Zauberlehrlinge richtig eng.
String
(hatte ich schon Records und Wortgrenzen erwähnt?) Darum finde ich den Hinweis auf mögliche Untiefen auch heute noch sehr wichtig. Vor allem weil es genügend alten Kode gibt, an dem der eine oder andere verzweifelt. Gruß K-H |
AW: Alten Code von Delphi 5 benutzen
Würde ein
Delphi-Quellcode:
nicht auch ganz ausgezeichnet funktionieren ?
Ord(InString[I]) xor (StartKey shr 8);
|
AW: Alten Code von Delphi 5 benutzen
Ich rate auch dazu, wenn es denn ein string objekt bleiben soll, wenigstens eine Base64 en-/decodierung hinzuzufügen damit es keine string inkompatibilät geben kann oder auf ein array (für encodierten string) umzusteigen.
|
AW: Alten Code von Delphi 5 benutzen
String wird/wurde eigentlich nur für sowas genommen, weil er so einfach zu verwalten ist.
Aber in aktuellen Delphis funktionieren auch Copy/Insert/Delete/usw. auch bei Byte-Arrays, einzig das CopyOnWrite wird man wohl nie reparieren, womit das weiterhin nur bei Strings funktioniert. |
AW: Alten Code von Delphi 5 benutzen
Zitat:
|
AW: Alten Code von Delphi 5 benutzen
Hallo Jungs,
danke für Eure Hilfe. Mit AnsiString hat es funktioniert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz