我创建了一个伪随机生成器,它对密码学来说是安全的吗


I have created a pseudo random generator, is it secure for cryptography?

我创建了一个用于加密目的的随机生成器,我想知道它是否足够安全。如果是的话,你当然可以自由使用。提前感谢阅读我的文字墙:D

功能说明

$this->pref_hash_algo($bits_of_entropy=null, $inclusive=false)函数获得默认的哈希方法(在我的情况下为sha256),或者如果给定$bits_of_entropy,则它获得包含或不包含的最佳哈希算法。例如,包含熵的230个比特将返回CCD_ 4,而互斥将给出CCD_ 5。

self::$HASH_PREFERENCES['128'][0]返回的算法为ripemd128

对于$this->hash($input, $algorithm=null, $output_type=self::OUTPUT_HEX),如果算法被认为是安全的,并且支持比二进制和十六进制更多的输出类型,它只会执行带有额外检查的PHP hash($input, $algorithm[, $binary])

生成代码

为了方便访问,将第一个版本移动到http://pastebin.com/YtJFvpah

更新

根据您的输入,我已将代码更改为以下内容:http://pastebin.com/bQ5tFDdh

编辑摘要:

  • 不是散列,而是格式化/dev/urandom输出
  • 添加了同时输出哈希,用于当哈希算法的输出对于所请求的随机比特数量太少时(例如,当请求4000比特时为sha512)

测试

案例1

我在2.000.000字节的样本上运行了php /my/path/to/file.php | ent来测试/dev/urandom方法和替代方法。

  • CCD_ 12给出了7.999903比特/字节的熵。(http://pastebin.com/NLqZ5Kza)
  • 另一种方法给出了7.99913比特/字节的熵。(http://pastebin.com/rnebrvKg)

案例2

我使用ALTERNATIVE METHOD创建了一个4.7MB的二进制文件(当/dev/urandom被禁用/不可用时),并运行了dieharder -a -f /home/beanow/random.input -t 10:

  • CCD_ 15给予2个弱(http://pastebin.com/HiwQeJtP)
  • 备选方法给出:0个weaks(http://pastebin.com/x1VbEhzg)

案例3

与情况2相同,但使用20MB二进制文件,并删除-t参数以使用默认设置。

  • CCD_ 16给出了4个弱点(http://pastebin.com/hwqQBTqu)
  • 替代方法给出:1弱(http://pastebin.com/cvPXiGBV)

有许多测试可以针对您的输出运行,以确定它的随机性

ent-伪随机数序列测试程序

[ent]将各种测试应用于存储在文件中的字节序列,并报告这些测试的结果。[ent]可用于评估加密和统计采样应用程序、压缩算法以及对文件信息密度感兴趣的其他应用程序的伪随机数生成器。

顽固测试套件

用于测量随机数生成器质量的一组统计测试。维基百科

更顽固的测试套件

diehard(就像之前的diehard一样)的主要目的是为了便于对(伪)随机数生成器进行计时和测试,包括软件和硬件,用于研究和密码学的各种目的。

使用自制的伪随机数生成器,通过顽固和顽固测试套件是相当困难的。

密码术的第一条规则是不要设计自己的密码术。密码学非常微妙,很容易出错。没有理由避免使用PRNG中内置的操作系统;所有主要平台(*nix、Windows等)都有强大、理解良好、研究充分的PRNG。所以使用这些。

这并不是真正制作自己的PRNG。我不知道你为什么要对/dev/urandom的输出进行哈希处理——如果有什么不同的话——这会降低这个系统的安全性。只需读出您需要的字节,将其从base256更改为base16或其他任何您需要的值。