Random 快速、安全的随机数

Random 快速、安全的随机数,random,openssl,blowfish,entropy,Random,Openssl,Blowfish,Entropy,我正在寻找一个比/dev/uradom更快的替代方案,突然发现了一个有趣的小道消息: 生成非常好的非随机但近乎随机的位的一个好技巧是使用/dev/random的熵来播种一个快速对称流密码(我最喜欢的是blowfish),并将其输出重定向到需要它的应用程序 这不是一个初学者的技巧,但是使用两行或三行shell脚本和一些创造性的管道很容易设置 进一步的研究得出了Schneier关于安全性的评论: 如果你打算“注入熵”,有很多方法可以做到这一点,但更好的方法之一是通过高速流密码“传播”熵,并将其与非确

我正在寻找一个比
/dev/uradom
更快的替代方案,突然发现了一个有趣的小道消息:

生成非常好的非随机但近乎随机的位的一个好技巧是使用/dev/random的熵来播种一个快速对称流密码(我最喜欢的是blowfish),并将其输出重定向到需要它的应用程序

这不是一个初学者的技巧,但是使用两行或三行shell脚本和一些创造性的管道很容易设置

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

如果你打算“注入熵”,有很多方法可以做到这一点,但更好的方法之一是通过高速流密码“传播”熵,并将其与非确定性采样系统耦合

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

下面是我对实际代码的看法:

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的零,并使用blowfish加密,其密钥为448位,由伪随机、可打印字符组成。以下是我的上网本上的输出:

中的400+0记录 400+0记录输出 已复制419430400字节(419 MB),14.0068秒,29.9 MB/s

真实0m14.025s 用户0m12.909s 系统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)

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

  • 它使用
    /dev/uradom
    作为初始熵源
  • 密钥强度不等于448位,因为只使用可打印字符
  • 密码应该定期重新播种,以“分散”熵
  • 所以,我想知道我是否在正确的轨道上。如果有人知道如何修复这些缺陷,那就太好了。另外,如果磁盘不是
    /dev/uradom
    sfill
    badblocks
    或DBAN,请分享您用于安全擦除磁盘的内容

    谢谢大家!


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

    如果您只是想安全地擦除磁盘,那么您真的不必担心写入数据的随机性。重要的是尽可能多地写信——也许几次。除非你的“对手”是一个大型政府组织,有足够的资源来沉迷于数据恢复,否则任何比这多得多的东西都是杀伤力过大的(而且现在还不清楚他们是否能够读取数据,因为现在使用的磁盘密度已经不高了)。我曾经使用过GNU的“shred”程序,但我只是偶尔关心一下。当我这样做时,我将一个磁盘系统格式化到磁盘驱动器上,然后用一个包含准随机数据的文件填充它,然后将其切碎。我认为这基本上是矫枉过正


    也许你应该读施奈尔的书?

    你会对FreeBSD上的urandom手册页感兴趣。Yarrow算法听起来确实很有希望。肯定比我现在做的更安全。你有“ent”程序的URL吗?。我还建议。河豚不是一种流密码,您也不能在类似流密码的模式下使用它,例如计数器模式。NIST SP 800-90包含了各种各样的结构来实现这一点。我同意使用随机数据来安全地擦除磁盘是一种过分的做法。你只需做一次
    /dev/zero
    ,就可以非常安全地抵御非百万富翁的攻击者。然而,如果我买了一个2TB的硬盘,并想对它进行加密,我必须首先用随机数据填充它。谢谢你的书,我会查的。