Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Arbeiten mit dem DEC (https://www.delphipraxis.net/53148-arbeiten-mit-dem-dec.html)

Sko 11. Sep 2005 10:00


Re: VerschlüsselungsProgramm
 
Hallo,

ich hab auch ein kleines Verschlüsselungsprogramm erstellt, und hab da mal zwei Fragen (aber bitte nich hauen, bin totaler Anfänger :oops: ):

also wie gesagt ich hab ein kleines Verschlüsselungsprogramm geschrieben, in dem man eine Quellatei und eine Zieldatei auswählt und dann ein Passwort eingibt, welches der Schlüssel der Verschlüsselung ist. Das ganze hab ich mit dem DEC gebaut. Zur Zeit sieht das so aus:

Delphi-Quellcode:
    with TCipher_Blowfish.Create(Edit3.text, nil) do
    try
      EncodeFile(Filename, crypt);
    finally
      Free;
    end;
1. Frage: Kann ich wenn ich einen Ciphermanager auf dem Formular habe auch folgendes schreiben:

Delphi-Quellcode:
CipherManager1.InitKey(Edit3.text,nil);
CipherManager1.EncodeFile(Filename,crypt);
Ciphermanager1.Free;
2. Frage: Ich würde gerne eine ComboBox einbauen, in der ich den Verschlüsselungsalgorithmus ändern kann, wie kann ich das machen? Ich hatte es so probiert:

Delphi-Quellcode:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Ciphermanager1.algorithm:=Combobox1.text;
end;
das hat aber nicht geklappt.

Vielen Dank schon mal im Vorraus für eure Hilfe

Sharky 11. Sep 2005 10:13

Re: VerschlüsselungsProgramm
 
Hai Sko,

Hagen empfiehlt die "Manger" aus dem DEC nicht zu verwenden. Diese hat er wohl nur zum testen entwickelt.
Wenn Du verschiedenen Verschlüsselungsmethoden verwenden möchtest kannst Du das z.B. so machen:
Delphi-Quellcode:
procedure TFRM_Main.btn_TestClick(Sender: TObject);
var
  DefCipherClass: TCipherClass;
begin
  if (Montag) then DefCipherClass := TCipher_Blowfish;
  if (Dienstag) then DefCipherClass := TCipher_Rijndael;
  if (Mittwoch) then DefCipherClass := TCipher_3DES;
  with DefCipherClass.Create('blubb',nil) do
  begin
    try
      EncodeFile(Filename, crypt);
    finally
      Free;
    end;
  end;
end;

Sko 11. Sep 2005 10:26

Re: VerschlüsselungsProgramm
 
Danke Sharky,

ich hab das jetz so gebaut:

Delphi-Quellcode:
var
  Form1: TForm1;
  Filename: string;
  crypt: string;
  Algorithmus: TCipherClass;
.
.
.
.
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.text = 'Blowfish' then Algorithmus := TCipher_Blowfish;
  if ComboBox1.text = 'Rijndael' then Algorithmus := TCipher_Rijndael;
  if ComboBox1.text = 'Sapphire II' then Algorithmus := TCipher_Sapphire II;
end;
aber da bekomme ich die Meldung undefinierter Bezeichner "TCipher_Rijndael" und
undefinierter Bezeichner "TCipher_Sapphire II"

Sharky 11. Sep 2005 10:29

Re: VerschlüsselungsProgramm
 
Zitat:

Zitat von Sko
...aber da bekomme ich die Meldung undefinierter Bezeichner "TCipher_Rijndael" ...

Binde noch die Unit Cipher1 mit ein.

Sko 11. Sep 2005 10:36

Re: VerschlüsselungsProgramm
 
Danke jetz funktionierts.

Aber kann ich irgendwie überprüfen, ob auch ein anderer Algorithmus verwendet wird? Ich hab jetz mal zum testen ein Word-Dokument verschlüsselt und bei allen 3 Varianten sah der Inhalt danach gleich aus.

Und dann noch was: bei größeren Dateien dauerts ja etwas mit der Verschlüsselung, kann ich da irgendwie eine ProgressBar einbauen?

Sharky 11. Sep 2005 10:44

Re: VerschlüsselungsProgramm
 
Zitat:

Zitat von Sko
... Aber kann ich irgendwie überprüfen, ob auch ein anderer Algorithmus verwendet wird?

Gehe das Programm eninmal Schritt für Schritt durch (Breakpoint setzen) durch und prüfe ob alle so passiert wie Du möchtest.

Zitat:

... kann ich da irgendwie eine ProgressBar einbauen?
Verwende nicht die Methode EncodeFile sondern EncodeBuffer. Dann kannst Du bei einer Buffergröße von z.B. 1024 Byte eine passende Progressbar verwenden welche Du dann jedesmal positionierst.

Sko 11. Sep 2005 10:54

Re: VerschlüsselungsProgramm
 
So, das mit den Algorithmen funktioniert, aber wie mach ich das mit dem Buffer? :gruebel:

Sharky 11. Sep 2005 11:04

Re: VerschlüsselungsProgramm
 
Zitat:

Zitat von Sko
So, das mit den Algorithmen funktioniert, aber wie mach ich das mit dem Buffer? :gruebel:

Du könntest die Datei zuerst in einen Stream laden.
Dann kopierst Du immer x-Byte vom Stream in einen Buffer. Diesen verschlüsselst Du dann und kopierst ihn in einen zweiten Stream. Dies machst Du solange bis Du am Ende des Quellstreams bist.

Ach ja,
hatte ich total vergessen:

"Herzlich Willkommen in der Delphi-PRAXiS".

negaH 11. Sep 2005 11:09

Re: Arbeiten mit dem DEC
 
Oder du benutzt gleich die Stream Methoden der Cipher Objekte, eg. TCipher_Blowfish.EndecodeStream() etc.

Gruß Hagen

Sharky 11. Sep 2005 11:17

Re: Arbeiten mit dem DEC
 
Zitat:

Zitat von negaH
Oder du benutzt gleich die Stream Methoden der Cipher Objekte, eg. TCipher_Blowfish.EndecodeStream() etc...

Hai Hagen,

haben die inzwichen eine Callbackmethode oder wie kann man dann eine Progressbar einbauen?
Oder meinst Du den Sourcestream "blockweise" in den Deststream zu verschlüsseln.
Wird die Position der Streams durch deine Methoden so gesetzt das man dies machen kann oder muss ich mich darum kümmern?

Sko 11. Sep 2005 11:30

Re: VerschlüsselungsProgramm
 
Zitat:

Zitat von Sharky
Ach ja,
hatte ich total vergessen:

"Herzlich Willkommen in der Delphi-PRAXiS".

Danke :-D

Aber das mit den Streams hab ich noch nicht so ganz verstanden, beim einzigen Beispiel das ich gesehen habe wo eine Datei in einen Stream geladen wurde, war die Datei durch einen Record angelegt, so das die Strukturen des Records in den Stream geladen wurden. Bei meinem Programm sind die Strukturen ja unbekannt, wie geht das da?

Sharky 11. Sep 2005 11:55

Re: VerschlüsselungsProgramm
 
Hai Sko,

hier einmal ein ungetestetes Beispiel. Das sollte man wenn möglich natürlich in einen Thread auslagern ;-)
Delphi-Quellcode:
procedure TFRM_Main.btn_TestClick(Sender: TObject);
var
  DefCipherClass: TCipherClass;
  quelle: TFileStream;
  ziel: TMemoryStream;
  buffer: Pointer;
  Blockgroesse: integer;
  Laenge: integer;
  quelldatei: string;
  zieldatei: string;
begin
  quelldatei := 'c:\blubb.txt';
  zieldatei := 'c:\blubb.enc';
  Blockgroesse := 1024;
  DefCipherClass := TCipher_Blowfish;
  quelle := TFileStream.Create(quelldatei, fmOpenRead or fmShareDenyNone);
  try
    ziel := TMemoryStream.Create;
    try
      with DefCipherClass.Create('', nil) do
      begin
        Mode := cmCBC;
        InitKey('blubb', nil);
        GetMem(Buffer, Blockgroesse);
        try
          while (quelle.Position < quelle.Size) do
          begin
            if (quelle.Size - quelle.Position > Blockgroesse) then
            begin
              Laenge := Blockgroesse
            end
            else
            begin
              Laenge := quelle.Size - quelle.Position
            end;
            quelle.ReadBuffer(Buffer^, Laenge);
            EncodeBuffer(Buffer^, Buffer^, Laenge);
            ziel.WriteBuffer(Buffer^, Laenge);
            // Hier könntest Du die Progessbar positionieren.
          end;
        finally
          FreeMem(Buffer);
        end;
        ziel.Position := 0;
        ziel.SaveToFile(zieldatei);
      end;
    finally
      ziel.Free;
    end;
  finally
    quelle.Free;
  end;
end;
Wenn ich es noch richtig im Kopf habe wurde von Hagen bzw. Luckie einmal eine von TStream abgeleitete Klasse TStreamProgressAdapter erstellt welche ein Ereigniss OnProgress besitzt um damit zum Beispiel eine Progressbar steuern zu können.

Sko 11. Sep 2005 13:10

Re: Arbeiten mit dem DEC
 
Danke!

Es funktioniert :thumb:

Ich hab nur die Blockgröße etwas geändert, weil es sonst sehr lange dauert bis etwas größere Dateien ver-/entschlüsselt sind.

negaH 11. Sep 2005 13:50

Re: Arbeiten mit dem DEC
 
Zitat:

Ich hab nur die Blockgröße etwas geändert
WICHTIG! ist nur das dein Buffer in der Bytegröße ein Vielfaches von TCipher.Context.BlockSize ist. Dies liegt am Padding der Cipher.

Gruß Hagen

Sko 11. Sep 2005 13:54

Re: Arbeiten mit dem DEC
 
Ich hab sie nur vergrößert (20480) das müsste doch gehen, oder?

negaH 11. Sep 2005 14:25

Re: Arbeiten mit dem DEC
 
Zitat:

Ich hab sie nur vergrößert (20480) das müsste doch gehen, oder?
Wenn BufferSize mod Cipher.BlockSize == 0 ist dann ist alles in Ordnung.

Am besten ist es aber wenn du gleiche TCipher.EncodeStream() benutzt. Als Stream benutzt du dann den TProgressStreamAdapter hier aus dem Forum um deine ProgressBar einzubinden. Die Methoden .EncodeStream() und .DecodeStream() übernehmen dann den Rest für dich.

Gruß Hagen

Sko 12. Sep 2005 15:16

Re: Arbeiten mit dem DEC
 
also, das ganze sieht jetz so aus:

Delphi-Quellcode:
var
  Form1: TForm1;
  Filename: string;
  crypt: string;
  Algorithmus: TCipherClass;
  quelle: TFileStream;
  ziel: TMemoryStream;
  buffer: Pointer;
  Blockgroesse: integer;
  Laenge: integer;
  Start: TTime;
  Ende: TTime;
  Lauf: TTime;
  Verb: real;
  Groesse: real;
  Versch: real;
.
.
.
begin
    Blockgroesse := 81920;
    if ComboBox1.text = 'Blowfish' then Algorithmus := TCipher_Blowfish;
    if ComboBox1.text = 'Rijndael' then Algorithmus := TCipher_Rijndael;
    if ComboBox1.text = 'Sapphire II' then Algorithmus := TCipher_Sapphire;
    quelle := TFileStream.Create(Filename, fmOpenRead or fmShareDenyNone);
    Start:=Time;
    Label7.caption:='00:00:00';
    try
    ziel := TMemoryStream.Create;
    try
      with Algorithmus.Create(Edit3.text, nil) do
      begin
        Mode := cmCBC;
        InitKey(Edit3.text, nil);
        GetMem(Buffer, 81920);
        try
          while (quelle.Position < quelle.Size) do
          begin
            if (quelle.Size - quelle.Position > Blockgroesse) then
            begin
              Laenge := Blockgroesse
            end
            else
            begin
              Laenge := quelle.Size - quelle.Position
            end;
            quelle.ReadBuffer(Buffer^, Laenge);
            EncodeBuffer(Buffer^, Buffer^, Laenge);
            ziel.WriteBuffer(Buffer^, Laenge);
            ProgressBar1.Min:=0;
            ProgressBar1.Max:=quelle.size;
            ProgressBar1.Position:=Quelle.Position;
            Form1.Refresh;
            Lauf:=Time;
            Groesse:=(quelle.Size/1024)/1024;
            Verb:=((quelle.size-quelle.position)/1024)/1024;
            Versch:=((Quelle.position)/1024/1024);
            Label8.caption:=RealtoStr(Groesse);
            Label7.caption:=TimeToStr(Lauf-Start);
            Label6.caption:=RealToStr(Verb);
            Label10.caption:=RealToStr(Versch);
          end;
        finally
          FreeMem(Buffer);
        end;
        ziel.Position := 0;
        ziel.SaveToFile(crypt);
      end;
    finally
      ziel.Free;
    end;
  finally
    quelle.Free;
end;
EDIT: Ich hab den Download wieder gelöscht, da ich einen Schwerwiegenden Fehler entdeckt habe:
Ich hab versucht eine 300 MB Datei zu verschlüsseln, aber mit der Zeit ging das Verschlüsseln immer langsamer, bis es nach 18 Minuten bei etwa 60 % garnicht mehr weiter ging.


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