快速,安全的随机数

时间:2010-09-01 07:39:04

标签: random openssl blowfish entropy

当我偶然发现this有趣的花絮时,我正在寻找更快的替代/dev/urandom

  

生成非常好的非随机但几乎随机的比特的一个好方法是使用/ dev / random熵来播种快速对称流密码(我最喜欢的是河豚),并将其输出重定向到应用程序需要它。

     

这不是一个初学者技术,但很容易设置两个或三个行shell脚本和一些创意管道。

进一步的研究得出了Schneier关于安全的评论:

  

如果您要“注入熵”,有很多方法可以做到这一点,但更好的方法之一是将其“传播”到高速流密码并将其与非威慑采样系统耦合。 / p>

如果我错了,请纠正我,但在速度和安全性方面,这种生成随机位的方法似乎比/dev/urandom好。

所以,这是我对实际代码的看法:

time dd if=/dev/zero bs=1M count=400 | openssl bf-ofb -pass pass:`cat /dev/urandom | tr -dc [:graph:] | head -c56` > /dev/null

此速度测试需要400MB的零并使用带有448位密钥的blowfish对其进行加密,该密钥由伪随机可打印字符组成。这是我上网本的输出:

  

400 + 0记录   400 + 0记录   复制419430400字节(419 MB),14.0068 s,29.9 MB / s

     

真正的0m14.025s   用户0m12.909s   sys 0m2.004s

太棒了!但它有多随机?让我们将结果传递给ent

  

熵=每字节8.000000位。

     

最佳压缩会减小尺寸   这个419430416字节文件的百分比为0%。

     

419430416样品的卡方分布为250.92,随机分布   将超过此值50.00%。

     

数据字节的算术平均值为127.5091(127.5 =随机)。   Pi的蒙特卡罗值为3.141204882(误差0.01%)。   串行相关系数为-0.000005(完全不相关= 0.0)。

看起来不错。但是,我的代码有一些明显的缺陷:

  1. 它使用/dev/urandom作为初始熵源。
  2. 密钥强度不等于448位,因为只使用了可打印字符。
  3. 应该定期重新设置密码以“扩散”熵。
  4. 所以,我想知道我是否走在正确的轨道上。如果有人知道如何解决任何这些缺点,那就太棒了。另外,如果除/dev/urandomsfillbadblocks或DBAN以外的任何内容,您能否分享用于安全擦除磁盘的内容?

    谢谢!

    编辑:更新了使用blowfish作为流密码的代码。

1 个答案:

答案 0 :(得分:1)

如果您只是想安全地擦除磁盘,那么您真的不必担心您编写的数据的随机性。重要的是写下你可能做的一切 - 也许是几次。除非你的“对手”是一个庞大的政府组织,并且有足够的资源来沉迷于数据恢复,所以除此之外的任何事都是矫枉过正的(即使如此,他们也可以阅读它并不清楚 - 不是这些日子的磁盘密度现在用过)。我使用过GNU'shred'程序 - 但我只是随便关注它。当我这样做时,我将磁盘系统格式化到磁盘驱动器上,然后用一个包含准随机数据的文件填充它,然后将其切碎。我认为这主要是矫枉过正。

也许你应该阅读Schneier的'Cryptography Engineering'书?

相关问题