procedure TExportForm.OKBtnClick(Sender: TObject); var cont: PChar; err: string; hProv: HCRYPTPROV; key, expKey: HCRYPTKEY; pbuf: PBYTE; buflen: DWORD; f: file; hash: HCRYPTHASH; begin {если ни один ключ не выбран - выход} if not (KEKCheckBox.Checked or SKCheckBox.Checked) then exit; {если нужен пароль, т.е. экспортируется ключевая пара целиком} if PasswEdit.Enabled and (PasswEdit.Text <> Passw2Edit.Text) then begin MessageDlg('Ошибка при вводе пароля! Повторите ввод.', mtError, [mbOK], 0); exit; end; … "считываем" имя контейнера и подключаемся к криптопровайдеру … если нужен ключ шифрования - создаем его на основании пароля … {ключ обмена ключами} if KEKCheckBox.Checked then repeat {получаем дескриптор ключа} CryptGetUserKey(hProv, AT_KEYEXCHANGE, @key); {пытаемся определить размер буфера для экспорта ключа} if (WhatRadioGroup.ItemIndex = 0) then CryptExportKey(key, 0, PUBLICKEYBLOB, 0, nil, @bufLen) else CryptExportKey(key, expKey, PRIVATEKEYBLOB, 0, nil, @bufLen); GetMem(pbuf, bufLen); {экспортируем данные} if (WhatRadioGroup.ItemIndex = 0) then CryptExportKey(key, 0, PUBLICKEYBLOB, 0, pbuf, @bufLen) else CryptExportKey(key, expKey, PRIVATEKEYBLOB, 0, pbuf, @bufLen); {освобождаем дескриптор ключа обмена ключами (сам ключ при этом не уничтожается)} CryptDestroyKey(key); SaveDialog1.Title := 'Укажите файл для сохранения ключа обмена ключами'; if SaveDialog1.Execute then begin AssignFile(f, SaveDialog1.FileName); rewrite(f, 1); BlockWrite(f, pbuf^, bufLen); CloseFile(f); MessageDlg('Ключ обмена ключами успешно сохранен', mtInformation, [mbOK], 0); end; until true; {KeyExchange} {ключ подписи} if SKCheckBox.Checked then repeat јаналогично ключу обмена ключамиј until true; {Signature} … если создавался ключ на основании пароля - уничтожаем его, после чего освобождаем контекст криптопровайдера … end;