posts - 72, comments - 66, trackbacks - 0, articles - 0

一些关于随机数的理解

Posted on 2008-08-28 23:46 Fingki.li 阅读(859) 评论(0)  编辑  收藏 所属分类: About development

以往有听说过“Microsoft Windows、FreeBSD不安全随机数生成器信息泄露漏洞”之类的文章,大都是因为随机函数存在漏洞生成不安全的随机,导致可预测的加密密钥。
About Random
随机数是密码学的一个重要部分,它通常作为初始化向量用于密钥生成中。有许多测试根据数字计算给定数字序列的随机性,它们考虑给定数定在序列中出现的周期,做更细致的测量,包括相同数字或其他重复形式出现的周期。
但统计随机性的要求与加密随机性不同。
一个数字序列在统计上是随机的,但如果攻击者可以推算出数字的序列(通过了解使用的算法和随机种子值),那么加密是变得不安全了。
About Pseudo Random 伪随机数
对于一串随机的数字,最常见的描述就是没有从前一个数字推算出后一个数字的数学方法。最好的随机数是从物理过程中获得的,因为实际物理程才是真正随机的。事实上,一些随机数生成器就是使用硬件设置来实现,如音频输入或二极管。
    从设计上来说,计算机是很确定的,因此不是生成随机数的就好选择。它们通常求助于一个生成统计上随机的数字串的算法。为了确定在该算法中使用的输入值,它们要求用户提供一个种子值,这通常来自于系统时钟、网卡MAC地址以及其他不同的系统参数。
    这些随机数字很适合于计算机游戏中的示例数据或建模物理过程。不过,它们不适合于加密。它的弱点包括以下几点:
●     伪随机数是周期性的。最终将重复数字序列。
●     如果使用相同的种子值,将接收到序列完全一样的“随机”数。因此,随机序列与种子值一样多。
●     随机数可使用逆向工程。运用算法知识,强力攻击会立即猜测到种子值。如果种子值和时间之间有相关性,攻击者将会推算出所有后面的“随机”数。
 
伪随机数是出现许多臭名昭著的攻击的主要原因。破解56 位DES从1997年1月的96 天到1999 年1月的22 小时15 分钟,由于DES使用的伪随机数生成算法导致了这个结果,有一种攻击就是针对赌博应用程序,这种应用程序使用一个随机数种子值来对纸牌进行排序,而洗牌的可能性是有限的。在看完开始的几张牌后,用户可以将当前发的牌与某种可能的洗牌序列匹配,来确定剩下牌的顺序。

另一个著名的例子就是Netscape Navigator 早期版本中的取决于时间的随机数字生成器,它泄露了动态生成的用于加密运用SSL的会话中数据的密钥。
About Random encrypted 加密的随机数
随机数生成是许多加密操作不可分割的组成部分。例如,加密密钥需要尽可能地随机,以便使它们很难被复制。加密随机数生成器必须生成在计算上无法进行推算(低于 p < .05 的概率)的输出;即,任何推算下一个输出位的方法不得具有比随机猜测更高的成功几率。
为了说明一连串的随机数字是加密安全的,必须使得用户不可能通过计算重新生成同样序列的随机数。遗憾的是,运用伪随机数字,可以很容易地重新生成同样的序列。用户需要知道的知识就是伪随机数生成器算法和种子值。
    通过加密保护数据基于加密算法和更为随机的种子值就是本文要提出的方法,一个带加密功能的随机数产生器,可以应用于需要加密随机数的场合.为了构成种子值,需要用不同的值组合成一个系统范围内的种子值。这些值包括调用的应用程序可以提供的位,例如鼠标或键盘动作之间的用户反应时间、象进程ID和线程ID这样的系统和用户数据、系统时钟、系统计数器、自由磁盘集群属和散列的用户环境块。接着使用SHA-1散列这个值,输出用于创建一个随机数据流(用于更新系统种子值)。这可以起作用,是因为散列值生成了看似随机的数据,只改变源文档(种子值)中的一个位,任何两个输出的散列共享它们50%的位,尽管两个输出只有一位之差。当然,从理论上讲,有些过程还是周期性的。例如磁盘搜索时间看似随机的,实际取决于易于确定的因素,可以被推测出来。为了获取更好的随机数生成,可以采用硬件生成器,例如Intel的随机数生成器。
   
说明:
    创建加密安全的随机数需要更多的时间,这意味着如果需要快速地在一个短时间内生成大量随机数(例如百万级的数据)是不适合的。在一个简单测试中,用本文提到的RNG生成一百万个随机数的时间花费差不多是伪随机数生成器所用时间的八倍之多。

相关资源:http://www.xfocus.net/articles/200209/451.html


只有注册用户登录后才能发表评论。


网站导航: