Hi Luckie,
sorry für die späte Antwort, aber es gibt auch mal einen Geburtstag zu feiern.
Also, es ist schon erschreckend wie du so schnell die Schwachstellen im
DEC findest. OnProgress() ist ein globales Event das 1. nicht threadsafe ist und 2. global immer nur einen Verschlüsselungsprozess unterstützt.
D.h. mit OnProgress() wirst du das was du willst nie hinbekommen. Vergiss es also. Verzichte auf TCipherManager/THashManager, beides sind Komponenten die ich für die DAU's coden musste, es sind Drag&Design Hilfsmittel.
Nachfolgend zeige ich wie man jeden Stream mit Progress Funktionalität ausbauen kann. D.h. deine Progressbar sollte individuell zum Streaming sein, dann ist sie auch threadsafe. Desweiteren zeige ich wie man Verschlüsselt ohne TCipherManager, die Entschlüsselung bekommste damit selber hin.
Delphi-Quellcode:
type
TStreamProgressAdapter = class(TStream)
private
FStream: TStream;
protected
procedure SetSize(NewSize: Longint); override;
public
constructor Create(AStream: TStream);
destructor Destroy; override;
function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;
function Seek(Offset: Longint; Origin: Word): Longint; override;
procedure DoProgress(Writing: Boolean); virtual;
end;
procedure TStreamProgressAdapter.SetSize(NewSize: Longint);
begin
TStreamProgressAdapter(FStream).SetSize(NewSize);
end;
constructor TStreamProgressAdapter.Create(AStream: TStream);
begin
inherited Create;
FStream := AStream;
end;
destructor TStreamProgressAdapter.Destroy;
begin
inherited Destroy;
FStream.Free;
end;
function TStreamProgressAdapter.Read(var Buffer; Count: Longint): Longint;
begin
Result := FStream.Read(Buffer, Count);
DoProgress(False);
end;
function TStreamProgressAdapter.Write(const Buffer; Count: Longint): Longint;
begin
Result := FStream.Write(Buffer, Count);
DoProgress(False);
end;
function TStreamProgressAdapter.Seek(Offset: Longint; Origin: Word): Longint;
begin
Result := FStream.Seek(Offset, Origin);
end;
procedure TStreamProgressAdapter.DoProgress(Writing: Boolean);
begin
// hier deine Progress Funktionen einbauen
end;
procedure Encrypt(Stream: TStream; const Password: String; CipherClass: TCipherClass = nil); overload;
begin
if CipherClass = nil then
CipherClass := TCipher_Blowfish;
with CipherClass.Create('', nil) do
try
Mode := cmCTS;
InitKey(Password, nil);
EncodeStream(Stream, Stream, -1);
finally
Free;
end;
end;
procedure Encrypt(const FileName, Password: String; CipherClass: TCipherClass = nil); overload;
var
Stream: TStream;
begin
Stream := TStreamProgressAdapter.Create(TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive));
try
Encrypt(Stream, Password, CipherClass);
finally
Stream.Free;
end;
end;
procedure TestC;
begin
Encrypt('d:\test.bin', 'Test');
Encrypt('d:\test.bin', 'Test', TCipher_Rijndael);
Encrypt('d:\test.bin', 'Test', TCipherClass(DECClassByName('IDEA', TCipher)));
end;
Gruß Hagen