【问题标题】:Openssl RAND_bytes algorithmOpenssl RAND_bytes 算法
【发布时间】:2010-04-24 21:07:23
【问题描述】:

RAND_bytes 函数在 OpenSSL 中使用什么算法?

【问题讨论】:

  • 自己看源码,不难找。

标签: random openssl


【解决方案1】:

OpenSSL 可以加载和运行不同的随机数引擎,并且不限于单个实现。 RAND_bytescrypto/rand/rand_lib.c中实现,它通过调用同一文件中的函数RAND_get_rand_method()来获得一个指向具体RNG实现的函数指针。

因此,假设您尚未加载新的 RNG 引擎,OpenSSL 将选择以下之一:

  1. 默认选择RAND_SSLeay(),在crypto/rand/md_rand.c中实现,最终调用ssleay_rand_bytes()。我不认为它真的有名字,随机性最终来自消息摘要(MD_Update)。

  2. 如果您在 FIPS 模式下运行 1.0 FIPS 模块,您将获得一个 ANSI X9.31 RNG,其核心使用 3DES 或 AES。 (请注意,FIPS 140-2 中不再允许使用 ANSI X9.31)。

  3. 如果您在 FIPS 模式下运行 2.0 FIPS 模块,您将获得一个 SP 800-90A 确定性随机位生成器 (DRBG)。

【讨论】:

  • "...一个 ANSI X9.31 RNG。随机性最终来自 3DES。" - OpenSSL 1.0.x 使用 FIPS 对象模块 2.0,现在使用 AES。我在追踪 AES128/AES/192/AES256 时遇到了麻烦(或默认使用的)。
  • 是的,感谢您指出它发生了变化。 OpenSSL 现在实现了 SP800-90。它定义了不同的密钥强度,因此您实际上可以让它使用 AES 128、256 或 512。我可能应该在这个答案中编辑一些信息...csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf
  • 好的,这很{intersting|embarrasing}(我不事先检查是不好的)。根据 OpenSSL FIPS 2.0 用户指南,“默认 DRBG”,第 64 页:“称为“默认 DRBG”的特殊 DRBG 实例用于将 DRBG 映射到 RAND 接口。但是它[仍然]不清楚使用了来自 SP800-90 的四个生成器中的哪一个,也不清楚底层算法的安全级别。
猜你喜欢
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
相关资源
最近更新 更多