Cryptography API: Next Generation(CNG)使用梳理——非对称加密算法应用(一)数字验证及非对称密钥的导出与导入

本文介绍了CryptographyAPI:NextGeneration(CNG)中非对称加密的关键步骤,包括数字验证、密钥对创建、签名过程以及公钥的导入导出。通过NCrypto和BCrypto函数,展示了如何使用非对称密钥进行签名和验证,特别讨论了PKCS1填充在RSA签名中的应用。

非对称加密算是CNG的重头戏,主要包括,数字验证、信息加密、共享密钥协议等,其中引入了NCtypto系列的函数用于非对称密钥的持久化保存与读取,这篇先以数字验证为例梳理一下,非对称密钥的使用,及导入导出。下一篇同样以数字验证为案例讲一下,非对称密钥导入导出时的持久化保存问题(即BCrypto生成的密钥导出后通过NCrypto保存),之后会再出一篇谈谈与OpenSSL3之间的密钥格式转换及相互签名及验证

一、一般流程

(一)对需要签名的数据进行哈希算法,具体参照,这里不做详述《Cryptography API: Next Generation(CNG)使用梳理——Hash及随机数算法应用》

(二)签名流程(NCtypto签名,BCtypto验证签名)

1、获取算法提供者句柄(NCtypto)

2、创建非对称密钥对

3、完成(NCtypto系列可以在本地固定目录保存密钥对)密钥对

4、对已经Hash的数据进行签名

5、导出公钥(NCtypto)

6、获取算法提供程序(BCtypto)

7、导入公钥(BCtypto)

8、验证签名

需要使用到的函数:

//打开支持所需算法的算法提供程序(NCrypt)
SECURITY_STATUS NCryptOpenStorageProvider(
  [out]          NCRYPT_PROV_HANDLE *phProvider,
  [in, optional] LPCWSTR            pszProviderName,
  [in]           DWORD              dwFlags
);

//创建一个新的密钥对,并将其存储在指定的密钥存储提供程序中
SECURITY_STATUS NCryptCreatePersistedKey(
  [in]           NCRYPT_PROV_HANDLE hProvider,
  [out]          NCRYPT_KEY_HANDLE  *phKey,
  [in]           LPCWSTR            pszAlgId,
  [in, optional] LPCWSTR            pszKeyName,
  [in]           DWORD              dwLegacyKeySpec,
  [in]           DWORD              dwFlags
);

//设置密钥对属性,但在调用 NCryptFinalizeKey 函数之前,不能使用该键
//比如:设置私钥可以导出
SECURITY_STATUS NCryptSetProperty(
  [in] NCRYPT_HANDLE hObject,
  [in] LPCWSTR       pszProperty,
  [in] PBYTE         pbInput,
  [in] DWORD         cbInput,
  [in] DWORD         dwFlags
);

//完成密钥存储。 在调用此函数之前,不能使用该密钥对
SECURITY_STATUS NCryptFinalizeKey(
  [in] NCRYPT_KEY_HANDLE hKey,
  [in] DWORD             dwFlags
);

//创建哈希值的签名
SECURITY_STATUS NCryptSignHash(
  [in]           NCRYPT_KEY_HANDLE hKey,
  [in, optional] VOID              *pPaddingInfo,
  [in]           PBYTE             pbHashValue,
  [in]           DWORD             cbHashValue,
  [out]          PBYTE             pbSignature,
  [in]           DWORD             cbSignature,
  [out]          DWORD             *pcbResult,
  [in]           DWORD             dwFlags
);

//密钥导出到内存BLOB
SECURITY_STATUS NCryptExportKey(
  [in]            NCRYPT_KEY_HANDLE hKey,
  [in, optional]  NCRYPT_KEY_HANDLE hExportKey,
  [in]            LPCWSTR           pszBlobType,
  [in, optional]  NCryptBufferDesc  *pParameterList,
  [out, optional] PBYTE             pbOutput,
  [in]            DWORD             cbOutput,
  [out]           DWORD             *pcbResult,
  [in]            DWORD             dwFlags
);

//打开支持所需算法的算法提供程序(B
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值