c - OpenSSL random - 使用 ENGINE API 设置随机数,正确的方法是什么?

标签 c cryptography openssl

在 OpenSSL 中,使用使用硬件的引擎,我试图确保 RAND_bytes 将使用引擎和硬件。我遇到了两个函数:

ENGINE_set_default_RAND(ENGINE*)
RAND_set_rand_engine(ENGINE*)

看起来 - 他们也做同样的事情。为什么有两个?哪一种是正确的方法?

我通过断开硬件并执行 init,然后执行 RAND_bytes 进一步测试了 set 函数是否工作。仅使用第一个函数(ENGINE_set_default_RAND)一切都成功 - 显然使用了软件实现(为什么?)。当更改为第二个时,set RAND_set_rand_engine 函数调用失败(这很棒)。

最佳答案

根据:https://www.openssl.org/docs/crypto/engine.html#Application_requirements ENGINE_set_default_(ENGINE)* 是正确的方法,例如:

ENGINE_set_default_RAND(myPtrEngine);

它有效,有效地导致引擎实现被使用。我通过修改自定义引擎代码进行了测试,并用一些简单的 printfs(...) 注入(inject)它来指示流程(调试时遇到了一些问题)。

另一个电话:

RAND_set_rand_engine(myPtrEngine);

结果基本相同(我不知道内部差异)。

引起我疑问的问题是回退到软件机制的可能性。当硬件断开连接并设置使用它的引擎时,随机功能似乎起作用了。因此,我不知道 ENGINE_set_default_RAND 是否有效。然而,在检查了引擎的代码后,发现它本身有一个后备机制。这就是为什么它总是有效。

关于c - OpenSSL random - 使用 ENGINE API 设置随机数,正确的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25751015/

相关文章:

algorithm - 在 AES 规范 (FIPS 197) 中,为什么 InvCipher 与反向密码不同?

java - 与带有密码保护 key 的 PHP openssl_open 等效的 Java 是什么?

c - Frama-c,非确定性浮点值

c - 从 C 中的文本文件中删除控件 M

c# - 将 RSA 公钥编码为 DER 格式

java - 在.NET 到 Java/Spring 中实现 RSA 公钥/私钥解密

c++ - 在 VS2010 上构建 openssl 时出错

在安装了 OpenSSL 1.1.1b 的情况下使用 TLSv1.3 时 Apache 报告 "Illegal protocol"

c - 将带有参数的函数传递给信号处理程序?

c - 多个线程之一的 pthread_join