![]() |
"Verschlüsselung"
Guten Tag zusammen,
ich habe eine Frage zu einem kleinen Projekt, dass zur Datensicherheit dienen soll. Ich würde mir gerne ein kleines Programm schreiben, dass eine einzelne Datei auf Knopfdruck "verschlüsselt" und in ein vorher festgelegtes Verzeichnis verschiebt. Ich habe zwar bereits Themen gefunden, die sich mit Passwörtern und ähnlichem beschäftigen, das ist aber gar nicht nötig. Die Datei soll im Ordner nur "von Hand" undlesbar sein, der "Schlüssel" ist dann einfach der Knopfdruck beim Programm. Bisher habe ich mich aber noch nie mit soetwas beschäftigt und ich konnte wie gesagt bisher auch kein ähnliches Thema finden. Das verschieben der Datei ist zwar einfach, aber hat jemand eine Idee, wie man die "Verschüsselung" möglichst einfach realisieren könnte? Für jegliche Tipps oder Ansätze wäre ich sehr dankbar. |
AW: "Verschlüsselung"
Zitat:
|
AW: "Verschlüsselung"
Suchst Du die klassische (AES256) Verschlüsselung, oder "reicht" Dir eine Version nach dem Motto: "Mann soll es nicht im Editor lesen können".
Stichwort "XOR $FF". Dazwischen gibt es sicherlich hundert Schritte. Z.B. Zip mit Passwort.. Mavarik |
AW: "Verschlüsselung"
Vielen Dank für Eure Antworten. Ich habe nochmal einige Threads durchforstet und mich letztlich für einen DEC-Versuch entschieden. Dazu habe ich ein kleines Testprojekt erstellt, welches zunächst einmal den Beispielcode ausführt. Schon da erhalte ich jedoch folgende Fehlermeldung:
Delphi-Quellcode:
Wie kann das sein ? Ich hab doch nur den Code kopiert...
[dcc32 Fehler] DECUtil.pas(769): E2250 Es gibt keine überladene Version von 'AddModuleUnloadProc', die man mit diesen Argumenten aufrufen kann
|
AW: "Verschlüsselung"
Und stimmen auch die Typen? Unicode?
|
AW: "Verschlüsselung"
Zitat:
* entweder hast du eine alte Version erwischt. (Nicht-Unicode von vor Delphi 2009) * oder es hat sich irgendwas im Delphi geändert (falls das eine Funktion von/zur RTL ist) |
AW: "Verschlüsselung"
Diese Stelle verursacht das Problem:
Delphi-Quellcode:
Ich habe das neue Rad Studio XE7 und die neuste DEC Version (5.2). Ich kann mit dem Fehler ehrlichgesagt nichts anfangen, was soll ich denn da tun?
{$IFDEF VER_D3H}
procedure ModuleUnload(Instance: Integer); var // automaticaly deregistration/releasing I: Integer; begin if IsObject(FClasses, TList) then for I := FClasses.Count -1 downto 0 do if Integer(FindClassHInstance(TClass(FClasses[I]))) = Instance then FClasses.Delete(I); end; initialization AddModuleUnloadProc(ModuleUnload); {$ELSE} initialization {$ENDIF} FClasses := TList.Create; finalization {$IFDEF VER_D3H} RemoveModuleUnloadProc(ModuleUnload); {$ENDIF} FreeAndNil(FClasses); |
AW: "Verschlüsselung"
Es gibt da doch irgendwo eine *.INC, wo diese VER_D3H-Definitionen drin definiert sind.
Wie sieht diese Datei denn aus? Ich vermute mal, daß die Erkennung für die neusten Delphis fehlt. |
AW: "Verschlüsselung"
|
AW: "Verschlüsselung"
Für simples AES kann auch die winCrypt-Api herhalten. Wincrypt.pas gibts bei
![]() Sherlock |
AW: "Verschlüsselung"
Hm.
@Himitsu: Also ich habe "Embarcadero® RAD Studio XE7 Version 21.0.17017.3725". In der "ver.inc" taucht folgendes auf:
Delphi-Quellcode:
Das müsste doch eigentlich Funktionieren, oder sehe ich das falsch?
{$IFDEF VER150} {Borland Delphi 7.0 }
{$DEFINE VER_D7} {$DEFINE VER_D7H} {$DEFINE VER_D6H} {$DEFINE VER_D5H} {$DEFINE VER_D4H} {$DEFINE VER_D3H} {$DEFINE VER_D2H} {$DEFINE VER_D1H} {$ENDIF} @Jens/Sherlock: Ich werde mir auch eure Ideen mal ansehen und ausprobieren, vielen Dank schonmal! :) |
AW: "Verschlüsselung"
Zitat:
|
AW: "Verschlüsselung"
Delphi XE7 = VER280 = CompilerVersion 28.0 / IDE-Version 21.0
Delphi 7 = VER150 = CompilerVersion 15.0 / IDE-Version 7.0 (Drum gibt es auch kein Windows 9, sondern man springt gleich zu Windows 10 ... Win9x) Wenn nur mit diesen doofen VERxxx-Defines gearbeitet wird, dann muß man in diesen INCs explizit jede Delphi-Version implementieren, vorallem wenn man das falschrum auswertet (was zu oft gemacht wird) Falschrum: Funktionen nur aktivieren Richtigrum: Funktionen bei bekannten Delphi deaktivieren und wenn Delphi unbekannt, dann von neuem Delphi ausgehn Oder man benutzt endlich mal die CompilerVersion-Konstante, welche seit Delphi 6 existiert :wall: Oder noch besser, man prüft auf Features und nicht auf Versionen. z.B. UNICODE-Define oder SizeOf(Char) statt Delphi2009+ Es gibt nicht umsonst für's $IF die Funktionen Declared und Defined. :roll: |
AW: "Verschlüsselung"
Aber was soll ich denn nun tun? Ich kann doch nicht einfach die Version in die .inc aufnehmen, oder?
|
AW: "Verschlüsselung"
Warum nicht?
|
AW: "Verschlüsselung"
Guten Abend,
es tut mir wirklich leid, dass ich mich scheinbar so blöd anstelle, aber ich habe vorhin alle drei von euch vorgeschlagenen Möglichkeiten ausprobiert und komme bei keiner ein Stück weiter. Es muss doch irgendwo eine Art Tutorial für ein einfaches Verschlüsseln von Dateien geben. Mir ist klar, dass es sehr aufwendig werden kann, wenn man eine wirklich sichere Technik braucht, aber ich will ja nur, dass nicht jeder "Hans" gleich drauf zugreifen kann. Es muss ja keinem großen Hackerangriff standhalten... Naja. Ich werde mich nochmal auf die Suche machen und schauen, ob ich irgendwo etwas finde, womit ich klarkomme, sonst versuche ich eben, mir selbst etwas zu schreiben. Falls doch noch jemand von euch eine Idee hat wäre ich trotzdem sehr dankbar. *Edit* Könnte ich nicht auch mit BlockWrite/BlockRead die Datei Stückweise einlesen, diese anhand eines Verfahrens vertauschen und dann speichern? Bevor die Datei mithilfe des Programms zurücksortiert wird wäre sie dann unbrauchbar. Ist selbstverständlich nicht die sicherste Variante, aber das muss es ja wie gesagt auch nicht sein. Meint ihr, das funktioniert? |
AW: "Verschlüsselung"
Freund der Sonne,
du wirst doch wohl in der Lage sein, - eine Datei mit Blockread zu lesen - die einzelnen Blöcke mit einem simplen XOR zu Verschlüsseln - den Block in die Zieldatei zu schreiben. |
AW: "Verschlüsselung"
In nahezu jedem Delphi-Grundlagen-Tutorial gibt es doch irgendwo ein XOR-Beispiel.
Und dann zeigt Google auch noch massig Links zu sowas. ![]() ![]() ![]() Man muß nur beachten, daß irgendwie viele Delphi-Beispiele im Internet noch aus Vor-Delphi2009-Zeiten stammen und man somit mit Unicode aufpassen muß, aber über TEncoding (nach TBytes umwandeln) oder durch Umwandlung in z.B. UTF8 lassen sich all diese Beispiele noch problemlos verwenden. Außerdem gibt es tausendeVerschlüsselungs-Bibliotheken, welche man ebenfalls verwenden könnte. |
AW: "Verschlüsselung"
Zitat:
![]() ![]() Echt jetzt ein Beispiel? Na gut, aber nicht vollständig!
Delphi-Quellcode:
Mavarik
var
A : TBytes; W : word; // Nur für kleine Dateien :-) ... begin .... W := Filesize... Setlength(A,W+2); .... Blockread(F,A[2],W); // oder Stream? Move(W,a[0],2); // Wofür wohl Stichwort mitten im "Stream"? for i:=2 to high(A) do begin A[i] := A[i] XOR $FF; // Version 1.0 A[i] := A[i] XOR byte(I AND $FF); // Version 1.5 end; ... Blockwrite(F,A[0],W+2); // oder Stream? ... |
AW: "Verschlüsselung"
@OlafSt: Nein, bin ich leider nicht, sonst würde ich ja nicht danach fragen. Was du gesagt hast, habe ich ja oben bereits angedeutet, aber da ich mit keinem dieser Begriffe bisher gearbeitet habe fehlt mir die Erfahrung, um die "Idee" auch tatsächlich umzusetzt. Wie gesagt, ich meine es ernst, wenn ich sage, es tut mir Leid, dass ich mich so blöd anstelle. Aber es ist eben mein "erstes Mal". :-)
@Himitsu: Vielen Dank für die Links, die habe ich mir mal angesehen. Jetzt weiß ich wenigstens, wie man XOR zu verstehen hat. Das genauere Tutorial werde ich mir später mal ansehen, erstmal muss ich mit Blockread/write und dem verschieben an sich klarkommen. @Mavarik: Vielen Dank für Dein Beispiel. Ich habe Deinen Beitrag duchaus gesehen, daher auch meine Idee, aber entschuldige bitte, dass ich es scheinbar so formuliert habe, dass Du Dich übergangen gefühlt hast. Dazu ein paar Fragen: 1. Ich habe zunächst versucht, "F" zu initialisieren:
Delphi-Quellcode:
Daraufhin bekomme ich bei
AssignFile(F,OpenDialog1.FileName)
ReWrite(F);
Delphi-Quellcode:
jedoch direkt einen Fehler (E/A Fehler 103). Ich habe mal nach dem Problem gesucht und es daraufhin mal mit
W := Filesize(F);
Delphi-Quellcode:
versucht um sicherzugeben, dass es die richtige Prozedur ist, aber daran liegt es zumindest wohl schonmal nicht. Woran liegt das denn? Die Datei ist nicht schreibgeschützt oder ähnliches.
W := System.Filesize(F);
|
AW: "Verschlüsselung"
Merkwürdig - aber auch überflüssig. Nach erfolgreichem Rewrite sollte filesize eh 0 sein. Hast Du nicht schon einen Fehler bei rewrite bekommen?
|
AW: "Verschlüsselung"
Wirklich etwas seltsam, ich habe zwischendrin den PC neu gestartet und nun geht's, ohne, dass ich etwas verändert hätte. Aber wenn Rewrite alles löscht, ist der Befehl für meine Zwecke doch völlig falsch, oder...?
Ich habe bei DelphiBasics nachgesehen und da stand: Zitat:
Ich werde mich jedenfalls noch weiter dran versuchen, wenn ich noch ein konkretes Problem habe melde ich mich wieder :) |
AW: "Verschlüsselung"
Was hast Du vor? Rewrite() löscht den Inhalt der Datei. Willst Du etwas anhängen, dann ist Append() die richtige Funktion.
|
AW: "Verschlüsselung"
Ich poste einfach mal meinen Versuch. Um die Befehle etwas auszutesten wollte ich zunächst nur eine Datei lesen und in einer anderen Abspeichern. Die Verschlüsselung füge ich später ein, wenn das klappt. Ich habe dazu den von euch vorgegebenen Code genommen und versucht, diesen zu vervollständigen
Delphi-Quellcode:
Wenn ich das Programm ausführe ändert sich zwar die KB Zahl von 0 auf 64, die Datei lässt sich aber nicht öffnen. Da ich wie gesagt keine Ahnung habe und mir nur ein paar Beispiele angesehen habe kann es gut sein, dass ich irgendeinen Fehler gemacht habe. Ich verstehe zum Beispiel nicht, woher Blockwrite weiß, was eigentlich geschrieben werden soll. Müsste es nicht eigentlich vom Prinzip her eher so sein?
if Opendialog1.Execute then
Begin AssignFile(F,OpenDialog1.FileName); Reset(F,1); W := System.Filesize(F); Setlength(A,W+2); Blockread(F,A[2],W); //XOR AssignFile(F2,Directory+'a.jpg'); ReWrite(F2,1); Blockwrite(F2,A[0],W+2); // oder Stream? CloseFile(F); CloseFile(F2); End;
Delphi-Quellcode:
A:=Blockread(F);
Blockwrite(F,A); |
AW: "Verschlüsselung"
In Bezug auf OOP, könnte man auch einfach mal diese "uralten" Funktionen ignorieren und was "Neueres" ausprobieren. :stupid:
|
AW: "Verschlüsselung"
Nebenbemerkung: Das die Datei bis zu einem Neustart Mucken gemacht hat, liegt vermutlich an einer abgestürzten Instanz Deines Programms, das die Datei nicht mehr freigegeben hatte. Hättest Du vermutlich im Taskmanager schnell gesehen.
Sherlock |
AW: "Verschlüsselung"
Zitat:
Das ist der Grund, warum ich keine vollständig Routine gepostet habe... Nicht einfach Copy-Paste sondern Lesen-Kopf ist angesagt. Mavarik PS.: himitsu hat "natürlich" recht, auch wenn die alten Routinen eigentlich in die gleichen Systemfunktionen münden wie Streams... Aber ich hatte ja auch schon angeregt Streams zu verwenden. Daher ist ja auch schon ein Stream-Trick in meinen Source enthalten. Dieser Trick zerstört übrigens Deine Datei! |
AW: "Verschlüsselung"
@Himitsu: Vielen Dank für die Wiederholung deines Tipps. Wie man merkt hat es zwar ein bisschen gedauert, ich habe es aber nochmal mit Deiner Idee versucht und schließlich klappt es nun auch, wie ich es mir vorstelle.
Danke euch allen! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 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-2025 by Thomas Breitkreuz