Windows 提供了Crypto API, 使用这些API, 我们可以比较轻松的实现Hash,签名等工作。MSDN上有很多信息,
http://technet.microsoft.com/zh-cn/library/aa382371
下面的例子是对一个给定的字符串进行hash计算,并且把hash值签名。给定的字符串如下:
BYTE *pbBuffer = (BYTE *)"The data that is to be hashed and signed.";
CryptAcquireContext
第一个需要使用的API 是CryptAcquireContext。
原型如下:
BOOL WINAPI CryptAcquireContext(
_Out_ HCRYPTPROV *phProv,
_In_ LPCTSTR pszContainer,
_In_ LPCTSTR pszProvider,
_In_ DWORD dwProvType,
_In_ DWORD dwFlags
);
pszContainter是一个字符串,可以指定key container的名字。
pszProvider指定CSP,如果传NULL的话,那就是default CSP.
dwProvType指定类型
更多信息查看MSDN。
CryptAcquireContext会首先查找指定的CSP,然后再查找指定的key container。如果成功的话,就返回一个CSP的handle(第一个参数)。
下面代码是一个简单的例子。当程序第一次执行的时候,第一个CryptAcquireContext会失败,因为"MyContainer" 密钥容器根本不存在,这样我们就可以创建一个。一旦创建好了,以后就可以直接获取了。
//-------------------------------------------------------------------
// Acquire a cryptographic provider context handle.
if (CryptAcquireContext(
&hProv,
L"MyContainer",
NULL,
PROV_RSA_FULL,
0))
{
printf("CSP context acquired.\n");
}
else
{
if (GetLastError() == NTE_BA