最后总提示我通过私钥加密hash值进行签名失败!!
急求改!!改对了追加积分!!谢谢!!下面附代码
思路是先建密钥对,然后得到私钥,再Hash,再加密签名
#include
#include
#include
using namespace std;
int main()
{
HCRYPTPROV hCryptProv=NULL;
HCRYPTKEY sehKey=NULL;
HCRYPTKEY privateKey=NULL;
HCRYPTKEY hPubKey=NULL;
HCRYPTHASH sehHash=NULL;
BYTE* pbKeyBlob_pv=NULL;//私钥的blob
DWORD dwBlobLen_pv=0;//私钥blob长度
BYTE* pbKeyBlob_pub=NULL;//公钥的blob
DWORD dwBlobLen_pub=0;//公钥blob长度
LPTSTR szDescription=_T("Test file Description");
BYTE* pbSignature=NULL;//这个以后再说
HCRYPTKEY hKey=NULL;
if(!CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
if(!CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_NEWKEYSET))
{
cout<<"创建密钥容器失败,获得CSP句柄失败!"
return 0;
}
}
if(!CryptGenKey(
hCryptProv,
//CSP句柄
AT_SIGNATURE,
//创建公私密钥对,表示签名的密钥对
0x08000000|CRYPT_EXPORTABLE,
//可导出,公钥长度为276,私钥长度为1172
&hKey))
//创建成功返回新创建的密钥对的句柄
{
cout<<"无法获得句柄\n";
return 0;
}
if(!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, NULL, NULL, &dwBlobLen_pv))
{
cout<<"导出私钥长度失败\n";
return 0;
}
if(!(pbKeyBlob_pv=(BYTE *)malloc(dwBlobLen_pv)))
{
cout<<"分配内存错误\n";
return 0;
}
if(!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, NULL, pbKeyBlob_pv, &dwBlobLen_pv))
{
cout<<"导出私钥失败\n";
return 0;
}
if(!CryptImportKey(
hCryptProv,
pbKeyBlob_pv,
dwBlobLen_pv,
0,
0,
&privateKey))
{
cout<<"导入私钥失败\n";
return 0;
}
CString IK=_T("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
DWORD dwBufferLen=2*(IK.GetLength()+1);
BYTE* pbBuffer=NULL;
pbBuffer=(BYTE *)malloc(dwBufferLen);
pbBuffer=(BYTE *)IK.GetBuffer();
if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &sehHash))
{
cout<<"创建second散列对象失败\n";
return 0;
}
if(!CryptHashData(
sehHash,
pbBuffer,
dwBufferLen,
0))
{
cout<<"计算second散列值失败\n";
return 0;
}
if(!CryptEncrypt(
privateKey,//密钥
sehHash,
//如果数据同时进行散列和加密,这里传入一个散列对象
TRUE,
0,
pbBuffer,//输入被加密数据,输出加密后的数据
&dwBufferLen,
//输入被加密数据实际长度,输出加密后数据长度
dwBufferLen)) //pbBuffer的大小。
{
cout<<"通过私钥加密hash值进行签名失败!\n";
cout<<"错误类型"<<GetLastError()<<endl;
return 0;
}
return 0;
}
|