Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi "Verschlüsselung" (https://www.delphipraxis.net/182989-verschluesselung.html)

VkPenguin 2. Dez 2014 11:15

"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.

himitsu 2. Dez 2014 11:23

AW: "Verschlüsselung"
 
Zitat:

Zitat von VkPenguin (Beitrag 1281947)
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.

[OH]Datei verschlüsseln[/OH]?

Mavarik 2. Dez 2014 13:01

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

VkPenguin 3. Dez 2014 13:37

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:
 [dcc32 Fehler] DECUtil.pas(769): E2250 Es gibt keine überladene Version von 'AddModuleUnloadProc', die man mit diesen Argumenten aufrufen kann
Wie kann das sein ? Ich hab doch nur den Code kopiert...

mkinzler 3. Dez 2014 13:39

AW: "Verschlüsselung"
 
Und stimmen auch die Typen? Unicode?

himitsu 3. Dez 2014 13:52

AW: "Verschlüsselung"
 
Zitat:

Zitat von mkinzler (Beitrag 1282109)
Und stimmen auch die Typen? Unicode?

Ich weiß nun auch nicht wo AddModuleUnloadProc her kommt...

* 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)

VkPenguin 3. Dez 2014 15:00

AW: "Verschlüsselung"
 
Diese Stelle verursacht das Problem:
Delphi-Quellcode:
{$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);
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?

himitsu 3. Dez 2014 15:02

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.

Jens01 3. Dez 2014 19:39

AW: "Verschlüsselung"
 
Krypto
Das funktioniert. Man muss sich aber einarbeiten. Der Autor läuft auch hier im Forum herum.

Sherlock 4. Dez 2014 07:04

AW: "Verschlüsselung"
 
Für simples AES kann auch die winCrypt-Api herhalten. Wincrypt.pas gibts bei Rudy Velthuis. Dann ist es eigentlich nur noch eine Folge von ca. acht Befehlen. Für mehr würde ich sie aber nicht einsetzen... wirklich unhandlich das Monster.

Sherlock

VkPenguin 4. Dez 2014 09:16

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:
{$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}
Das müsste doch eigentlich Funktionieren, oder sehe ich das falsch?

@Jens/Sherlock: Ich werde mir auch eure Ideen mal ansehen und ausprobieren, vielen Dank schonmal! :)

mjustin 4. Dez 2014 09:24

AW: "Verschlüsselung"
 
Zitat:

Zitat von VkPenguin (Beitrag 1282204)
Hm.

Also ich habe "Embarcadero® RAD Studio XE7 Version 21.0.17017.3725".
In der "ver.inc" taucht folgendes auf:

Delphi-Quellcode:
{$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}
Das müsste doch eigentlich Funktionieren, oder sehe ich das falsch?

Mit Borland Delphi 7.0 würde es funktionieren. Aber Delphi 7.0 ist ein Programm aus dem vorigen Jahrzehnt, im Gegensatz zu XE7 :)

himitsu 4. Dez 2014 10:42

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:

VkPenguin 5. Dez 2014 10:02

AW: "Verschlüsselung"
 
Aber was soll ich denn nun tun? Ich kann doch nicht einfach die Version in die .inc aufnehmen, oder?

himitsu 5. Dez 2014 10:09

AW: "Verschlüsselung"
 
Warum nicht?

VkPenguin 5. Dez 2014 18:38

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?

OlafSt 5. Dez 2014 21:19

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.

himitsu 6. Dez 2014 02:07

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.
http://www.delphipraxis.net/19340-ist-xor.html
http://www.entwickler-ecke.de/topic_...n_13611,0.html
http://www.angelfire.com/mo3/pengwin/devtut1.html

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.

Mavarik 8. Dez 2014 14:16

AW: "Verschlüsselung"
 
Zitat:

Zitat von VkPenguin (Beitrag 1282410)
*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?

OMG... Was hat den der Papa schon in #3 vorgeschlagen?

Echt jetzt ein Beispiel? Na gut, aber nicht vollständig!

Delphi-Quellcode:
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?
  ...
Mavarik

VkPenguin 9. Dez 2014 15:02

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:
AssignFile(F,OpenDialog1.FileName)
  ReWrite(F);
Daraufhin bekomme ich bei
Delphi-Quellcode:
 W := Filesize(F);
jedoch direkt einen Fehler (E/A Fehler 103). Ich habe mal nach dem Problem gesucht und es daraufhin mal mit
Delphi-Quellcode:
 W := System.Filesize(F);
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.

gammatester 9. Dez 2014 15:42

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?

VkPenguin 9. Dez 2014 20:10

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:

// Try to open the Test.cus binary file in write only mode
AssignFile(myFile, 'Test.cus');
ReWrite(myFile);
Oder Missverstehe ich das etwa?

Ich werde mich jedenfalls noch weiter dran versuchen, wenn ich noch ein konkretes Problem habe melde ich mich wieder :)

mkinzler 9. Dez 2014 20:29

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.

VkPenguin 9. Dez 2014 21:15

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:
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;
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?

Delphi-Quellcode:
A:=Blockread(F);
Blockwrite(F,A);

himitsu 10. Dez 2014 02:16

AW: "Verschlüsselung"
 
In Bezug auf OOP, könnte man auch einfach mal diese "uralten" Funktionen ignorieren und was "Neueres" ausprobieren. :stupid:

Sherlock 10. Dez 2014 07:24

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

Mavarik 10. Dez 2014 09:13

AW: "Verschlüsselung"
 
Zitat:

Zitat von VkPenguin (Beitrag 1282797)
Wenn ich das Programm ausführe ändert sich zwar die KB Zahl von 0 auf 64, die Datei lässt sich aber nicht öffnen.

Lögisch... Die Datei ist kaputt.

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!

VkPenguin 16. Dez 2014 07:52

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