我使用了如下的代码
CryptGetUserKey( hCryptProv,
AT_KEYEXCHANGE,
&hXchgKey
);
为了获得公钥,为什么会显示0x8009000d,该项不存在
其中hCryptProv由如下函数获得
CryptAcquireContext(
&hCryptProv,
NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);
CryptGetUserKey( hCryptProv,
AT_KEYEXCHANGE,
&hXchgKey
);
为了获得公钥,为什么会显示0x8009000d,该项不存在
其中hCryptProv由如下函数获得
CryptAcquireContext(
&hCryptProv,
NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);
解决方案 »
- 树型控件 求根节点 大吓们快来呀!!
- 100分求插件实例源码
- 求助:怎么向类里添加一个属性,谢谢~!
- 获取数据大小限制问题!!!急急!!!!!!!!
- installshield的使用讲解和下载地址,五分钟结帖
- 高分求助:在VC中如何启动发送电子邮件的程序(如outlook)?
- 程序中如何判断一个字符串变量中包含的汉字数和其他英文字符数
- 关于如何使用树形控件来显示、修改XML文件
- 我遇到了大困难ADO
- 晕 又是莫名的vb调用问题 第n次了 高人帮忙
- 神奇了!!高手来看看这个CreateFile为什么返回INVALID_HANDLE_VALUE??????
- 一副图片canny边缘检测后有断边,谁有将断边连接的边缘连接VC源代码。急.....................
{
FILE *hSource = NULL;
FILE *hDest = NULL;
int eof = 0; HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTKEY hXchgKey = 0; #define BLOCK_SIZE 160
#define BUFFER_SIZE (BLOCK_SIZE+16) // Give buffer 16 bytes of extra
// room for padding, and so forth.
BYTE pbBuffer[BUFFER_SIZE];
DWORD dwCount; BYTE *pbKeyBlob = NULL;
DWORD dwBlobLen; // Open the source file that contains the data to be encrypted.
if((hSource=fopen("test1.txt","rb"))==NULL) {
printf("Error opening source file!\n");
goto done;
} // Open the destination file.
if((hDest=fopen("test1.xxx","wb"))==NULL) {
printf("Error opening destination file!\n");
goto done;
} // Get a handle to the default provider.
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
} // Get a handle to key exchange key.
if(!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey)) {
printf("Error %x during CryptGetUserKey!\n", GetLastError());
goto done;
} // Create a random block cipher session key.
if(!CryptGenKey(hProv, CALG_RC2, CRYPT_EXPORTABLE, &hKey)) {
printf("Error %x during CryptGenKey!\n", GetLastError());
goto done;
} // Determine the size of the key blob and allocate memory.
if(!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, NULL, &dwBlobLen)) {
printf("Error %x computing blob length!\n", GetLastError());
goto done;
}
if((pbKeyBlob = (BYTE *)malloc(dwBlobLen)) == NULL) {
printf("Out of memory!\n");
goto done;
} // Export the key into a simple key blob.
if(!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob,
&dwBlobLen)) {
printf("Error %x during CryptExportKey!\n", GetLastError());
free(pbKeyBlob);
goto done;
} // Write the size of the key blob to the destination file.
fwrite(&dwBlobLen, sizeof(DWORD), 1, hDest);
if(ferror(hDest)) {
printf("Error writing header!\n");
free(pbKeyBlob);
goto done;
} // Write the key blob to the destination file.
fwrite(pbKeyBlob, 1, dwBlobLen, hDest);
if(ferror(hDest)) {
printf("Error writing header!\n");
free(pbKeyBlob);
goto done;
} // Free memory.
free(pbKeyBlob); // Encrypt the source file and write it to the destination file.
do
{
// Read up to BLOCK_SIZE bytes from source file.
dwCount = fread(pbBuffer, 1, BLOCK_SIZE, hSource);
if(ferror(hSource)) {
printf("Error reading data!\n");
goto done;
}
eof=feof(hSource); // Encrypt the data.
if(!CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &dwCount,
BUFFER_SIZE))
{
printf("Error %x during CryptEncrypt!\n", GetLastError());
goto done;
} // Write the data to the destination file.
fwrite(pbBuffer, 1, dwCount, hDest);
if(ferror(hDest)) {
printf("Error writing data!\n");
goto done;
}
} while(!feof(hSource)); done: // Destroy the session key.
if(hKey != 0) CryptDestroyKey(hKey); // Destroy the key exchange key.
if(hXchgKey != 0) CryptDestroyKey(hXchgKey); // Release the provider handle.
if(hProv != 0) CryptReleaseContext(hProv, 0); // Close the source file.
if(hSource != NULL) fclose(hSource); // Close destination file.
if(hDest != NULL) fclose(hDest);
return 0;
}
应该是 CryptAcquireContext 时,没有用名称,创建的时候,用的是另外一个用户,所以本用户并不能取得公钥吧?
或许用 CRYPT_MACHINE_KEYSET 可以创建一个全局的?
我还没有试过。