| ||||
| ||||
Подскажите, плз, что неправильно в вызове CryptEncrypt? Почему валится все? procedure TForm1.Button5Click(Sender: TObject); var CryptAcquireContextProc:TCryptAcquireContextProc; CryptGenKeyProc:TCryptGenKeyProc; CryptEncryptProc:TCryptEncryptProc; CryptDecryptProc:TCryptDecryptProc; Handle: THandle; //Параметры для функций //CPAcquireContext phProv: HCRYPTPROV; pszContainer: LPCSTR; pszProvider: LPCSTR; dwProvType: DWORD; dwFlags: DWORD; //CPGenKey Algid: ALG_ID; phKey: HCRYPTKEY; //CPEncrypt hHash: HCRYPTHASH; Final: BOOL; pbData: PBYTE; pdwDataLen: DWORD; dwBufLen: DWORD; D: Array[1..160] of char; Ptr: Pointer; Name,Data: String; begin Handle := LoadLibrary(’advapi32.dll’); if Handle <> 0 then begin @CryptAcquireContextProc := GetProcAddress(Handle, ’CryptAcquireContextA’); @CryptGenKeyProc := GetProcAddress(Handle, ’CryptGenKey’); @CryptEncryptProc := GetProcAddress(Handle, ’CryptEncrypt’); // Создание контекста провайдера phProv:=0; pszContainer:=Nil; pszProvider:= CP_DEF_PROV; dwProvType:=PROV_GOST_DH; dwFlags:=CRYPT_MACHINE_KEYSET; if not CryptAcquireContextProc(phProv,pszContainer,pszProvider,dwProvType,dwFlags) then ShowMessage(IntToStr(GetLastError) + ’ CryptAcquireContextProc’); ALGID:= CALG_GR3410;//CALG_G28147_IMIT; dwFlags:=0; If not CryptGenKeyProc(phProv,ALGID,dwFlags,phKey) then ShowMessage(IntToStr(GetLastError) + ’ CryptGenKeyProc’); dwFlags:= 0; hHash:=0;// хэш не нужен Final:=TRUE;//последний блок Data:= ’CCCCCCCC’; Ptr := AllocMem(Length(Data)); pbData:= Ptr; StrPCopy(PChar(Ptr), Data); pdwDataLen:= Length(Data); dwBufLen:= 1000; If not CryptEncryptProc(phKey,0,Final,dwFlags,pbData,pdwDataLen,dwBufLen) then ShowMessage(IntToStr(GetLastError) + ’ CryptEncryptProc’); FreeLibrary(Handle); end; end; | ||||
Ответы: | ||||
| ||||
Потому что Вы пытаетесь шифровать на ключах, которые для этого не предназначены! Можно шифровать только на сессионных ключах. В данном форуме шифрование уже много раз обсуждалось. Просмотрите, плз, его... | ||||