Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units (https://www.delphipraxis.net/206384-dateien-verschluessen-mit-wolgang-ehrhardts-crypt-units.html)

DieDolly 16. Dez 2020 15:04

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Klappt bisher genau so wie gewünscht.

Eine kleine Extra-Unit erlaubt mir dann an anderer Stelle einen 1-Zeiler als Aufruf. Die Extra-Unit ist aber ausbaufähig was doppelten Code angeht.
Dieses .encrypted.txt und .decrypted.txt ist nur eine kleine Hilfe für mich bis ich alles richtig habe.

Delphi-Quellcode:
unit Utils.DEC.Crypt;

interface

uses
 System.SysUtils, System.Classes, DECCipherBase, DECCiphers, DECCipherFormats;

type
 TDECCryptUtils = record
 private
  //
 public
  class function AESFileEncrypt(const FileName, Password: string): string; static;
  class function AESFileDecrypt(const FileName, Password: string): string; static;
 end;

implementation

class function TDECCryptUtils.AESFileEncrypt(const FileName, Password: string): string;
var
 Cipher: TCipher_AES;
begin
 Cipher := TCipher_AES.Create;
 try
  try
   // Schlüssel, Initialisierungsvektor, Füllwert um auf Blockgröße aufzufüllen
   Cipher.Init(Password, #1#2#3#4#5#6#7#64, 0);
   Cipher.Mode := cmCBCx;
   // Klartextdatei, verschlüsselte Datei
   Cipher.EncodeFile(FileName, FileName + '.encrypted.txt');
  except
   //
  end;
 finally
  Cipher.Free;
 end;
end;

class function TDECCryptUtils.AESFileDecrypt(const FileName, Password: string): string;
var
 Cipher: TCipher_AES;
begin
 Cipher := TCipher_AES.Create;
 try
  try
   // Schlüssel, Initialisierungsvektor, Füllwert um auf Blockgröße aufzufüllen
   Cipher.Init(Password, #1#2#3#4#5#6#7#64, 0);
   Cipher.Mode := cmCBCx;
   // Klartextdatei, verschlüsselte Datei
   Cipher.DecodeFile(FileName, FileName + '.decrypted.txt');
  except
   //
  end;
 finally
  Cipher.Free;
 end;
end;

end.

TurboMagic 16. Dez 2020 15:23

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Schön, dass DEC nützlich ist.

Evtl. hält das sogar in GetIt EInzug, da laufen aber nich die Diskussionen
wegen Exportbeschränkungen für cryptographische Algorithmen.
Wenn das so nicht klappt, wird's eine DEC Light für GetIt geben wo dann
halt alles außer den Verschlüsselungsalgorithmen drin ist.
Auch Hashes, CRCs und Zufallszahlengeneratoren sind für den einen oder
anderen nützlich...

DieDolly 16. Dez 2020 15:27

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Eine letzte Frage habe ich noch da ich gerade gesehen habe dass man auch den Fortschritt anzeigen lassen kann.
Wie funktioniert das? Eine ProgressBar brauche ich nicht. Ich würde mir gerne ausgeben lassen, wieviele Bytes von der Datei schon verschlüsselt wurden.

DieDolly 16. Dez 2020 23:52

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Geht das nicht? :(

himitsu 17. Dez 2020 01:32

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Schau doch mal in TCipher_AES?

Ob es im Constructor oder eine Methode einen Setter gibt, oder vielleicht gibt es auch ein Property, wo man eine Ereignismethode oder ein Interface zuweisen kann.


[Edit]
Es gibt ein IDECProgress, aber scheinbar nur beim Ver-/Entschlüsseln von Streams
und im Prinzip auch von Dateien (TFileStream).

[Edit2]
Wer die das CodeInsight lesen kann, ist klar im Vorteil. :zwinker:
Delphi-Quellcode:
procedure DecodeFile(const SourceFileName, DestFileName: string;
                     const Progress: IDECProgress = nil);

DieDolly 17. Dez 2020 08:20

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Dass das da drin steht weiß ich aber ich habe keine Ahnung wie man das benutzt.
In den Demos steht davon auch nix.

himitsu 17. Dez 2020 12:09

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Beispiel:
Delphi-Quellcode:
type                  
  TForm1 = class(TForm, IDECProgress)
    ...
  private
    procedure Process(const Min, Max, Pos: Int64); stdcall;
  end;
Und dann Self in als Interface für den Callback reingeben.



Man kann sich auch ein eigenes Objekt/Interface dafür bauen.
TForm, bzw. alle TComponent haben bereits eine Interfacebehandlung dind, welche standardmäßig keine Referenzzählung besitzt. (Controlle über die Freigabe liegt weiter beim Owner und/oder Free)

Und wer selber kein komplettes IInterface bauen will:
TInterfacedObject
TInterfacedPersistent
...


Und da du keine Objektinstanz zur Verfügung hast, sondern nur Prozeduren, bzw. nur statische Methoden,
würde ich das Interface durchreichen, also
Delphi-Quellcode:
; const Progress: IDECProgress = nil
in die eigenen Methoden mit einbauen.

DieDolly 17. Dez 2020 12:52

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Verstehe ich nicht. Das funktioniert so nicht. Bin ich zu dumm dafür?

Wieso kann das nicht einfach eine normale CallBacl-Funktion sein? Irgendwie viel zu kompliziert das DEC was den Progress angeht.

Delphi-Quellcode:
procedure TDECCryptFunctions.Process(const Min, Max, Pos: Int64);
begin

end;

class function TDECCryptUtils.AESFileDecrypt(const FileName, Password: string): string;
var
 Cipher: TCipher_AES;
begin
 Cipher := TCipher_AES.Create;
 try
  try
   // Schlüssel, Initialisierungsvektor, Füllwert um auf Blockgröße aufzufüllen
   Cipher.Init(Password, #1#2#3#4#5#6#7#64, 0);
   Cipher.Mode := cmCBCx;
   // Klartextdatei, verschlüsselte Datei
   Cipher.DecodeFile(FileName, FileName + '.decrypted.txt', Process);
  except
   //
  end;
 finally
  Cipher.Free;
 end;
end;

himitsu 17. Dez 2020 13:53

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Du hast eine Class-Procedure und da es dort keine "Instanz" gibt, hast du da auf Process garkeinen Zugriff.
Und nochmals, hier gibt man eine Interface-"Instanz" rein und keinen "Methoden"-Zeiger. (bei meinem Beispiel mit TForm1 also Form1 bzw. Self)
Du brauchst also erstmal ein Objekt und das muß erzeugt worden sein (Create).
Es wird die Instanz reingegeben und was aufgerufen wird (Process), darum kümmert sich das Interface (IDECProgress).

Callback-Interfaces sind nichts Besonderes und sie sind auch erfolgreich/problemlos sehr weit verbreitet.

Klar, da hier (aktuell) nur eine Methode drin steckt, sieht es "unpraktisch" aus, aber das ändert sich schnell, sobald es etwas "komplexer" wird.
Nur ein Zeiger für mehrere Ereignisse:
Delphi-Quellcode:
type
  IComplexProgress = interface
    procedure Start(const Min, Max: Int64);
    procedure Process(const Pos: Int64; var Cancel: Boolean);
    procedure Stop;
    procedure Error(const Message: string);
  end;
Beschweren wird sich auch immer wer, da es nie Jedem gerecht gemacht werden kann, bei all den Möglichkeiten.
* Callback-Objekt (interface ODER class)
* Prozedur (procedure ODER class procedure static)
* Methode (procedure of object)
* anonyme Methode ODER die beiden Vorherrigen (reference to procedure), aber dafür kann man diese Zeiger "oft" garnicht vergleichen

DieDolly 17. Dez 2020 13:55

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
 
Ich verstehe nur Bahnhof. Wo muss ich das denn hinpacken was da oben steht und wie wende ich das an?
Normale CallBacks schickt der Himmel. Interfaces die Hölle.
Ne also wenn das so kompliziert ist, nicht es nicht einmal einen normalen CallBack gibt, dann ist das DEC nix für mich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 Uhr.
Seite 2 von 5     12 34     Letzte »    

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