第十章 随机性
生成密钥而有了随机数发生器(RNG)。
随机性的量度叫做熵(例如:一个32比特的完全随机的字,它的熵就是32比特),描述一个值有多少的不确定度。
10.1 真随机
真随机数的问题:
第一:真随机数不总是可以得到的
第二:像随机数发生器这样的真随机源可以被攻破
第三:如何判断能从特定的物理事件中获得多少熵
伪随机数据不是完全随机的,通过一定的算法从一个种子生成数据,如果知道了种子,就能预测出伪随机数据来,传统的PRNG对于聪明的敌手来说是不安全的。
使用真随机数做简单的事情:作为伪随机数生成器PRNG的种子。这样就保证了即使以前的种子被攻破,随机数据也是完全不可预测的。
10.2 PRNG的攻击模型
无论何时PRNG都有一个内部的状态,所需的随机数据是通过用密码算法来产生伪随机数据完成的。这个算法也更新了PRNG内部的状态,用以保证下一次请求不会产生同样的随机数据。
防御特定攻击的方法,把包含熵额事件混到一起,不断把足够多的熵手机到内部状态中,直到攻击者不能猜出混合的数据为止。
但是对熵的数量做任何的评估都是相当困难的,取决于攻击者想知道或者能知道多少,但是这对于开发者在设计阶段是不可能获得的。Yarrow试图用熵评估器来测量源的熵值,但是者不可能适应所有的情况。
10.3 Fortuna
是Yarrow的一中改进方案。
有三部分组成:
1、发生器采用固定大小的种子来生成任意数量的伪随机数据。
2、累加器收集和混合从各种源产生的熵,又是还给发生器新的种子
3、种子文件管理能保证即便是机器刚刚启动,PRNG也能产生随机数据。
10.4 发生器
功能:把固定大小的状态转换成任意长的输出。
发生器的内部固有状态包含256比特的分组密钥和128比特的计数器,发生器基本上说是在计数器模式下的分组加密。
1、初始化:把密钥和计数器设为0表示发生器还没有种子
Input:g发生器的状态
设密钥K与计数器C为零
K = 0
C = 0
g = (K,C)
return g
2、重新产生种子
Input:g发生器的状态
S 新的或要加入的种子
用Hash函数计算新的密钥
K = SHA256(K||S)
计数器增加使其非零 C = C+1
3、生成分组:生成一些随机输出的分组
Input:g 发生器的状态
k 要产生的分组数目
Output:r 16k 字节的伪随机字符串
Assert C≠0
以一个空串开始
r = 空
For i=1,…,k do
r = r||E(K,C) //每次把新计算的分组加入到r中构成输出值
C = C+1
Return r
4、生成随机数据:在发生器用户的请求下产生随机数据,允许输出最多达到220 字节,保证发生器忘掉产生的结果的任何信息。