API函数:加密与解密(第29课)

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。

头像
  • ¥ 298.0元
  • 市场价:498.0元
  • ¥ 69.0元
  • 市场价:99.0元
  • ¥ 398.0元
  • 市场价:498.0元
  • ¥ 1999.0元
  • 市场价:2999.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: