Cryptography API: Next Generation (CNG)使用梳理——概述

作为微软新一代的加密API,相比老的CryptoAPI提供了更多算法。且,CNG 支持采用内核模式加密。 在内核和用户模式下使用相同的 API,以完全支持加密功能。

CNG 包括对扩展到所有所需算法的B套件的支持:AES (所有密钥大小) , SHA-2 系列 (SHA-256、SHA-384 和 SHA-512) 哈希算法、ECDH 和椭圆曲线 DSA (ECDSA) NIST 标准黄金曲线 P-256、P-384 和 P-521。 Microsoft 算法 Windows提供程序不支持二进制曲线、Koblitz 曲线、自定义黄金曲线和椭圆曲线 Menezes-Qu-Vanstone (ECMQV) 。

Algorithm 类说明
随机数生成器可插入随机数生成 (RNG) 。
散 列用于哈希的算法,如 SHA1 和 SHA2。
对称加密用于对称加密的算法,例如 AES、3DES 和 RC4。
非对称加密支持加密的非对称 (公钥) 算法,例如 RSA(只有RSA公钥加密算法)。
数字签名认证DSA 和 ECDSA 等签名算法。 此类还适用于 RSA。
密钥交换协议Diffie-Hellman (DH) 和椭圆曲线等密钥交换协议算法Diffie-Hellman (ECDH) 。

CNG的整体使用方式和老的CryptoAPI相似,但其分为BCrypto系列和NCrypto系列,从内容来说,BCrypto系列可以看做是加密算法的核心,提供包括:哈希、随机数、对称加密、非对称加密、(对称和非对称)数字签名认证,密钥交换协议等算法支持,而NCrypto系列仅包含与非对称有关的部分:非对称加密,(非对称)数据签名认证,密钥交换协议等,从机制来说,BCrypto系列所有算法和密钥都是在内存中完成的,而NCrypto系列则会保存和优先读取保存在系统中的密钥(私钥)

存储位置如下:

密钥类型目录
用户专用%APPDATA%\Microsoft\Crypto\Keys
本地系统专用%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\SystemKeys
本地服务专用%WINDIR%\ServiceProfiles\LocalService
网络服务专用%WINDIR%\ServiceProfiles\NetworkService
共享专用%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys

注意:

1、CNG的API不是线程安全的

Any functions that modify the same area of memory at the same time (critical sections) when being called from separate threads are not thread safe.

从单独的线程调用时,任何同时修改同一内存区域的函数 (关键部分) 不是线程安全的。

P.S. 写论文查重的可以学习一下,这段话很严谨,简简单单把不是线程安全这件事,描述的很具体,读取安全,写入不安全

NTSTATUS BCryptOpenAlgorithmProvider(
  [out] BCRYPT_ALG_HANDLE *phAlgorithm,
  [in]  LPCWSTR           pszAlgId,
  [in]  LPCWSTR           pszImplementation,
  [in]  ULONG             dwFlags
);

2、BCryptOpenAlgorithmProvider函数获取的算法提供程序句柄是可以被重复使用的

Because of the number and type of operations that are required to find, load, and initialize an algorithm provider, the BCryptOpenAlgorithmProvider function is a relatively time intensive function. Because of this, we recommend that you cache any algorithm provider handles that you will use more than once, rather than opening and closing the algorithm providers over and over.

因为(需要完成)查找、加载和初始化算法提供程序所需的操作数量和类型,BCryptOpenAlgorithmProvider函数是一个相对耗时的函数。因此,我们建议您缓存将多次使用的任何算法提供程序句柄,而不是反复打开和关闭算法提供程序。

3、BCryptSetProperty和BCryptGetProperty函数可以操作于算法提供程序句柄和密钥句柄

也就是可以对BCryptOpenAlgorithmProvider函数返回的BCRYPT_ALG_HANDLE和BCryptCreateHash、BCryptGenerateKeyPair、BCryptGenerateKeyPair返回的各BCRYPT_KEY_HANDLE起作用。

区别是对其前者(BCryptOpenAlgorithmProvider函数返回的BCRYPT_ALG_HANDLE)进行设置,则由此BCRYPT_ALG_HANDLE产生的BCRYPT_KEY_HANDLE都会起效,而对BCRYPT_KEY_HANDLE进行设置,则,只对当前密钥起效

4、对于上面几点NCrypt系列对应函数也是一样

如NCryptOpenStorageProvider及NCryptSetProperty和NCryptGetProperty

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值