HCRYPTPROV的初始化问题

ruifengshan 2010-03-10 09:12:11
HCRYPTPROV只包含头文件Wincrypt.h怎么就不行呢?要怎样才能初始化呀

...全文
494 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruifengshan 2010-03-10
  • 打赏
  • 举报
回复
还是不行啊。。呵呵。。。
yuzl32 2010-03-10
  • 打赏
  • 举报
回复

#include <windows.h>
#include <Wincrypt.h>
#include <iostream>

#pragma comment(lib,"Advapi32.lib")

using namespace std;

class CCryptRandom
{
public:
CCryptRandom();
virtual ~CCryptRandom();
bool get(void *lpGoop,DWORD cbGoop);
private:
HCRYPTPROV m_hProv;
};

CCryptRandom::CCryptRandom()
{
m_hProv=NULL;
CryptAcquireContext(&m_hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT);
}
CCryptRandom::~CCryptRandom()
{
if(m_hProv)
CryptReleaseContext(m_hProv,0);
}
bool CCryptRandom::get(void *lpGoop,DWORD cbGoop)
{
if(!m_hProv)
return false;
return CryptGenRandom(m_hProv,cbGoop,reinterpret_cast <LPBYTE>(lpGoop));
}
void main()
{
CCryptRandom r;

//开始生成随机数,例如100个[0,99]域的随机数
for(int i=0;i <100;i++)
{
DWORD d;
if(r.get(&d,sizeof d))
cout <<d%100 <<endl;
}
}
ruifengshan 2010-03-10
  • 打赏
  • 举报
回复
#include "windows.h"
#include "Wincrypt.h"
#include <iostream.h>
class CCryptRandom
{
public:
CCryptRandom();
virtual ~CCryptRandom();
bool get(void *lpGoop,DWORD cbGoop);
private:
HCRYPTPROV m_hProv;
};
CCryptRandom::CCryptRandom()
{
m_hProv=NULL;
CryptAcquireContext(&m_hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT);
}
CCryptRandom::~CCryptRandom()
{
if(m_hProv)
CryptReleaseContext(m_hProv,0);
}
bool CCryptRandom::get(void *lpGoop,DWORD cbGoop)
{
if(!m_hProv)
return false;
return CryptGenRandom(m_hProv,cbGoop,reinterpret_cast<LPBYTE>(lpGoop));
}
void main()
{
CCryptRandom r;
//开始生成随机数,例如100个[0,99]域的随机数
for(int i=0;i<100;i++)
{
DWORD d;
if(r.get(&d,sizeof d))
cout<<d%100<<endl;
}
}
CryptGenRandom()函数的一般使用
①首先通过CryptAcquireContext 获取一个CSP (cryptographic service provider)提供的句柄,定义如下:
BOOL WINAPI CryptAcquireContext(
HCRYPTPROV* phProv,
LPCTSTR pszContainer,
LPCTSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags

参数说明:
phProv : 一个密码的服务提供者(cryptographic service provider,CSP)的句柄指针。
PszContainer:关键字容器的名字。当 dwFlags 被设为 CRYPT_VERIFYCONTEXT 时, pszContainer 必须被设为 0。一般 pszContainer 为NULL时,一个缺省钥匙容器名字被使用。例如,微软基本密码提供者(Microsoft Base Cryptographic Provider)的用户使用其当前登录名字当前作为关键字容器名字登录。
PszProvider::指定的CSP提供者的名字,是以0结尾的字符串。如果这个参数是空的,用户缺省供应商被使用。
DwProvType:指定CSP提供者的类型,取值可如下。
PROV_RSA_FULL PROV_SSL
PROV_RSA_SIG PROV_EC_ECDSA_SIG
PROV_DSS PROV_EC_ECNRA_SIG
PROV_DSS_DH PROV_EC_ECDSA_FULL
PROV_FORTEZZA PROV_EC_ECNRA_FULL
PROV_MS_EXCHANGE PROV_SPYRUS_LYNKS
PROV_RSA_SCHANNEL
其中,PROV_RSA_FULL 标识,表示提供者同时支持数字签名(Digital signatures)和数据加密(Data encryption),为通用的一般的设置(其他的具体含义,可参看MSDN)。
DwFlags: 标志值。这个参数通常被设为零。 但是应用程序也可以设置至少一个下列标志: CRYPT_VERIFYCONTEXT,CRYPT_NEWKEYSET,CRYPT_MACHINE_KEYSET,CRYPT_DELETEKEYSET(其具体含义,可参看MSDN)。
返回值:如果函数调用成功,返回值是非零 (TRUE );反之,为0(FALSE)。
②调用CryptGenRandom()函数,同时将产生的随机数据填充到缓存区中。
BOOL WINAPI CryptGenRandom(
HCRYPTPROV hProv,
DWORD dwLen,
BYTE* pbBuffer
);
参数说明:
hProv :是一个由CSP(cryptographic service provider)句柄,它由CryptAcquireContext函数调用获得的。
dwLen :缓存区的大小。
pbBuffer :存放返回随机数据的缓存区。
返回值:
调用成功则返回 TRUE;反之为FALSE。
③使用完毕释放句柄和关键字容器:CryptReleaseContext()。
调用CryptReleaseContext将释放一个CSP 句柄;同时,每调用一次,引用计数(Reference count)将减1,当引用计数为零时,则CSP上下文(context)将被彻底释放,不再能被其他应用所使用。其定义如下:
BOOL WINAPI CryptReleaseContext(
HCRYPTPROV hProv,
DWORD dwFlags
);
参数说明:
hProv :欲释放的一个CSP 句柄
dwFlags :保留使用,一般设为0。
返回值:调用成功则返回非零(TRUE)。

这个程序在VC++6.0调试的时候,系统会提示:
error C2146: syntax error : missing ';' before identifier 'm_hProv';
error C2501: 'HCRYPTPROV' : missing storage-class or type specifiers;
error C2501: 'm_hProv' : missing storage-class or type specifiers
error C2065: 'm_hProv' : undeclared identifier
error C2065: 'CryptAcquireContext' : undeclared identifier
.……
我改了好久也没改好,到底该怎么修改呢?帮帮忙啊。。。
sico_ 2010-03-10
  • 打赏
  • 举报
回复
还要链接Coredll.lib
yuzl32 2010-03-10
  • 打赏
  • 举报
回复
代码呢? .

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧