【问题标题】:Porting read from /dev/urandom to non-Unix platform将读取从 /dev/urandom 移植到非 Unix 平台
【发布时间】:2017-11-10 14:27:01
【问题描述】:

我需要将一些软件移植到只有标准 ANSI C 运行时和一些 POSIX 函数的平台。该软件通过读取/dev/urandom 为密码加密ZIP 文件生成随机数。在 Windows 上,软件使用CryptGenRandom() 生成随机数。由于这两个功能在我的目标平台上都不可用,我必须找到替代方案。

我想出这个来用length 随机字节填充buffer

bool zip_random(zip_uint8_t *buffer, zip_uint16_t length)
{
   srand(time(NULL));
   while(length--) *buffer++ = rand() % 256;
   return true;
}

这可以完成工作,但由于该函数用于加密上下文,我不知道使用旧的 srandrand 函数是否是个好主意。这就是为什么我想问我的方法是否可以接受,或者是否有更好的解决方案。

【问题讨论】:

  • This 可能很有趣。
  • 使用srand()time() 进行密码学是一场灾难。正确地完成工作将是困难的。平台是什么?如果真的没有任何可用的东西,您可能需要寻找 EGD(熵收集守护程序)或类似的东西。或者也许是施耐德的 Fortuna PRNG。不要试图发明你自己的。不够随机
  • @JonathanLeffler:这就是我所担心的 :) 平台是 AmigaOS,所以这里没有太多选择...
  • 除非您简单地购买硬件真正的随机位生成器,否则您将做很多丑陋的工作。
  • Here 例如是使用串口的。

标签: c random cryptography


【解决方案1】:

rand 不应用于任何需要实际安全的事情。

C11 standard 的 7.22.2.1 中关于 rand 的脚注

不保证产生的随机序列的质量和一些实现 已知会产生令人痛苦的非随机低位序列。应用程序 特定要求应使用已知足以满足其需求的生成器。

【讨论】:

  • 脚注与srand无关。它指的是兰特。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 2016-10-21
相关资源
最近更新 更多