var err: string; hProv: HCRYPTPROV;
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;
Содержание раздела