Delphi-PRAXiS
Seite 2 von 2     12   

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 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:49 Uhr.
Seite 2 von 2     12   

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