CryptGenRandom和CNG BCryptGenRandom API之间的区别

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

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

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

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

这些问题中的任何一个都是关于你的应用程序本质的问题,以及它是如何被使用的。 如果加密硬件不太可能成为部署故事的一部分,那么我认为没有什么理由要改变你的代码。 但是,如果您的产品和加密硬件倾向于在同一台主机上显示,您的客户将从您的照明功能中受益。