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;