0

我需要生成随机数据(用于密钥、IV 等),但我似乎找不到正确的方法。

这是背景 - 我正在使用 Visual Studio 在 Windows 上使用 c/c++ 开发我的服务器,并且正在使用 openssl1.0.1c 库。

我正在阅读http://www.openssl.org/docs/crypto/RAND_add.html#上使用 openssl 生成随机数据的文档并偶然发现以下内容 -

"

OpenSSL 确保 PRNG 状态对于每个线程都是唯一的。在提供 /dev/urandom 的系统上,随机设备用于透明地播种 PRNG。但是,在所有其他系统上,应用程序负责通过调用 RAND_add()、RAND_egd(3) 或 RAND_load_file(3) 来播种 PRNG。

当 num == entropy 时,RAND_seed() 等效于 RAND_add()。

RAND_event() 从 Windows 事件(例如鼠标移动和其他用户交互)中收集熵。应该使用发送到窗口过程的所有消息的 iMsg、wParam 和 lParam 参数调用它。它将估计事件消息(如果有)中包含的熵,并将其添加到 PRNG。然后程序可以像往常一样处理这些消息。

RAND_screen() 函数可用于方便 Windows 程序员。它将屏幕的当前内容添加到 PRNG。对于可以捕获 Windows 事件的应用程序,通过调用 RAND_event() 播种 PRNG 是更好的随机源。应该注意的是,这两种方法都不能在没有用户交互的情况下运行的服务器上使用。 "

现在,我的服务器确实在无人值守模式下运行,所以我想我不能使用 Rand_event() 和 Rand_screen() 方法。如何在 Windows 上安全地使用 Rand_bytes() 方法?我还没有带有熵的文件,因此 RAND_load_file() 没有问题,EGD 文档页面上的链接似乎没有 Windows 支持的 EGD。如何确保 openssl 随机数据生成器具有足够的熵,以便我可以使用 Rand_bytes() 生成我的密钥/ivs/salts 等?

4

2 回答 2

0

您应该能够简单地调用RAND_bytes而不用担心初始化。我不确定该参考手册页中的含义,但我怀疑它有点过时了。OpenSSL 具有针对 RAND_bytes 的操作系统特定的初始化代码。例如,如果 v1.0.0c可用,CryptGenRandom则从其调用RAND_poll

不过,检查 RAND_bytes 的返回值可能是有意义的。如果初始化代码未能产生足够的熵,它将返回一个错误(它返回 1 表示成功)。

于 2012-05-14T23:24:27.950 回答
0

您可以尝试EGDW(Windows 的熵收集守护程序)

于 2012-09-27T20:46:07.900 回答