procedure TGenerateForm.OKBtnClick(Sender: TObject); var cont: PChar; err: string; hProv: HCRYPTPROV; KeyExchKey, SignKey: HCRYPTKEY; flag, keyLen: DWORD; begin {если ни один ключ не выбран - выход} if not (KEKCheckBox.Checked or SKCheckBox.Checked) then exit; {"считываем" имя контейнера} if length(ContainerEdit.Text) = 0 then cont := nil else begin err := ContainerEdit.Text; cont := StrAlloc(length(err) + 1); StrPCopy(cont, err); end; CryptAcquireContext(@hProv, cont, nil, PROV_RSA_FULL, 0); {генерация ключа обмена ключами (Key Exchange Key)} if KEKCheckBox.Checked then begin {"считываем" длину ключа и помещаем ее в старшее слово параметра ФЛАГИ} keyLen := strtoint(KeyExchLenEdit.text); flag := keyLen shl 16; if not CryptGenKey(hProv, AT_KEYEXCHANGE, flag, @KeyExchKey) then begin јобработка ошибокј end else begin ReportMemo.Lines.Add(''); ReportMemo.Lines.Add('Создан ключ обмена ключами:'); flag := 4; if not CryptGetKeyParam(KeyExchKey, KP_KEYLEN, @keyLen, @flag, 0) then begin јобработка ошибокј end else ReportMemo.Lines.Add(' длина ключа - ' + inttostr(keyLen)); flag := 4; if not CryptGetKeyParam(KeyExchKey, KP_ALGID, @keyLen, @flag, 0) then begin јобработка ошибокј end else ReportMemo.Lines.Add(' алгоритм - ' + algIDtostr(keyLen)); {функция algIDtostr здесь не приводится. Она состоит из единственного оператора case, отображающего целый идентификатор алгоритма в строку} end; end; {генерация ключа подписи (Signature Key)} if SKCheckBox.Checked then begin јвыполняется аналогично генерации ключа обмена ключамиј end; CryptReleaseContext(hProv, 0); end;