Методы криптографической защиты информации Windows

procedure TMainForm.VerifyItemClick(Sender: TObject);
var
 err: string;
 hProv: HCRYPTPROV;
 key: HCRYPTKEY;
 alg: ALG_ID;
 hash: HCRYPTHASH;
 infile: file;
 size, test, textsize: DWORD;
 buf: PBYTE;
 signature, signkey: PBYTE;
begin
 …
  получаем контекст криптопровайдера
  …
  OpenDialog1.Title := 'Укажите файл с подписанными данными';
 if OpenDialog1.Execute then
 begin
  AssignFile(infile, OpenDialog1.FileName);
  reset(infile, 1);
  {считываем идентификатор алгоритма хеширования}
  BlockRead(infile, alg, 4);
  {считываем размер подписанных данных и сами данные}
  BlockRead(infile, textsize, 4);
  GetMem(buf, textsize);
  BlockRead(infile, buf^, textsize, test);
  if test <
  textsize then
  begin
  MessageDlg('Неверный формат файла! Процесс прерван.', mtError, [mbOK], 0);
  exit;
  end;
  {считываем размер подписи и саму подпись}
  BlockRead(infile, test, 4);
  GetMem(signature, test);
  BlockRead(infile, signature^, test);
  CloseFile(infile);
 end
 else
  exit;
 …
  создаем хеш - объект и хешируем данные
  …
  OpenDialog1.Title := 'Укажите файл с открытым ключом подписи';
 if OpenDialog1.Execute then
 begin
  AssignFile(infile, OpenDialog1.FileName);
  reset(infile, 1);
  size := FileSize(infile);
  GetMem(signkey, size);
  BlockRead(infile, signkey^, size);
  CloseFile(infile);
 end
 else
  exit;
 {импортируем открытый ключ подписи отправителя}
 CryptImportKey(hProv, signkey, size, 0, 0, @key);
 FreeMem(signkey, size);
 {проверяем подпись}
 if CryptVerifySignature(hash, signature, test, key, nil, 0) then
 begin
  MessageDlg('Подпись верна.', mtInformation, [mbOK], 0);
  {сохраняем подписанные данные}
  SaveDialog1.Title := 'Укажите имя файла для сохранения данных';
  if SaveDialog1.Execute then
  begin
  AssignFile(infile, SaveDialog1.FileName);
  rewrite(infile, 1);
  BlockWrite(infile, buf^, textsize);
  CloseFile(infile);
  end;
 end
 else
 begin
  case int64(GetLastError) of
  NTE_BAD_SIGNATURE: err := 'Подпись неверна!';
  {обработка других ошибок}
  else
  err := 'Ошибка при проверке подписи: Unknown error';
  end;
  MessageDlg(err, mtError, [mbOK], 0);
 end;
 …
  уничтожаем хеш - объект и импортированный ключ
  и освобождаем контекст криптопровайдера
  …
end;

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...