CryptGenRandom和CNG BCryptGenRandom API之间的区别

时间:2016-05-18 05:04:46

标签: c++ windows winapi cryptography cryptoapi

我们的某个产品目前正在使用CryptGenRandom API生成随机数。最近,我遇到了Cryptography API:Next Generation(CNG),它提供了一个新的API BCryptGenRandom(在bcrypt.h中)。根据MSDN中提供的描述 - 两个API都符合Windows Vista Service Pack 1(SP1)及更高版本中的NIST SP800-90标准。

  1. 如果我使用默认的Microsoft提供程序,那么两个API之间的随机数生成过程是否存在差异?
  2. 如果没有任何差异,我是否应该转到CNG API,因为CNG是CryptoAPI的长期替代品?

1 个答案:

答案 0 :(得分:1)

关于你的第一个问题,不,正如你所指出的,根据MSDN,两个API都使用相同的伪随机数生成器算法。可能更相关的是指出两个API使用相同的Windows内核熵源来为PRNG提供信息。

关于第二个问题,这更有意思,因为它提出了主机是否具有作为第三方附加组件可用的更高质量RNG的问题(例如硬件安全模块,HSM)。可以通过CNG(BCryptGenRandom),传统CAPI(Crypto API,CryptGenRandom)和/或作为内核模式熵源来暴露硬件RNG。如果前两个中的任何一个(但不是两个)都有,那么只有当您调用特定的RNG API时,您的应用才会受益。但是,如果硬件RNG作为内核熵源安装,那么您的应用程序可以从中受益。

这些问题是否更重要的是您的应用程序的性质以及它通常如何使用的问题。如果加密硬件不可能成为部署故事的一部分,那么我认为没有理由改变您的代码。但是,如果您的产品和加密硬件往往出现在同一台主机上,那么您的客户将从中受益于您。