WindowsAPI编程核心技术-加密技术
WindowsAPI编程核心技术-加密技术
CryptoAPI
入门
CryptAcquireContext
获取特定CSP内特定密钥容器句柄。
1 | BOOL WINAPI CryptAcquireContext( |
dwProvType可以是:
CSP类型 | 密钥交换算法 | 签名算法 | 对称加密算法 | Hash算法 |
---|---|---|---|---|
PROV_RSA_FULL | RSA | RSA | RC2、RC4 | MD5、SHA |
PROV_RSA_SIG | RSA | MD5、SHA | ||
PROV_RSA_SCHANNEL | RSA | RSA | RC4、DES、3DES | MD5、SHA |
PROV_DSS | DSS | DSS | MD5、SHA | |
PROV_DSS_DH | DH | DSS | CYLINK_MEK | MD5、SHA |
PROV_DH_SCHANNEL | DH | DSS | DES、3DES | MD5、SHA |
PROV_FORTEZZA | KEA | DSS | Skipjack | SHA |
PROV_MS_EXCAHNGE | RSA | RSA | CAST | MD5 |
PROV_SSL | RSA | RSA | Varies | Varies |
dwFlags参数可以是:
值 | 含义 |
---|---|
CRYPT_VERIFYCONTEXT | 不需要公私钥对,只哈希和对称加密 |
CRYPT_NEWKEYSET | 创建新密钥容器,pszContainer位NULL则默认名称 |
CRYPT_MACHINE_KEYSET | 创建的密钥容器只能由创建者本人或系统管理员使用 |
CRYPT_DELETEKEYSET | 删除pszContainer容器,容器中密钥对也被删除 |
CRYPT_SILENT | CSP不显示用户界面 |
CryptEnumProviders
枚举所有CSP,需循环调用。
1 | BOOL WINAPI CryptEnumProviders( |
例如:
1 |
|
CryptGetDefaultProvider
获取系统默认CSP:
1 | BOOL CryptGetDefaultProvider( |
CryptSetProvider
指定当前用户默认加密服务提供程序:
1 | BOOL CryptSetProvider( |
CryptGetProvParam
获取CSP各种参数属性:
1 | BOOL CryptGetProvParam( |
dwParam可以是:
参数 | 作用 |
---|---|
PP_CONTAINER | 密钥名称 |
PP_ENUMALGS | CSP支持的算法 |
PP_ENUMALGS_EX | 同上,获得更多信息 |
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类型 |
CryptSetProvParam
设置CSP各种参数:
1 | BOOL CryptSetProvParam( |
dwParam可选值为:
值 | 含义 |
---|---|
PP_CLIENT_HWND | 设置Windows句柄 |
PP_KEYSET_SEC_DESCR | 密钥安全描述 |
PP_USE_HARDWARE_RNG | 硬件是否支持随机数发生器 |
CryptReleaseContext
断开CSP并释放CSP句柄:
1 | BOOL CryptReleaseContext( |
HASH
CryptCreateHash
创建空HASH对象。
1 | BOOL WINAPI CryptCreateHash( |
CryptHashData
数据添加到HASH对象并计算。
1 | BOOL WINAPI CryptHashData( |
CryptGetHashParam
从HASH对象中获取指定参数值。
1 | BOOL WINAPI CryptGetHashParam( |
例子
1 |
|
AES
CryptDeriveKey
从基础数据值派生出加密会话密钥。
1 | BOOL WINAPI CryptDeriveKey( |
CryptEntrypt
加密数据。
1 | BOOL WINAPI CryptEncrypt( |
CryptDecrypt
解密数据。
1 | BOOL WINAPI CryptDecrypt( //都同上 懒得写了 |
例子
不直接拿明文密钥加密,先把密钥进行MD5。AES一个组只能$128$位,密钥长度可以为$128$位、$192$位或$256$位。
1 |
|
RSA
CryptGenKey
随机生成加密会话密钥或公钥/私钥对,返回句柄。
1 | BOOL WINAPI CryptGenKey( |
CryptExportKey
从CSP导出加密密钥或密钥对。
1 | BOOL WINAPI CryptExportKey( |
CryptImportKey
将密钥从密钥BLOB导入CSP中。
1 | BOOL WINAPI CryptImportKey( |
例子
导出公钥/私钥都要重复导两次,第一次只导出大小,动态申请足够内存后再导出密钥。
1 | BOOL GenerateKey(PBYTE* ppPublicKey, PDWORD pdwPublicKeyLength, PBYTE* ppPrivateKey, PDWORD pdwPrivateKeyLength) { |
CSP综合
例如加解密一个文件:
1 |
|
Crypto++
安装
Github下载源码,打开“cryptest.sln”解决方案,编译“cryptlib”项目工程,找到“cryptopp890\x64\Output\Debug\cryptlib.lib”。
把cryptlib.lib和按照需要选择性地拷贝.h文件到当前工程下。
编译时需要检查编译cryptlib.lib和当前工程的“C\C++”->“代码生成”->“运行库”的选项是否一致,同时注意x86和x64一致。
HASH
1 |
|
AES
1 |
|
RSA
用随机数生成公私钥对并保存到文件中,公钥加密时用公钥文件加密文件或数据,解密同理。代码自己去找,这里不写了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 The Blog of Monoceros406!