C++ MSDN C示例程序,用于签名散列并验证散列签名不';行不通

C++ MSDN C示例程序,用于签名散列并验证散列签名不';行不通,c++,winapi,hash,sign,cryptoapi,C++,Winapi,Hash,Sign,Cryptoapi,我已经尝试了一个示例程序,它演示了如何对哈希进行签名和验证哈希签名。但当我执行程序时,我得到以下输出: CSP context acquired. An error occurred in running the program. Error during CryptGetUserKey for signkey. Error number 8009000d. Program terminating. 8009000d是NTE_NO_键的数字错误代码。有人知道为什么程序会以这种方式失败吗?我在W

我已经尝试了一个示例程序,它演示了如何对哈希进行签名和验证哈希签名。但当我执行程序时,我得到以下输出:

CSP context acquired.
An error occurred in running the program.
Error during CryptGetUserKey for signkey.
Error number 8009000d.
Program terminating.

8009000d是NTE_NO_键的数字错误代码。有人知道为什么程序会以这种方式失败吗?我在Windows7上

显然,在您所获得的上下文中没有键

通过将此示例与另一个有关上下文获取和密钥生成的microsoft示例相结合,您可以稍微更改此示例。如果缺少这些键,您只需添加生成键的代码:

...
if (CryptGetUserKey(hProv,  AT_SIGNATURE, &hKey)) {  // if block unchanged
    printf("The signature key has been acquired. \n");
}
else if (GetLastError() == NTE_NO_KEY) {             // insert processing of missing keys 
    if (CryptGenKey(                                
        hProv,
        AT_SIGNATURE,
        0,
        &hKey)) {
        printf("Created a signature key pair.\n");
    }
    else {
        MyHandleError("Error during creation of new signature key.");
    }
}
else {                      // The original else part will handle other errors
    MyHandleError("Error during CryptGetUserKey for signkey.");
}

这意味着默认CSP没有私钥。()你验证过商店里是否有私钥吗?@我可能没有。如何创建一个?