我创建了一个伪随机生成器,它对加密是否安全?

时间:2012-01-27 17:15:53

标签: php security random cryptography

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

功能说明

$this->pref_hash_algo($bits_of_entropy=null, $inclusive=false)函数获取默认的散列方法(在我的情况下为sha256),或者如果给出$bits_of_entropy,它将获得最佳散列算法,包括或不包含。例如,230比特的熵包含将返回sha256而排他将返回sha224

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

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

案例2

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

案例3

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

3 个答案:

答案 0 :(得分:1)

加密规则#1不设计您自己的加密。密码学非常微妙,很容易出错。没有理由应该避免使用OS内置的PRNG;所有主要平台(* nix,Windows等)都有强大,易于理解,经过充分研究的PRNG。所以使用那些。

答案 1 :(得分:1)

这并不是真正制作自己的PRNG。我不知道你为什么要从/dev/urandom哈希输出,如果有什么事情会使这个系统不那么安全。只需读出您需要的字节,将其从base256更改为base16或其他任何需要的字节。

答案 2 :(得分:1)

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

<强> ent - A Pseudorandom Number Sequence Test Program

  

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

<强> The diehard test suite

  

...用于测量随机数发生器质量的一系列统计测试。 Wikipedia

<强> The dieharder test suite

  

顽固分子的主要观点(就像之前的死硬)是为了方便时间和测试(伪)随机数发生器,包括软件和硬件,用于研究和加密中的各种目的。

使用自制的伪随机数生成器,通过死硬和顽固测试套件非常困难。