CSP是Cryptographic Service Provider的简写,是微软专为
Windows系列操作系统制定的底层加密接口,用于管理硬件或软件形式的加密设备,实现数据加密、解密,数字签名、验证和数据摘要
(即
HASH)等。
本例实现了几方面的操作
1.对容器的操作
包括创建,打开,关闭,销毁容器.
Provider可以对应于一个硬件UKey或者软件虚拟容器,微软提供了几个缺省的Provider,每个Provider里面都可以包含若干容器(Container).
微软提供的Provider:
- PROV_RSA_FULL
- PROV_RSA_SIG
- PROV_DSS
- PROV_DSS_DH
- PROV_FORTEZZA
- PROV_MS_EXCHANGE
- PROV_RSA_SCHANNEL
- PROV_SSL
- PROV_EC_ECDSA_SIG
- PROV_EC_ECNRA_SIG
- PROV_EC_ECDSA_FULL
- PROV_EC_ECNRA_FULL
- PROV_SPYRUS_LYNKS
- PROV_RNG
- PROV_INTEL_SEC
2.生成随机数
3.在容器中生成密钥,包括RSA加密密钥对,RSA签名密钥对.
4.RSA加密非对称加密用于加密少量,对安全性要求比较高的数据.
5.签名,验签,RSA公钥的导出(可以用于验证签名).用于验证身份.
6.HASH,HMAC.用于验证数据完整性
7.对称加解密.加密数据,速度快.
8.保护本机数据:不需要CSP句柄,和容器无关,生成只能在本机才能解密的数据.可以防止本机数据被Copy.
9
这里有一种方法比较有意思
有一个这样的需求,我会调用一些函数,然后希望每次调用后弹出弹出信息告诉我此次调用的函数名字,调用结果
a)定义一个函数,负责弹出信息,它输入参数为函数名字和函数的返回结果
VOID CCSPDlg::PopupMessage(LPCTSTR lpFunction, BOOL bResult, BOOL bAddLastErrorMsg/*= TRUE*/)
{
CString strInfo;
TCHAR szErrMsg[MAX_PATH] = {0};
if(bAddLastErrorMsg)
SSOSGetCodeDesc(::GetLastError(), szErrMsg, SS_DIMOF(szErrMsg), NULL);
if(bResult)
{
strInfo.Format(_T("Execute %s Success.\r\n %s"),lpFunction, szErrMsg);
}else
{
strInfo.Format(_T("Execute %s Failed.\r\n %s"),lpFunction, szErrMsg);
}
AfxMessageBox(strInfo);
}
b)定义一个宏
#define CALL_FUNC_OF_RLT_BY_BOOL(F) PopupMessage(TEXT(#F), F)
c)应用场景
CALL_FUNC_OF_RLT_BY_BOOL( (m_hCryptProv = SSCSPCreateContainer(NULL, NULL)) != NULL);
CALL_FUNC_OF_RLT_BY_BOOL(SSCSPCloseContainer(m_hCryptProv));
SOURCE CODE : http://download.csdn.net/detail/patdz/4280531