对称加密算法,顾名思义就是加密与解密使用相同的密钥
CNG支持的对称加密算法有_3DES, _3DES_112, AES, AES_CMAC, AES_GMAC, DES, DESX, RC2, RC4, XTS_AES
以AES为例,简单叙述一下,它的基本使用过程,设置操作模式,加密填充方式,密钥导入导出,及添加身份验证
一、一般流程:
1、获取算法提供者句柄
2、设置操作模式(全局)
3、获取密钥对象大小
4、为密钥对象分配空间
5、获取加密块大小
6、创建对称加密密钥
7、获取加密后内容大小
8、为加密后内容分配空间
9、加密内容(设置填充方式)
10、导出密钥
11、销毁原密钥
12、导入密钥
13、获取解密后内容大小
14、为解密内容分配空间
15、解密内容(设置和加密时一样的填充方式)
其中和Hash一样,在Win 7以后3、4步骤可以不用操作,CNG内部会自行管理密钥对象
所需要函数
//打开支持所需算法的算法提供者句柄
NTSTATUS BCryptOpenAlgorithmProvider(
[out] BCRYPT_ALG_HANDLE *phAlgorithm,
[in] LPCWSTR pszAlgId,
[in] LPCWSTR pszImplementation,
[in] ULONG dwFlags
);
//获取密钥对象的大小
NTSTATUS BCryptGetProperty(
[in] BCRYPT_HANDLE hObject,
[in] LPCWSTR pszProperty,
[out] PUCHAR pbOutput,
[in] ULONG cbOutput,
[out] ULONG *pcbResult,
[in] ULONG dwFlags
);
//设置操作模式,可以用于算法提供者句柄,也可以在调用BCryptGenerateSymmetricKey后作用于密钥
NTSTATUS BCryptSetProperty(
[in, out] BCRYPT_HANDLE hObject,
[in] LPCWSTR pszProperty,
[in] PUCHAR pbInput,
[in] ULONG cbInput,
[in] ULONG dwFlags
);
//创建对称密钥
NTSTATUS BCryptGenerateSymmetricKey(
[in, out] BCRYPT_ALG_HANDLE hAlgorithm,
[out] BCRYPT_KEY_HANDLE *phKey,
[out, optional] PUCHAR pbKeyObject,
[in] ULONG cbKeyObject,
[in] PUCHAR pbSecret,
[in] ULONG cbSecret,
[in] ULONG dwFlags
);
//获取加密内容大小及加密
NTSTATUS BCryptEncrypt(
[in, out] BCRYPT_KEY_HANDLE hKey,
[in] PUCHAR pbInput,
[in] ULONG cbInput,
[in, optional] VOID *pPaddingInfo,
[in, out, optional] PUCHAR pbIV,
[in] ULONG cbIV,
[out, optional] PUCHAR pbOutput,
[in] ULONG cbOutput,
[out] ULONG *pcbResult,
[in] ULONG dwFlags
);
//导出密钥
NTSTATUS BCryptExportKey(
[in] BCRYPT_KEY_HANDLE hKey,
[in] BCRYPT_KEY_HANDLE hExportKey,
[in] LPCWSTR pszBlobType,
[out] PUCHAR pbOutput,
[in] ULONG cbOutput,
[out] ULONG *pcbResult,
[in] ULONG dwFlags
);
//销毁密钥
NTSTATUS BCryptDestroyKey(
[in, out] BCRYPT_KEY_HANDLE hKey
);
//导入密钥
NTSTATUS BCryptImportKey(
[in] BCRYPT_ALG_HANDLE hAlgorithm,
[in, optional] BCRYPT_KEY_HANDLE hImportKey,
[in] LPCWSTR pszBlobType,
[out] BCRYPT_KEY_HANDLE *phKey,
[out, optional] PUCHAR pbKeyObject,
[in] ULONG cbKeyObject,
[in] PUCHAR pbInput,
[in] ULONG cbInput,
[in] ULONG dwFlags
);
//获取解密内容大小及解密
NTSTATUS BCryptDecrypt(
[in, out] BCRYPT_KEY_HANDLE hKey,
[in] PUCHAR pbInput,
[in]

本文详细介绍使用CNG进行对称加密的过程,包括获取算法提供者句柄、设置操作模式、创建加密密钥等关键步骤,并给出AES算法的具体实现代码示例。此外,还介绍了如何在加密过程中加入身份验证。
最低0.47元/天 解锁文章
1489

被折叠的 条评论
为什么被折叠?



