Windows加密问题,急!!!

[复制链接]
查看11 | 回复2 | 2020-1-6 01:10:13 | 显示全部楼层 |阅读模式
最后总提示我通过私钥加密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;
}

回复

使用道具 举报

千问 | 2020-1-6 01:10:13 | 显示全部楼层
在WindowsXP中确实可以直接对文件(夹)进行加密,但是,这需要一个前提:要加密的文件(夹)所在的硬盘分区是NFTS格式的。如果你的硬盘分区不是NFTS格式,请进行操作转换后,再按下面的方法进行加密。选中需要加密的文件(夹),右击鼠标键,在随后弹出的快捷菜单中,选“属性”选项,在“常规”标签中,按“高级”按钮打开“高级属性”对话框,选中其中的“加密内容以便保护数据”选项后,确定退出即可。特别需要提醒的是:如果用上述方法对文件(夹)进行了加密,以后重新安装系统之前,最好对它进行解密(解密与加密方法相似)操作,否则系统重装后,可能造成文件(夹)不能正常打开。...
回复

使用道具 举报

千问 | 2020-1-6 01:10:13 | 显示全部楼层
你的代码一时半会也看不懂,这是微软官方的一个关于如何加密文件的小视频,希望给你起到一定的作用:http://msdn.microsoft.com/en-us/visualc/bb892743.aspx...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行