Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > DCPcrypt процесс выполнения.


Автор: TrippDian 27.10.2006, 12:25
Помогите, пожалуйста, никак не могу реализовать наглядность процесса выполнения шифрования текущего файла с помощью компонента DCPcrypt v2 Beta 3. Нужно сделать progress bar в программе, а как это сделать не могу никак додуматься. Или посоветуйте компонент не уступающий возможности выше описанному с возможностью отслеживать процесс выполнения шифрования... Спасибо большое заранее.

Автор: drkot 27.10.2006, 14:14
Если в нем нет события по завершению шифрования одного буфера, то врядли получится.
можно конечно фиктивный прогресс ставить от стороннего таймера

Автор: TrippDian 27.10.2006, 14:18
А по подробнее про фиктивный прогресс от стороннего таймера можно ? =)

Автор: Reptile 27.10.2006, 14:45
Цитата

А по подробнее про фиктивный прогресс от стороннего таймера можно ? =) 

Кидаеш на форму ProgressBar, таймер и по таймеру выставляеш
Код

ProgressBar1.StepIt;

Автор: TrippDian 27.10.2006, 15:35
А каким макаром он узнает на какой стадии обработки находится мой файл ?

Автор: Bose 27.10.2006, 15:46
Запустить процесс шифрования небольшого объема данных, замерь время, за которое этот объём будет зашифрован. И используй полученный интервал.

Автор: drkot 27.10.2006, 15:50
Цитата(TrippDian @  27.10.2006,  15:35 Найти цитируемый пост)
А каким макаром он узнает на какой стадии обработки находится мой файл ?

никаким. на то он и фиктивный.

по методу Bose, расчитывай ориентировочное время и домножай на коэффициент для надежноти. а на прогресе напиши, что время ориентировочное.

Автор: TrippDian 27.10.2006, 15:52
Цитата(Bose @ 27.10.2006,  15:46)
Запустить процесс шифрования небольшого объема данных, замерь время, за которое этот объём будет зашифрован. И используй полученный интервал.

Прога должна использоваться на разных компьютерах с разными характеристиками и разными задачами, следовательно время везде будет разное... Не подходит это...

Добавлено @ 15:54 
Попробую размер файла отслеживать и на основе этого прогресс пускать, но всеже компы то разные и скорость разная будет... хотелось бы что-нибудь поточнее =(

Автор: Reptile 27.10.2006, 15:59
Попробуй 
Цитата

Запустить процесс шифрования небольшого объема данных, замерь время, за которое этот объём будет зашифрован.

выполнить программно smile 

Автор: Bose 27.10.2006, 16:08
Цитата(TrippDian @  27.10.2006,  15:52 Найти цитируемый пост)
Прога должна использоваться на разных компьютерах с разными характеристиками и разными задачами, следовательно время везде будет разное... Не подходит это...

Программно выполняй, непосредственно перед выполнением самого шифрования.

Автор: TrippDian 27.10.2006, 16:11
Сори, мб туплю, поподробнее можно, а то что-то никак не могу понять =)

Автор: Snowy 27.10.2006, 16:20
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// криптоблок
const
  bsz = 65532;
  ADVAPI32    = 'advapi32.dll';
  PROV_RSA_FULL    = 1;
  SIMPLEBLOB       = $1;
  CRYPT_VERIFYCONTEXT = $F0000000;
  CALG_RC4         = ((3 shl 13) or (4 shl 9) or 1);
  CALG_SHA         = ((4 shl 13) or 0 or 4);

type
  HCRYPTPROV  = ULONG;
  HCRYPTKEY   = ULONG;
  ALG_ID = ULONG;
  PHCRYPTPROV = ^HCRYPTPROV;
  PHCRYPTKEY  = ^HCRYPTKEY;
  LPAWSTR = PWideChar;
  HCRYPTHASH  = ULONG;
  PHCRYPTHASH = ^HCRYPTHASH;
function CryptAcquireContext(Prov:PHCRYPTPROV;Container:LPAWSTR;Provider:LPAWSTR;ProvType:DWORD;Flags:DWORD):BOOL;stdcall;external ADVAPI32 name 'CryptAcquireContextW';
function CryptCreateHash(Prov:HCRYPTPROV;Algid:ALG_ID;Key:HCRYPTKEY;Flags:LongInt;Hash:PHCRYPTHASH):BOOL;stdcall;external ADVAPI32 name 'CryptCreateHash';
function CryptHashData(Hash:HCRYPTHASH;Data:PBYTE;DataLen :LongInt;Flags:LongInt):BOOL;stdcall;external ADVAPI32 name 'CryptHashData';
function CryptDeriveKey(Prov:HCRYPTPROV;Algid:ALG_ID;BaseData:HCRYPTHASH;Flags:LongInt;Key:PHCRYPTKEY) :BOOL;stdcall;external ADVAPI32 name 'CryptDeriveKey';
function CryptDestroyHash(hHash :HCRYPTHASH) :BOOL;stdcall;external ADVAPI32 name 'CryptDestroyHash';
function CryptReleaseContext(hProv:HCRYPTPROV;dwFlags:DWORD):BOOL;stdcall;external ADVAPI32 name 'CryptReleaseContext';
function CryptEncrypt(Key:HCRYPTKEY;Hash:HCRYPTHASH;Final:BOOL;Flags:DWORD;Data:PBYTE;Len:PDWORD;BufLen:DWORD):BOOL;stdcall;external ADVAPI32 name 'CryptEncrypt';
function CryptDecrypt(Key:HCRYPTKEY;Hash:HCRYPTHASH;Final:BOOL;Flags:DWORD;Data:PBYTE;Len:PDWORD):BOOL;stdcall;external ADVAPI32 name 'CryptDecrypt';

var
  hProv: HCRYPTPROV;
  hSKey: HCRYPTKEY;

procedure Init(Password: string);
var
  hash:  HCRYPTHASH;
begin
  CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
  CryptCreateHash(hProv, CALG_SHA, 0, 0, @hash);
  CryptHashData(hash, @Password[1], length(Password), 0);
  CryptDeriveKey(hProv, CALG_RC4, hash, 0, @hSKey);
  CryptDestroyHash(hash);
end;

procedure Done;
begin
  CryptReleaseContext(hProv, 0);
end;

procedure Process(InFile, OutFile, Password: string; Crypt: boolean);
var
  fs,fd: TFileStream;
  s: string;
  sz: dword;
begin
  SetLength(s, bsz); Init(Password);
  try
    fs := TFileStream.Create(InFile, $40);
    fd := TFileStream.Create(OutFile, $FFFF);
    Form1.ProgressBar1.Max := fs.Size div bsz;
    try
      repeat
        sz := fs.Read(s[1], bsz);
        if Crypt then CryptEncrypt(hSKey, 0, (sz < bsz), 0, pointer(s), @sz, sz)
        else CryptDecrypt(hSKey, 0, (sz < bsz), 0, pointer(s), @sz);
        fd.Write(s[1], sz);
        Form1.ProgressBar1.Position := fs.Position div bsz;
      until sz < bsz;
    finally
      fs.Free; fd.Free;
    end;
  finally
    Done;
  end;
end;

procedure Crypt(InFile, OutFile, Password: string);
begin
  Process(InFile, OutFile, Password, true);
end;

procedure Decrypt(InFile, OutFile, Password: string);
begin
  Process(InFile, OutFile, Password, false);
end;

// Кончился криптоблок

// Батоны:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Crypt('C:\1.dat', 'C:\2.dat', 'VerySecretPassword'); // шифруем
  ShowMessage('Зашифровано!');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Decrypt('C:\2.dat', 'C:\3.dat', 'VerySecretPassword'); // расшифровываем
  ShowMessage('Расшифровано!');
end;

end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)