伪随机数的产生和流密码
能够应用到大量密码函数的一种功能是随机或伪随机数的产生。对这个功能的要求是产生的数据流必须不能预测。
流密码是对称密码算法,从明文输入流逐位或逐字节产生密文输出。使用最为广泛的此类密码是RC4。
一个重要的密码函数是具有强密码学意义的伪随机数发生器。伪随机数发生器(PRNG)在许多密码和安全应用中有使用。
伪随机数发生器(PRNG)
真随机数发生器(TRNG)
在网络安全的各种应用里,随机数在加密算法中扮演重要的角色。
伪随机数的产生的原则
大量的基于密码学的网络安全算法和协议都使用了二进制随机数。
随机性
一般认为随机序列应有良好的统计特性。分布均匀性:序列中的位分布应是均匀的,即0和1出现的频率大约相等。
独立性:序列中任何子序列不能由其他子序列推导出。
伪随机数发生器(PRNG):密码应用大多使用算法来生成随机数。这些算法是确定的,所以产生的序列并非统计随机的。
不过,要是算法好的话,产生的序列可以经受随机性检测,这样的数一般称为伪随机数。
TRNG把一个很随机的源作为输入,这个源常称为熵源。
本质上,熵源是从计算机的物理环境抽取的,可能包括键盘敲击时间模式、磁盘的电活动、鼠标移动、系统时间的瞬时值等。
源或诸源的组合作为算法的输入,产生随机的二元输出。TRNG也许仅仅是把模拟信号源转化为二元输出。TRNG也可能会做
额外的处理以消除源里的不平衡。
PRNG取一个固定值,称为种子,作为输入,用一个确定性的算法产生位输出序列。通常由此算法的部分结果反馈作为输入,而
其他部分作为输出位。需要注意的是,输出位流仅由输入值决定,所以知道算法和种子的敌手可以重现整个位流。
上图显示了两款基于应用的不同形式的PRNG伪随机数发生器(PRNG):用于产生不限长位流的算法称为PRNG。不限长位流的通常应用是作为对称流密码的输入。伪随机函数(PRF):PRF用于产生固定长度的伪随机位串。对称加密密钥和时变值就是例子。通常PRF的输入为种子加上一些上下文相关的特定值。除了产生位的数量外,PRNG和PRF之间没有差别。这两个应用可以使用相同的算法。两者都需要种子,都必须具有随机性和不可预测性。而且,PRNG应用可能也需要使用上下文相关的输入。当PRNG或PRF用于密码学应用时,基本的要求是不知道种子的敌手不能决定伪随机串。PRNG多年来一直是密码学上的研究主题,为此产生了大量的算法。这些算法可以大体分为两类:特意构造的算法:这些算法是为了产生伪随机位流而特意或专门设计的。许多算法在许多PRNG应用中使用。其他算法则特意为了 流密码而设计。基于现存密码算法的算法:密码学算法具有随机化输入的效果。的确,这是此类算法的要求。例如,如果对称分组密码产生的密文具有某些规则性,这就有助于密码分析。因此,密码学算法在PRNG中起核心作用。三大类密码学算法常用来产生PRNG:对称分组密码;非对称密码;Hash函数和消息认证码。伪随机数发生器线性同余发生器一个广泛使用的产生伪随机数的方法是由Lehmer首先提出的算法,即线性同余方法。算法有以下4个参数:m模m>0; a 乘数0