Уинкрипт Диффи Хеллман ошибка

Я пытаюсь использовать wincrypt для генерации закрытого ключа, используя значения P и G.
я получил ERROR_INVALID_PARAMETER Я не уверен, что не так в моем коде. Это та же реализация, что и в примере кода, приведенном на веб-сайте Microsoft.
https://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx#exchanging_diffie-hellman_keys

int err, gen_fld_sz, fld_sz, salt_len;
const char *generator = ""; // generator as string
const char *prime     = ""; // prime as string
BYTE* g_rgbPrime = new BYTE[fld_sz+1];
memcpy(g_rgbPrime, prime, fld_sz+1);  // Prime conta
BYTE* g_rgbGenerator = new BYTE[gen_fld_sz+1];
memcpy(g_rgbGenerator, generator, gen_fld_sz+1);
BYTE* g_rgbData = new BYTE[key_len+1];
memcpy(g_rgbData, str_server_pub_key, key_len);

BOOL fReturn;
HCRYPTPROV hProvParty1 = NULL;
HCRYPTPROV hProvParty2 = NULL;
DATA_BLOB P;
DATA_BLOB G;
DATA_BLOB S;
HCRYPTKEY hPrivateKey1 = NULL;
HCRYPTKEY hPrivateKey2 = NULL;
PBYTE pbKeyBlob1 = NULL;
PBYTE pbKeyBlob2 = NULL;
HCRYPTKEY hSessionKey1 = NULL;
HCRYPTKEY hSessionKey2 = NULL;
PBYTE pbData = NULL;

/************************
Construct data BLOBs for the prime and generator. The P and G
values, represented by the g_rgbPrime and g_rgbGenerator arrays
respectively, are shared values that have been agreed to by both
parties.
************************/
P.cbData = fld_sz+1;
P.pbData = (BYTE*)(g_rgbPrime);

G.cbData = gen_fld_sz+1;
G.pbData = (BYTE*)(g_rgbGenerator);
// Acquire a provider handle for party 1.
fReturn = CryptAcquireContext(
&hProvParty1,
NULL,
MS_ENH_DSS_DH_PROV,
PROV_DSS_DH,
CRYPT_VERIFYCONTEXT);
if (!fReturn)
{
log_error("error in setting CryptAcquireContext " << GetLastError());
goto ErrorExit;
}// Set the prime for party 1's private key.
fReturn = CryptSetKeyParam(
hPrivateKey1,
KP_P,
(PBYTE)&P,
0);
if (!fReturn)
{
log_error("error in setting CryptSetKeyParam " << GetLastError());
goto ErrorExit;
}

Я получаю ошибку в последнем CryptSetKeyParam. Пожалуйста посоветуй.

Заранее спасибо.

0

Решение

Ну, просто следуя приведенному вами примеру, было несколько шагов больше, чем вы.
Например, между CryptAcquireContext и CryptSetKeyParam он вызывает CryptGenKey, который дает временное значение hPrivateKey1.

// Create an ephemeral private key for party 1.
fReturn = CryptGenKey(
hProvParty1,
CALG_DH_EPHEM,
DHKEYSIZE << 16 | CRYPT_EXPORTABLE | CRYPT_PREGEN,
&hPrivateKey1);
if(!fReturn)
{
goto ErrorExit;
}

В своем коде вы вызываете CryptGenKey с hPrivateKey1 = NULL;

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]