1. CSP接口说明
1.1CSP连接函数
CSP连接函数包括以下函数:
CPAcquireContext | 获得CSP 的指定密钥容器的句柄 |
CPReleaseContext | 释放由CPAcquireContext得到的句柄 |
CPGetProvParam | 得到CSP 的属性 |
CPSetProvParam | 设置CSP 的属性 |
1.2密钥的产生和交换函数
密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。下面
就是主要的一些函数:
CPDeriveKey | 从一个密码中派生一个密钥 |
CPDestoryKey | 销毁密钥 |
CPDuplicateKey | 制作一个密钥和密钥状态的精确复制 |
CPExportKey | 把密钥做成BLOB输出 |
CPGenKey | 创建一个随机密钥 |
CPGenRandom | 产生一个随机数 |
CPGetKeyParam | 得到密钥的参数 |
CPGetUserKey | 得到一个密钥交换或签名密钥的句柄 |
CPImportKey | 把一个密钥BLOB 传送到CSP 中 |
CPSetKeyParam | 指定一个密钥的参数 |
1.3 数据加密/解密函数
这些函数支持数据的加密/解密操作。CPEncrypt 和CPDecrypt 要求在被调用前指定
一个密钥。这个密钥可以由CPGenKey、CPDeriveKey 或CPImportKey 产生。创建密
钥时要指定加密算法。CPSetKeyParam 函数可以指定额外的加密参数。
CPDecrypt | 使用指定加密密钥来解密一段密文 |
CPEncrypt | 使用指定加密密钥来加密一段明文 |
1.4哈希和数字签名函数
这些函数在完成计算哈希、创建和校验数字签名。
CPCreateHash | 创建一个空哈希对象 |
CPDestoryHash | 销毁一个哈希对象 |
CPDuplicateHash | 复制一个哈希对象 |
CPGetHashParam | 得到一个哈希对象参数 |
CPHashData | 对一块数据进行哈希,把它加到指定的哈希对象中 |
CPHashSessionKey | 对一个会话密钥进行哈希,把它加到指定的哈希对象中 |
CPSetHashParam | 设置一个哈希对象的参数 |
CPSignHash | 对一个哈希对象进行签名 |
CPVerifySignature | 校验一个数字签名 |
1.5函数详解
1.5.1CPAcquireContext
BOOL CPAcquireContext(
HCRYPTPROV *phProv, // out
CHAR *pszContainer, // in
DWORD dwFlags, // in
PVTableProvStruc pVTable // in
);
参数:
phProv
[out] CSP 句柄指针
pszContainer
[in] 密钥容器名称,指向密钥容器的字符串指针。如果dwFlags 为CRYPT_VERIFYCONTEXT,pszContainer 必须为NULL。
dwFlags
[in]标志。
CRYPT_VERIFYCONTEXT
此选项指出应用程序不需要使用公钥/私钥对,如程序只执行哈希和对称加密。
只有程序需要创建签名和解密消息时才需要访问私钥。
CRYPT_NEWKEYSET
使用指定的密钥容器名称创建一个新的密钥容器。如果pszContainer 为NULL,
密钥容器就使用却省的名称创建。
CRYPT_MACHINE_KEYSET
由此标志创建的密钥容器只能由创建者本人或有系统管理员身份的人使用。
CRYPT_DELETEKEYSET
删除由pszContainer 指定的密钥容器。如果pszContainer 为NULL,却省名称
的容器就会被删除。此容器里的所有密钥对也会被删除。
CRYPT_SLIENT
应用程序要求CSP 不显示任何用户界面。
说明:
这个函数是用来取得CSP 密钥容器句柄,以后的任何加密操作就是针对此句柄而言。由适当的dwFlags 标志,这个函数就可以创建和销毁密钥容器。
1.5.2CPReleaseContext
BOOL CPReleaseContext(
HCRYPTPROV hProv, // in
DWORD dwFlags // in
);
参数:
hProv
[in]由CPAcquireContext 获得的CSP 句柄。
dwFlags
[in]保留。必须为0。
说明:
此函数释放CSP 的句柄。
3CPGetProvParam
BOOL CPGetProvParam(
HCRYPTPROV hProv, // in
DWORD dwParam, // in
BYTE *pbData, // out
DWORD *pdwDataLen, // in, out
DWORD dwFlags // in
);
参数:
hProv
[in]CSP 句柄。
dwParam
[in]指定查询的参数。
PP_CONTAINER 指向密钥名称的字符串
PP_ENUMALGS 不断的读出CSP 支持的所有算法
PP_ENUMALGS_EX 比PP_ENUMALGS 获得更多的算法信息
PP_ENUMCONTAINERS 不断的读出CSP 支持的密钥容器PP_IMPTYPE 指出CSP 怎样实现的
PP_NAME 指向CSP 名称的字符串
PP_VERSION CSP 的版本号
PP_KEYSIZE_INC AT_SIGNATURE 的位数
PP_KEYX_KEYSIZE_INC AT_KEYEXCHANGE 的位数
PP_KEYSET_SEC_DESCR 密钥的安全描述符
PP_UNIQUE_CONTAINER 当前密钥容器的唯一名称
PP_PROVTYPE CSP 类型
PP_USE_HARDWARE_RNG 指出硬件是否支持随机数发生器
PP_KEYSPEC 返回CSP 密钥的信息
pbData
[out]指向接收数据的缓冲区指针。
pdwDataLen
[in/out]指出pbData 数据长度。
dwFlags
[in] 根据dwParam不同设定不同值。
说明:
此函数获得CSP 的各种参数。
1.5.4CPSetProvParam
BOOL CPSetProvParam(
HCRYPTPROV hProv, // in
DWORD dwParam, // in
BYTE *pbData, // in
DWORD dwFlags // in
);
参数:
hProv
[in]CSP 句柄。
dwParam
[in]指定查询的参数。
pbData
[out]指向接收数据的缓冲区指针。
dwFlags
[in] [in] 根据dwParam不同设定不同值。
说明:
此函数设置CSP 的各种参数。
1.5.5CPDeriveKey
BOOL CPDeriveKey(
HCRYPTPROV hProv, // in
ALG_ID Algid, // in
HCRYPTHASH hBaseData, // in
DWORD dwFlags, // in
HCRYPTKEY *phKey // out
);
hProv
[in]CSP 句柄
Algid
[in]要产生密钥的对称加密算法
hBaseData
[in]哈希对象的句柄
dwFlags
[in]指定密钥的类型
CRYPT_CREATE_SALT 典型地,由哈希值产生一个会话密钥,有一些需要补位。如果用此标志,密钥将会赋予一个盐值CRYPT_EXPORTABLE 如果置此标志,密钥就可以用CryptExportKey函数导出。
CRYPT_NO_SALT 如果置此标志,表示40 位的密钥不需要分配盐值。
CRYPT_UPDATE_KEY 有些CSP 从多个哈希值中派生会话密钥。如果这种情况,CryptDeriveKey 需要多次调用。
phKey
[in/out]密钥的句柄
说明:
此函数从一基本数据值中派生会话密钥。函数保证当CSP 和算法相同时,从相同基本数据值中产生的密钥是唯一的。
1.5.6CPDestoryKey
BOOL CPDestroyKey(
HCRYPTPROV hProv, // in
HCRYPTKEY hKey // in
);
参数:
hProv
[in]CSP 句柄
hKey
[in]需要销毁的密钥句柄
说明:
此函数释放密钥句柄。
1.5.7CPDuplicateKey
BOOL CPDuplicateKey(
HCRYPTPROV hUID, // in
HCRYPTKEY hKey, // in
DWORD *pdwReserved, // in
DWORD dwFlags, // in
HCRYPTKEY *phKey // out
);
参数:
hUID
[in]CSP 句柄
hKey
[in]源密钥句柄
pdwReserved
[in]保留,必须为NULL
dwFlags
[in] 保留,必须为0
phKey
[out]目标密钥句柄
说明:
目标密钥是源密钥的一个精确复制。
1.5.8CPExportKey
BOOL CPExportKey(
HCRYPTPROV hProv, // in
HCRYPTKEY hKey, // in
HCRYPTKEY hPubKey, // in
DWORD dwBlobType, // in
DWORD dwFlags, // in
BYTE *pbData, // out
DWORD *pdwDataLen // in, out
);
参数:
hUID
[in]CSP 句柄
hKey
[in]被导出的密钥
hPubKey
[in]用来加密的公钥句柄
dwBlobType
[in]导出KEY BLOB的类型
SIMPLEBLOB表示导出的是对称密钥,密钥用hPubKey指定的公钥加密
PUBLICKEYBLOB表示导出的是hKey指定的公钥,此时hPubKey应该为0
PRIVATEKEYBLOB表示导出的是hKey指定的密钥对,此时hPubKey应该为0
dwFlags
[in] 保留,必须为0
pbData
[in/out]导出KEY BLOB的地址
pdwDataLen
[in/out]指向DWORD 值的指针,此值指出导出KEY BLOB的长度。在调用此函数前,此值为pbData缓冲区长度,调用此函数后,此值为导出KEY BLOB的长度。
说明:
把密钥以KEY BLOB形式导出。
1.5.9CPGenKey
BOOL CPGenKey(
HCRYPTPROV hProv, // in
ALG_ID Algid, // in
DWORD dwFlags, // in
HCRYPTKEY *phKey // out
);
参数:
hProv
[in]CSP 句柄
Algid
[in]要产生密钥的算法,可以是对称密钥,也可以是非对称密钥对
dwFlags
[in]指定密钥的属性
CRYPT_CREATE_SALT 典型地,由哈希值产生一个会话密钥,有一些需要补位。如果用此标志,密钥将会赋予一个盐值CRYPT_EXPORTABLE 如果置此标志,密钥就可以用CryptExportKey函数导出。
CRYPT_NO_SALT 如果置此标志,表示40 位的密钥不需要分配盐值。
phKey
[in]产生的密钥句柄
说明:
根据算法和属性产生密钥。
1.5.10CPGenRandom
BOOL CPGenRandom(
HCRYPTPROV hProv, // in
DWORD dwLen, // in
BYTE *pbBuffer // in, out
);
参数:
hProv
[in]CSP 句柄
dwLen
[in]需要产生的随机数长度
pbBuffer
[in]随机数的缓冲区
说明:
根据指定长度产生随机数
1.5.11CPGetKeyParam
BOOL CPGetKeyParam(
HCRYPTPROV hProv, // in
HCRYPTKEY hKey, // in
DWORD dwParam, // in
BYTE *pbData, // out
DWORD *pdwDataLen, // in, out
DWORD dwFlags // in
);
hProv
[in]CSP 句柄。
hKey
[in]密钥句柄。
dwParam
[in]指定查询的参数。
KP_ALGID 表示返回密钥的算法标识
KP_BLOCKLEN表示返回密钥的算法数据块长度
KP_KEYLEN表示返回密钥的长度
KP_SALT 表示返回密钥的盐值
KP_PERMISSIONS 表示返回密钥的访问权限
KP_IV表示返回算法的初始向量
KP_PADDING 表示返回算法的填充方式
KP_MODE 表示返回算法的加密模式
KP_MODE_BITS表示返回算法的加密模式的反馈位数
KP_EFFECTIVE_KEYLEN 表示返回密钥的有效长度
pbData
[out]指向接收数据的缓冲区指针。
pdwDataLen
[in/out]指出pbData 数据长度。
dwFlags
[in] 根据dwParam不同设定不同值。
说明:
此函数获得密钥的各种参数。
1.5.12CPGetUserKey
BOOL CPGetUserKey(
HCRYPTPROV hProv, // in
DWORD dwKeySpec, // in
HCRYPTKEY *phUserKey // out
);
hProv
[in]CSP 句柄
dwKeySpec
[in]密钥对属性
phUserKey
[out]密钥的句柄
说明:
此函数根据得到dwKeySpec获得密钥对句柄。
1.5.13CPImportKey
BOOL CPImportKey(
HCRYPTPROV hProv, // in
CONST BYTE *pbData, // in
DWORD dwDataLen, // in
HCRYPTKEY hPubKey, // in
DWORD dwFlags, // in
HCRYPTKEY *phKey // out
);
参数:
hProv
[in]CSP 句柄
pbData
[in]导出KEY BLOB的地址
dwDataLen
[in]导入KEY BLOB的长度。。
hPubKey
[in]用来加密的公钥句柄
dwFlags
[in] 保留,必须为0
phKey
[out]导入的密钥句柄
说明:
把KEY BLOB导入CSP中。
1.5.14CPSetKeyParam
BOOL CPSetKeyParam(
HCRYPTPROV hProv, // in
HCRYPTKEY hKey, // in
DWORD dwParam, // in
BYTE *pbData, // in
DWORD dwFlags // in
);
参数:
hProv
[in]CSP 句柄。
hKey
[in]密钥句柄。
dwParam
[in]指定查询的参数。
KP_SALT 表示返回密钥的盐值
KP_PERMISSIONS 表示返回密钥的访问权限
KP_IV表示返回算法的初始向量
KP_PADDING 表示返回算法的填充方式
KP_MODE 表示返回算法的加密模式
KP_MODE_BITS表示返回算法的加密模式的反馈位数
KP_EFFECTIVE_KEYLEN 表示返回密钥的有效长度
pbData
[in]指向接收数据的缓冲区指针。
dwFlags
[in] 根据dwParam不同设定不同值。
说明:
此函数设置密钥的各种参数。
1.5.15CPDecrypt
BOOL CPDecrypt(
HCRYPTPROV hProv, // in
HCRYPTKEY hKey, // in
HCRYPTHASH hHash, // in
BOOL Final, // in
DWORD dwFlags, // in
BYTE *pbData, // in, out
DWORD *pdwDataLen // in, out
);
参数:
hProv
[in]CSP 句柄
hKey
[in]解密密钥的句柄
hHash
[in]哈希对象的句柄。如果需要解密数据并且同时作哈希,hHash 传递此参数。
Final
[in]指出是否是最后一次解密操作。
dwFlags
[in]保留
pbData
[in/out]需要解密数据的地址
pdwDataLen
[in/out]指向DWORD 值的指针,此值指出解密数据的长度。在调用此函数前,此值为需要解密数据的长度,调用此函数后,此值为已经解密的数据长度。此函数对由CryptEncrypt 加密过的数据进行解密。
1.5.16CPEncrypt
BOOL CPEncrypt(
HCRYPTPROV hProv, // in
HCRYPTKEY hKey, // in
HCRYPTHASH hHash, // in
BOOL Final, // in
DWORD dwFlags, // in
BYTE *pbData, // in, out
DWORD *pdwDataLen, // in, out
DWORD dwBufLen // in
);
参数:
hProv
[in]CSP 句柄
hKey
[in]加密密钥的句柄
hHash
[in]哈希对象的句柄。如果需要加密数据并且同时作哈希,hHash 传递此参数。
Final
[in]指出是否是最后一次加密操作。
dwFlags
[in]保留
pbData
[in/out]需要加密数据的地址
pdwDataLen
[in/out]指向DWORD 值的指针,此值指出加密数据的长度。在调用此函数前,此值为需要加密数据的长度,调用此函数后,此值为已经加密的数据长度。
1.5.17CPCreateHash
BOOL CPCreateHash(
HCRYPTPROV hProv, // in
ALG_ID Algid, // in
HCRYPTKEY hKey, // in
DWORD dwFlags, // in
HCRYPTHASH *phHash // out
);
参数:
hProv
[in]CSP 句柄
Algid
[in]要产生密钥的算法,可以是对称密钥,也可以是非对称密钥对
hKey
[in]密钥句柄
dwFlags
[in]保留,设为0。
phHash
[in]产生的哈希句柄
说明:
根据算法创建哈希句柄。
1.5.18CPDestoryHash
BOOL CPDestroyHash(
HCRYPTPROV hProv, // in
HCRYPTHASH hHash // in
);
参数:
hProv
[in]CSP 句柄
hHash
[in]哈希句柄
说明:
销毁哈希句柄。
1.5.19CPDuplicateHash
BOOL CPDuplicateHash(
HCRYPTPROV hUID, // in
HCRYPTHASH hHash, // in
DWORD *pdwReserved, // in
DWORD dwFlags, // in
HCRYPTHASH *phHash // out
);
参数:
hUID
[in]CSP 句柄
hHash
[in]源哈希句柄
pdwReserved
[in]保留,必须为NULL
dwFlags
[in] 保留,必须为0
phHash
[out]目标哈希句柄
说明:
目标哈希是源哈希的一个精确复制。
1.5.20CPGetHashParam
BOOL CPGetHashParam(
HCRYPTPROV hProv, // in
HCRYPTHASH hHash, // in
DWORD dwParam, // in
BYTE *pbData, // out
DWORD *pdwDataLen, // in, out
DWORD dwFlags // in
);
参数:
hProv
[in]CSP 句柄。
hHash
[in]哈希句柄。
dwParam
[in]指定查询的参数。
HP_ALGID 表示返回哈希算法标识
HP_HASHSIZE表示返回哈希值长度
HP_HASHVALUE表示返回哈希值
pbData
[out]指向接收数据的缓冲区指针。
pdwDataLen
[in/out]指出pbData 数据长度。
dwFlags
[in]没有定义,设为0。
说明:
此函数获得哈希句柄的各种参数。
1.5.21CPHashData
BOOL CPHashData(
HCRYPTPROV hProv, // in
HCRYPTHASH hHash, // in
CONST BYTE *pbData, // in
DWORD dwDataLen, // in
DWORD dwFlags // in
);
参数:
hProv
[in]CSP 句柄。
hHash
[in]哈希句柄。
pbData
[in]指向填充数据的缓冲区指针。
dwDataLen
[in]填充数据长度。
dwFlags
[in]特殊定义。
说明:
此函数往哈希句柄填充数据。
1.5.22CPHashSessionKey
BOOL CPHashSessionKey(
HCRYPTPROV hProv, // in
HCRYPTHASH hHash, // in
HCRYPTKEY hKey, // in
DWORD dwFlags // in
);
参数:
hProv
[in]CSP 句柄。
hHash
[in]哈希句柄。
hKey
[in]填充到哈希对象中的密钥句柄。
dwFlags
[in]特殊定义。
CRYPT_LITTLE_ENDIAN表示密钥值的填充顺序。
说明:
此函数往哈希句柄填充数据。
1.5.23CPSetHashParam
BOOL CPSetHashParam(
HCRYPTPROV hProv, // in
HCRYPTHASH hHash, // in
DWORD dwParam, // in
BYTE *pbData, // in
DWORD dwFlags // in
);
参数:
hProv
[in]CSP 句柄。
hHash
[in]哈希句柄。
dwParam
[in]指定设置的参数。
HP_HASHVALUE表示返回哈希值
pbData
[in]指向接收数据的缓冲区指针。
dwFlags
[in]没有定义,设为0。
说明:
此函数设置哈希句柄的各种参数。
1.5.24CPSignHash
BOOL CPSignHash(
HCRYPTPROV hProv, // in
HCRYPTHASH hHash, // in
DWORD dwKeySpec, // in
LPCWSTR sDescription, // in
DWORD dwFlags, // in
BYTE *pbSignature, // out
DWORD *pdwSigLen // in, out
);
参数:
hProv
[in]CSP 句柄。
hHash
[in]哈希句柄。
dwKeySpec
[in]指定密钥对属性。
sDescription
[in]哈希对象描述。
dwFlags
[in]特殊定义。
pbSignature
[out]指向签名结果的缓冲区指针。
pdwSigLen
[out]指向DWORD 值的指针,此值指出签名结果的长度。
说明:
此函数用指定私钥对哈希值进行数字签名。
1.5.25CPVerifySignature
BOOL CPVerifySignature(
HCRYPTPROV hProv, // in
HCRYPTHASH hHash, // in
CONST BYTE *pbSignature, // in
DWORD dwSigLen, // in
HCRYPTKEY hPubKey, // in
LPCWSTR sDescription, // in
DWORD dwFlags // in
);
参数:
hProv
[in]CSP 句柄。
hHash
[in]哈希句柄。
pbSignature
[in]指向签名结果的缓冲区指针。
dwSigLen
[in]指向DWORD 值的指针,此值指出签名结果的长度。
hPubKey
[in] 用于签名验证的公钥句柄。
sDescription
[in]哈希对象描述。
dwFlags
[in]特殊定义。
说明:
此函数用指定私钥对签名值进行签名验证。
2.CSP支持的算法
1. RSA加密(1024位)
2. RSA签名(1024位)
3. DES
4. 3DES(192位)
5. RC4(40位――128位)
6. SHA1
7. MD5