2017-08-25 128 views
0

我正在尝试使用wincrypt生成使用P和G值的私钥。 我得到ERROR_INVALID_PARAMETER我不知道我的代码中出了什么问题。它与Microsoft网站中给出的示例代码具有相同的实现。 https://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx#exchanging_diffie-hellman_keysWincrypt Diffie Hellman错误

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

在你的代码中,你正在用hPrivateKey1 = NULL调用CryptGenKey;

+0

我试着添加它,我得到下面的错误。设置CryptSetKeyParam 2148073477时出错 –