能够应用到大量密码函数的一种功能是随机或伪随机数的产生。对这个功能的要求是产生的数据流必须不能预测。

流密码是对称密码算法,从明文输入流逐位或逐字节产生密文输出。使用最为广泛的此类密码是RC4。

一个重要的密码函数是具有强密码学意义的伪随机数发生器。伪随机数发生器(PRNG)在许多密码和安全应用中有使用。

伪随机数发生器(PRNG)

真随机数发生器(TRNG)

在网络安全的各种应用里,随机数在加密算法中扮演重要的角色。


伪随机数的产生的原则


大量的基于密码学的网络安全算法和协议都使用了二进制随机数。


随机性

一般认为随机序列应有良好的统计特性。分布均匀性:序列中的位分布应是均匀的,即0和1出现的频率大约相等。

独立性:序列中任何子序列不能由其他子序列推导出。


伪随机数发生器(PRNG):密码应用大多使用算法来生成随机数。这些算法是确定的,所以产生的序列并非统计随机的。

不过,要是算法好的话,产生的序列可以经受随机性检测,这样的数一般称为伪随机数。


TRNG把一个很随机的源作为输入,这个源常称为熵源。

本质上,熵源是从计算机的物理环境抽取的,可能包括键盘敲击时间模式、磁盘的电活动、鼠标移动、系统时间的瞬时值等。

源或诸源的组合作为算法的输入,产生随机的二元输出。TRNG也许仅仅是把模拟信号源转化为二元输出。TRNG也可能会做

额外的处理以消除源里的不平衡。


PRNG取一个固定值,称为种子,作为输入,用一个确定性的算法产生位输出序列。通常由此算法的部分结果反馈作为输入,而

其他部分作为输出位。需要注意的是,输出位流仅由输入值决定,所以知道算法和种子的敌手可以重现整个位流。





java 伪随机码_java 伪随机码


上图显示了两款基于应用的不同形式的PRNG


伪随机数发生器(PRNG):用于产生不限长位流的算法称为PRNG。不限长位流的通常应用是作为对称流密码的输入。


伪随机函数 (PRF):PRF用于产生固定长度的伪随机位串。对称加密密钥和时变值就是例子。通常PRF的输入为种子


加上一些上下文相关的特定值。


除了产生位的数量外,PRNG和PRF之间没有差别。这两个应用可以使用相同的算法。两者都需要种子,都必须具有随机性和


不可预测性。而且,PRNG应用可能也需要使用上下文相关的输入。


当PRNG或PRF用于密码学应用时,基本的要求是不知道种子的敌手不能决定伪随机串。




PRNG多年来一直是密码学上的研究主题,为此产生了大量的算法。这些算法可以大体分为两类:


特意构造的算法:这些算法是为了产生伪随机位流而特意或专门设计的。许多算法在许多PRNG应用中使用。其他算法则特意为了


                             流密码而设计。


基于现存密码算法的算法:密码学算法具有随机化输入的效果。的确,这是此类算法的要求。例如,如果对称分组密码产生的密文


具有某些规则性,这就有助于密码分析。因此,密码学算法在PRNG中起核心作用。三大类密码学算法常用来产生PRNG:对称分组


密码;非对称密码;Hash函数和消息认证码。




伪随机数发生器



线性同余发生器


一个广泛使用的产生伪随机数的方法是由Lehmer首先提出的算法,即线性同余方法。算法有以下4个参数:


X0<m;


随机数序列{Xn}按下面的迭代式获得:
X n+1=(aX n+c)mod m


若m,a,c和X 0都是整数,那么这种方法将产生一个整数序列,且每个整数都满足0<=X n<m。


要想设计一个好的随机数发生器,对a,c和m的选择至关重要。m一般都很大,因此可产生长连串的不同随机数,一个常见的


评价标准是m与给定计算机可表示的最大非负整数的值接近相等。



在文献PARK88a中提出衡量随机数发生器的三个标准:


1.生成函数应是全周期的,即函数在重复之前应该产生0~m之间的所有数。


2.产生的序列应显得随机。


3.生成函数可以用32位运算器方便地实现。


选择合适的a、c和m,可以同时满足这三点。



尽管使用线性同余发生器这种办法用做伪随机数发生器有很多优点,但是最理想的还是要使产生的序列不可重新产生,这样的话敌手


才不能由部分序列求得以后的序列。有几种办法可以达到这个目标,比如使用内部系统时钟来修正随机数流,一种方法是每隔N个数就


以时钟值对m取模作为新的种子来产生新的序列。还有一种方法是直接将随机数加上时钟值再对m取模。



 BBS发生器


 BBS发生器是产生安全伪随机数的普遍方法。它也许是特意构造算法中密码强度有最强公开证明的一个了。产生过程如下:首先,



java 伪随机码_PRF_02


令n=p*q。接着,选择一个随机数s,且要求s与n互素,即p或q都不是s的因子。然后BBS按下列算法产生位B i序列:


  



java 伪随机码_PRNG_03


BBS被称为密码安全伪随机位发生器(CSPRG)。




使用分组密码的伪随机数产生



构造PRNG的常用方法是使用对称分组密码作为PRNG机制的核心。对于任意的明文分组,对称分组密码产生一个明显随机的分组


输出,即密文里没有规则或模式可用于推导明文。因此,对称分组密码很适合用来构造伪随机数发生器。



两种使用分组密码构建PRNG的方法获得了广泛的接受:CTR模式和OFB模式。



java 伪随机码_java 伪随机码_04


图7.3展示了两种方法。在每一种情况下,种子由两部分组成:加密密钥值以及每产生一个随机数分组后都要更新的V值。



ANSI X9.17伪随机数发生器


ANSI X9.17中所给出的伪随机数发生器是密码学意义上最强的伪随机数发生器之一。许多应用使用了这种方法,包括金融


安全应用和PCP。




java 伪随机码_PRNG_05



真随机数发生器



真随机数发生器(TRNG)使用不可预测源来产生随机数。


一个真随机数发生器的输出应该有时会有偏差,比如1的个数比0的个数多,或者反之。将一个位串减少或者消除偏差的方法有很多,这些方法称为消偏算法。




流密码



一个典型的流密码每次加密一个字节的明文,当然流密码也可被设计为每次操作1位或者大于一个字节的单元。



java 伪随机码_PRNG_06