Advapi32!CryptAcquireContext
功能:获取有某个容器的CSP模块的指针
函数原型:
BOOL WINAPI CryptAcquireContext(
_Out_ HCRYPTPROV *phProv,
_In_ LPCTSTR pszContainer,
_In_ LPCTSTR pszProvider,
_In_ DWORD dwProvType,
_In_ DWORD dwFlags
);
参数说明:
phProv:向一个CSP模块句柄指针,里面用指定的容器
pszContainer:密钥容器名称, 指向密钥容器的字符串指针。如果dwFlags为CRYPT_VERIFYCONTEXT,pszContainer必须为NULL。
pszProvider:密钥容器名称, 指向密钥容器的字符串指针。如果dwFlags为CRYPT_VERIFYCONTEXT,pszContainer必须为NULL。
dwProvType:CSP类型,下表为常见的CSP类型
CSP类型 | 交换算法 | 签名算法 | 对称加密算法 | Hash算法 |
PROV_RSA_FULL | RSA | RSA | RC2
RC4 |
MD5
SHA |
PROV_RSA_SIG | NONE | RSA | NONE | MD5
SHA |
PROV_RSA_SCHANNEL | RSA | RSA | RC4
DES Triple DES |
MD5
SHA |
PROV_DSS | DSS | NONE | DSS | MD5
SHA |
PROV_DSS_DH | DH | DSS | CYLINK_MEK | MD5
SHA |
PROV_DH_SCHANNEL | DH | DSS | DES
Triple DES |
MD5
SHA |
PROV_DH_SCHANNEL | KEA | DSS | Skipjack | SHA |
PROV_DH_SCHANNEL | RSA | RSA | CAST | MD5 |
PROV_DH_SCHANNEL | RSA | RSA | Varies | Varies |
dwFlags:常被设置为0,也可以使用如下几个标志:
CRYPT_VERIFYCONTEXT | 指出应用程序不需要使用公钥/私钥对,如程序只执行哈希和对称加密。只有程序需要创建签名和解密消息时才需要访问私钥。 |
CRYPT_NEWKEYSET | 使用指定的密钥容器名称创建一个新的密钥容器。如果pszContainer为NULL,密钥容器就使用却省的名称创建。 |
CRYPT_MACHINE_KEYSET | 由此标志创建的密钥容器只能由创建者本人或有系统管理员身份的人使用。 |
CRYPT_DELETEKEYSET | 删除由pszContainer指定的密钥容器。如果pszContainer 为NULL,缺省名称的容器就会被删除。此容器里的所有密钥对也会被删除。 |
CRYPT_SILENT | 应用程序要求CSP不显示任何用户界面。 |
返回值:
成功返回true,失败返回false
备注:
这个函数是用来取得指定CSP密钥容器句柄,以后的任何加密操作就是针对此CSP 句柄而言。函数首先查找由dwProvType和pszProvider 指定的CSP,如果找到了CSP,函数就查找由此CSP指定的密钥容器。由适当的dwFlags 标志,这个函数就可以创建和销毁密钥容器,如果不要求访问私钥的话,也可以提供对CSP临时密钥容器的访问。
Advapi32!CryptReleaseContext
功能:释放CSP句柄
函数原型:
BOOL WINAPI CryptReleaseContext(
HCRYPTPROV hProv,
DWORD dwFlags
);
参数说明:
hProv[in]由CryptAcquireContext获得的CSP 句柄。
dwFlags[in]保留。必须为0
返回值:
成功返回true,失败返回false
备注:
此函数释放CSP的句柄。对于每一次调用,CSP 的引用计数都减1。当引用计数为0时,CSP上下文就会被系统释放变成无效句柄,以后针对此CSP 句柄的函数不再可用。
此函数并不销毁密钥容器或密钥对。
Advapi32!CryptEnumProviders
功能:此函数得到第一个或下一个可用的CSP。如果使用循环,就可以得到计算机上所有可用的CSP。
函数原型:
BOOL WINAPI CryptEnumProviders(
DWORD dwIndex,
DWORD *pdwReserved,
DWORD dwFlags,
DWORD *pdwProvType,
LPTSTR pszProvName,
DWORD *pcbProvName
);
参数说明:
dwIndex[in]枚举下一个CSP的索引。
pdwReserved[in]保留。必须为NULL。
dwFlags[in]保留。必须为NULL。
pdwProvType[out]CSP的类型。
pszProvName[out]指向接收CSP名称的缓冲区字符串指针。此指针可为NULL,用来得到字符串的大小。
pcbProvName[in/out]指出pszProvName字符串的大小。
返回值:
成功返回true,失败返回false
Advapi32!CryptCreateHash
功能:此函数初始化哈希数据流。它创建并返回了一个CSP哈希对象的句柄。此句柄由CryptHashData和CryptHashSessionKey来调用。
函数原型:
BOOL WINAPI CryptCreateHash(
HCRYPTPROV hProv,
ALG_ID Algid,
HCRYPTKEY hKey,
DWORD dwFlags,
HCRYPTHASH *phHash
);
参数说明:
hProv[in]CSP句柄
Algid[in]哈希算法的标示符。
hKey[in]如果哈希算法是密钥哈希,如HMAC或MAC 算法,就用此密钥句柄传递密钥。对于非密钥算法,此参数为NULL。
dwFlags[in]保留。必须为0。
phHash[out]哈希对象的句柄。
返回值:
成功返回true,失败返回false
Advapi32! CryptGetHashParam
功能:得到指定哈希对象的数据。
函数原型:
BOOL WINAPI CryptGetHashParam(
HCRYPTHASH hHash,
DWORD dwParam,
BYTE *pbData,
DWORD *pdwDataLen,
DWORD dwFlags
);
参数说明:
hHash[in]哈希对象的句柄
dwParam[in]查询类型。可以是下列:
参数名称 | 作用 |
HP_ALGID | 哈希算法 |
HP_HASHSIZE | 哈希值长度 |
HP_HASHVAL | 哈希值,由hHash指定的哈希值或者消息哈希 |
返回值:
成功返回true,失败返回false
Advapi32!CryptDestroyHash
功能:此函数销毁由hHash指定的哈希对象。当一个哈希对象被销毁后,它对程序来说不可用。
函数原型:
BOOL WINAPI CryptDestroyHash(
HCRYPTHASH hHash
);
参数说明:
hHash[in]要销毁的哈希对象句柄
返回值:
成功返回true,失败返回false
Advapi32!CryptHashData
功能:添加数据到hash对象
函数原型:
BOOL WINAPI CryptHashData(
_In_ HCRYPTHASH hHash,
_In_ BYTE *pbData,
_In_ DWORD dwDataLen,
_In_ DWORD dwFlags
);
参数说明:
hHash:Hash对象的句柄
pdData:指向一块内存,包含要添加到hash对象的数据
dwDataLen:数据的长度,如果dwFlags设置为CRYPT_USERDATA,这个值必须为0.
dwFlags:取值如下:
value | meaning |
CRYPT_OWF_REPL_LM_HASH
0x00000001 |
已经不再使用这个值 |
CRYPT_USERDATA
1 (0x1) |
如果设置此标志,则CSP将提示用户直接输入数据。 该数据被添加到hash。 该应用程序不允许访问此数据。 该标志可用于允许用户在系统中输入PIN码。 |
返回值:
成功返回true,失败返回false
Advapi32!CryptDeriveKey
功能:此函数从一基本数据值中派生会话密钥。函数保证当CSP和算法相同时,从相同基本数据值中产生的密钥是唯一的。
函数原型:
BOOL WINAPI CryptDeriveKey(
HCRYPTPROV hProv,
ALG_ID Algid,
HCRYPTHASH hBaseData,
DWORD dwFlags,
HCRYPTKEY *phKey
);
参数说明:
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]密钥的句柄
返回值:
成功返回true,失败返回false
Advapi32!CryptGetProvParam
功能:此函数获得CSP的各种参数。
函数原型:
BOOL WINAPI CryptGetProvParam(
HCRYPTPROV hProv,
DWORD dwParam,
BYTE *pbData,
DWORD *pdwDataLen,
DWORD dwFlags
);
参数说明:
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]如果指定PP_ENUMCONTAINERS,就指定CRYPT_MACHINE_KEYSET。
返回值:
成功返回true,失败返回false
Advapi32!CryptSetKeyParam
功能:自定义会话密钥各方面的操作。此函数设置的值不会保留到内存中,只能在单个会话中使用。
函数原型:
BOOL WINAPI CryptSetKeyParam(
_In_ HCRYPTKEY hKey,
_In_ DWORD dwParam,
_In_ const BYTE *pbData,
_In_ DWORD dwFlags
);
参数说明:
hKey: 要设置值的键的句柄。
dwParam:可取值过多,详情请参考msdn
pdData:在调用CryptSetKeyParam之前,使用要设置的值初始化缓冲区的指针。 此数据的形式取决于dwParam的值。
dwFlags: dwFlags参数用于传递启用密钥的标志值。
返回值:
成功返回true,失败返回false
Advapi32!CryptEncrypt
功能:此函数用于加密数据。加密数据所需要的算法由hKey的密钥指定
函数原型:
BOOL WINAPI CryptEncrypt(
HCRYPTKEY hKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE *pbData,
DWORD *pdwDataLen,
DWORD dwBufLen
);
参数说明:
hKey[in]加密密钥的句柄
hHash[in]哈希对象的句柄。如果数据需要同时被哈希并且加密,hHash就指出了哈希对象。
Final[in]指出是否是最后一次加密操作。如果Final为TRUE,就为最后一次,否则为FALSE。
dwFlags[in]保留
pbData[in/out]指向被加密的数据地址。
pdwDataLen[in/out]指向一个DWORD值的地址。在调用此函数前,这个值就是需要加密的数据长度。在调用此函数后,这个值就是已经加密的数据长度。如果此值为NULL,函数就返回需要数据的长度。
dwBufferLen[in]指出pbData的数据长度。
返回值:
成功返回true,失败返回false
Advapi32!CryptDecrypt
功能:此函数对由CryptEncrypt加密过的数据进行解密。
函数原型:
BOOL WINAPI CryptDecrypt(
HCRYPTKEY hKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE *pbData,
DWORD *pdwDataLen
);
参数说明:
hKey[in]解密密钥的句柄
hHash[in]哈希对象的句柄。如果需要解密数据并且同时作哈希,hHash传递此参数。
Final[in]指出是否是最后一次解密操作。
dwFlags[in]保留
pbData[in/out]需要解密数据的地址
pdwDataLen[in/out]指向DWORD值的指针,此值指出解密数据的长度。在调用此函数前,此值为需要解密数据的长度,调用此函数后,此值为已经解密的数据长度。
返回值:
成功返回true,失败返回false
Advapi32!CryptDestroyKey
功能:此函数释放密钥句柄。
函数原型:
BOOL WINAPI CryptDestroyKey(
HCRYPTKEY hKey
);
参数说明:
hKey[in]需要销毁的密钥句柄
返回值:
成功返回true,失败返回false
Advapi32!CryptGenKey
功能:生成一个密钥
函数原型:
BOOL WINAPI CryptGenKey(
_In_ HCRYPTPROV hProv,
_In_ ALG_ID Algid,
_In_ DWORD dwFlags,
_Out_ HCRYPTKEY *phKey
);
参数说明:
hProv:指定CSP模块的句柄
Algid: 标识要生成密钥的算法的ALG_ID值。 该参数的值取决于所使用的CSP。
dwFlags: 指定了生成密钥的类型
phKey:接收生成的Key
返回值:
成功返回true,失败返回false
Advapi32!CryptGetUserKey
功能:获取用户的公钥/私钥对其中一个的句柄,该功能仅由公钥/私钥对的所有者使用,并且仅当CSP及其相关联的密钥容器的句柄可用时
函数原型:
BOOL WINAPI CryptGetUserKey(
_In_ HCRYPTPROV hProv,
_In_ DWORD dwKeySpec,
_Out_ HCRYPTKEY *phUserKey
);
参数说明:
hProv:指向CryptAcquireContext产生的CSP
dwKeySpec: 标识从密钥容器使用的私钥。
phUserKey:接收key
返回值:
成功返回true,失败返回false
Advapi32!CryptContextAddRef
功能:增加CSP的引用计数器的数值
函数原型:
BOOL WINAPI CryptContextAddRef(
_In_ HCRYPTPROV hProv,
_In_ DWORD *pdwReserved,
_In_ DWORD dwFlags
);
参数说明:
hProv:指定要增加计数的CSP
pdwReserved:必须为NULL。
dwFlags:必须事0
返回值:
成功返回true,失败返回false;
Advapi32!CryptReleaseContext
功能:释放CSP句柄的,当这个函数调用一次的时候,CSP里面的引用计数就减少一,当引用计数减少的0的时候。CSP将不能再被这个程序中的任何函数调用了
函数原型:
BOOL WINAPI CryptReleaseContext(
_In_ HCRYPTPROV hProv,
_In_ DWORD dwFlags
);
参数说明:
hProv:指向CSP的句柄
dwFlags:必须是0
返回值:
成功返回true,失败返回false
Advapi32!CryptExportKey
功能:
函数原型:
BOOL WINAPI CryptExportKey(
_In_ HCRYPTKEY hKey,
_In_ HCRYPTKEY hExpKey,
_In_ DWORD dwBlobType,
_In_ DWORD dwFlags,
_Out_ BYTE *pbData,
_Inout_ DWORD *pdwDataLen
);
参数说明:
hKey:指向要导出的key
kExpKey: 用户最终使用到的密钥的句柄
dwBlobType: 指定要在pbData中导出的键BLOB的类型
dwFlags: 指定函数的其他选项
pbData:指向一块内存,用来接收key Blob
pdwDataLen:函数返回时,指明pbData的长度。
返回值:
成功返回true,失败返回false。