为什么我CryptSignHash调用中老是有问题?试过无数的例子,甚至用了win32 sdk里面的例子
Example#include <wincrypt.h>
HCRYPTPROV hProv = 0;
#define BUFFER_SIZE 256
BYTE pbBuffer[BUFFER_SIZE];
HCRYPTHASH hHash = 0;
BYTE *pbSignature = NULL;
DWORD dwSigLen;
LPTSTR szDescription = TEXT("Test Data");
DWORD i;
// Get handle to the default provider.
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
}// Fill buffer with test data.
for(i = 0 ; i < BUFFER_SIZE ; i++) { pbBuffer[i] = (BYTE)i;
}// Create hash object.
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
printf("Error %x during CryptCreateHash!\n", GetLastError());
goto done;
}// Hash buffer.
if(!CryptHashData(hHash, pbBuffer, BUFFER_SIZE, 0)) {
printf("Error %x during CryptHashData!\n", GetLastError());
goto done;
}// Determine size of signature and allocate memory.
dwSigLen = 0;
if(!CryptSignHash(hHash, AT_SIGNATURE, TEXT(""), 0, NULL, &dwSigLen)) { printf("Error %x during CryptSignHash!\n", GetLastError());
if(GetLastError()!=NTE_BAD_LEN) goto done;
}
if((pbSignature = malloc(dwSigLen)) == NULL) {
printf("Out of memory!\n");
goto done;
}
// Sign hash object.
if(!CryptSignHash(hHash, AT_SIGNATURE, szDescription, 0, pbSignature, &dwSigLen)) {
printf("Error %x during CryptSignHash!\n", GetLastError());
goto done;
}
// Store or transmit the signature, test buffer, and description string....
done:// Free memory used to store signature.
if(pbSignature != NULL) free(pbSignature);// Destroy hash object.
if(hHash != 0) CryptDestroyHash(hHash);// Release provider handle.
if(hProv != 0) CryptReleaseContext(hProv, 0);
其他都没有问题,就是在CryptSignHash调用中出现程序调用失败。
还有CryptGetUserKey也会出现问题,这两个函数中都使用了AT_SIGNATURE这个参数。
我在XP和98下都调式过,不知道什么原因,在用AT_SIGNATURE参数前是否要自己生成密钥对呢?
Example#include <wincrypt.h>
HCRYPTPROV hProv = 0;
#define BUFFER_SIZE 256
BYTE pbBuffer[BUFFER_SIZE];
HCRYPTHASH hHash = 0;
BYTE *pbSignature = NULL;
DWORD dwSigLen;
LPTSTR szDescription = TEXT("Test Data");
DWORD i;
// Get handle to the default provider.
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
}// Fill buffer with test data.
for(i = 0 ; i < BUFFER_SIZE ; i++) { pbBuffer[i] = (BYTE)i;
}// Create hash object.
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
printf("Error %x during CryptCreateHash!\n", GetLastError());
goto done;
}// Hash buffer.
if(!CryptHashData(hHash, pbBuffer, BUFFER_SIZE, 0)) {
printf("Error %x during CryptHashData!\n", GetLastError());
goto done;
}// Determine size of signature and allocate memory.
dwSigLen = 0;
if(!CryptSignHash(hHash, AT_SIGNATURE, TEXT(""), 0, NULL, &dwSigLen)) { printf("Error %x during CryptSignHash!\n", GetLastError());
if(GetLastError()!=NTE_BAD_LEN) goto done;
}
if((pbSignature = malloc(dwSigLen)) == NULL) {
printf("Out of memory!\n");
goto done;
}
// Sign hash object.
if(!CryptSignHash(hHash, AT_SIGNATURE, szDescription, 0, pbSignature, &dwSigLen)) {
printf("Error %x during CryptSignHash!\n", GetLastError());
goto done;
}
// Store or transmit the signature, test buffer, and description string....
done:// Free memory used to store signature.
if(pbSignature != NULL) free(pbSignature);// Destroy hash object.
if(hHash != 0) CryptDestroyHash(hHash);// Release provider handle.
if(hProv != 0) CryptReleaseContext(hProv, 0);
其他都没有问题,就是在CryptSignHash调用中出现程序调用失败。
还有CryptGetUserKey也会出现问题,这两个函数中都使用了AT_SIGNATURE这个参数。
我在XP和98下都调式过,不知道什么原因,在用AT_SIGNATURE参数前是否要自己生成密钥对呢?
解决方案 »
- MFC 单文档CFormView,菜单项弹出对话框问题,求例程。谢谢
- 如何在工具栏上实现跑马灯效果?
- 一个函数中有CoInitialize,就一定要有CoUninitialize吗?可不可以分开?
- 【公告】没可用分提问技术问题的看过来
- 怎样自己写派生自CObject的自定义的类,新手的小问题,请大家帮忙,谢谢
- 怎样改变进度条控件的颜色?OnCtlColor中改变无效....
- 为什么我的Combo box不好使?
- 请问数据库设计老手一个非编程而是设计思想的问题?
- 想了解一下木马得工作原理,写一个是最好的学习方法,但是有点问题,请指教!!
- 如何制作一个对话框,使其像OICQ一样可以隐藏的对话框!!!
- 烦死了!老大们看看!
- 郁闷 MSDN上的例程 编译不过
创建数字签名的