Cryptography API: Next Generation(CNG)使用梳理——对称加密算法应用

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

对称加密算法,顾名思义就是加密与解密使用相同的密钥

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]                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值