在Windows上使用openssl库生成随机密钥/数据

时间:2012-05-13 02:21:20

标签: c++ c cryptography openssl

我需要生成随机数据(用于键,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 /盐等?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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