CryptoAPI problem
- From
- Gennady Porev (2:550/4.1)
- To
- All
- Date
- 2002-12-27T13:13:27Z
- Area
- SU.WINDOWS.NT.PROG
Hi, All!
Вот, осваиваю я CryptoAPI. Конекст берётся, ключ генерится, publickey blob берётся (надо для другой части), криптовать буфер не хочет :((( Что я не так делаю?
=== Cut ===
{$APPTYPE CONSOLE}
program CrypDemo;
uses Windows, SysUtils;
CONST LibName = 'AdvAPI32.dll';
PROV_NAME = 'Microsoft Base Cryptographic Provider v1.0'; // MS_DEF_PROV
PROV_TYPE = 1; // RSA_FULL
CRYPT_VERIFYCONTEXT = $F0000000;
CRYPT_MACHINE_KEYSET = $00000020;
CRYPT_SILENT = $00000040;
CRYPT_NO_SALT = $00000010;
PUBLICKEYBLOB = $00000006;
ALG_CLASS_KEY_EXCHANGE = 5 shl 13;
ALG_TYPE_RSA = 2 shl 9;
ALG_SID_RSA_ANY = 0;
CALG_RSA_KEYX = (ALG_CLASS_KEY_EXCHANGE or ALG_TYPE_RSA or ALG_SID_RSA_ANY);
function CryptAcquireContext(
var phProv : THandle;pszContainer,pszProvider : PChar;dwProvType : DWord;dwFlags : DWord
) : BOOL; stdcall external LibName name 'CryptAcquireContextA';
function CryptReleaseContext(
hProv : THandle;dwFlags : DWord
) : BOOL; stdcall external LibName name 'CryptReleaseContext';
function CryptGenKey(
hProv : THandle;ALG_ID : DWord;dwFlags : DWord;var hKey : THandle
) : BOOL; stdcall external LibName name 'CryptGenKey';
function CryptDestroyKey(
hKey : THandle
) : BOOL; stdcall external LibName name 'CryptDestroyKey';
function CryptExportKey(
hKey : THandle;hExpKey : THandle;dwBlobType : DWord;dwFlags : DWord;Data : Pointer;var dwDataLen : DWord
) : BOOL; stdcall external LibName name 'CryptExportKey';
function CryptEncrypt(
hKey : THandle;hHash : THandle;Final : Bool;dwFlags : DWord;Data : Pointer;var dwDataLen : DWord;dwBufLen : DWord
) : BOOL; stdcall external LibName name 'CryptEncrypt';
const BufSize = $80;
VAR R : Bool;
Hcsp,HKey : THandle;
BlobSize : DWord;
Blob : AnsiString;
Buffer : AnsiString;
DataLen : DWord;
begin
R:=CryptAcquireContext(Hcsp,nil,PROV_NAME,PROV_TYPE,CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET or CRYPT_SILENT);
Writeln(R);
R:=CryptGenKey(Hcsp,CALG_RSA_KEYX,CRYPT_NO_SALT,HKey);
Writeln(R);
BlobSize:=0;
R:=CryptExportKey(HKey,0,PUBLICKEYBLOB,0,nil,BlobSize);
Writeln(R);
Writeln('BlobSize is ',BlobSize);
SetLength(Blob,BlobSize);
R:=CryptExportKey(HKey,0,PUBLICKEYBLOB,0,Pointer(Blob),BlobSize);
Writeln(R);
SetLength(Buffer,BufSize);
FillChar(Pointer(Buffer)^,BufSize,'-');
Buffer[1]:='+';
DataLen:=1;
> R:=CryptEncrypt(HKey,0,True,0,Pointer(Buffer),DataLen,BufSize);
> // Вот в этом месте показывает FALSE, хотя я вроде бы всё сделал как в
> МСДНе написано 8-((.
Writeln(R);
R:=CryptDestroyKey(HKey);
Writeln(R);
R:=CryptReleaseContext(Hcsp,0);
Writeln(R);
Readln;
end.
=== Cut ===
* Разослано также в SU.WINDOWS.PROG
* Разослано также в SU.WINDOWS.NT.PROG
Relax -=- Gennady -=- icq: 13031700
--- GoldED/W32 3.0.1
* Origin: WatchCat-UA (2:550/4.1)