2017-08-25 4 views
0

J'essaie d'utiliser wincrypt pour générer la clé privée en utilisant les valeurs P et G. Je reçois ERROR_INVALID_PARAMETER Je ne suis pas sûr de ce qui ne va pas dans mon code. C'est la même implémentation que dans l'exemple de code donné sur le site web de Microsoft. https://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx#exchanging_diffie-hellman_keysWincrypt Diffie Hellman erreur

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; 
    } 

Je reçois une erreur dans la dernière CryptSetKeyParam. Veuillez nous conseiller

Merci d'avance.

Répondre

0

Eh bien, juste en suivant l'exemple que vous avez lié, il y avait quelques étapes plus que vous faites. Par exemple, entre CryptAcquireContext et CryptSetKeyParam, il appelle CryptGenKey, ce qui donne une valeur temporaire à 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; 
} 

Dans votre code, vous appelez CryptGenKey avec hPrivateKey1 = NULL;

+0

J'ai essayé de l'ajouter et j'ai l'erreur ci-dessous. erreur dans le réglage CryptSetKeyParam 2148073477 –