小计
1、PRF
PRF代表伪随机函数,那么伪随机函数对应的伪随机数生成器又是什么,接下来会简单介绍一下,首先需要明白,伪随机函数是怎么生成的。
- 随机数生成函数
真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。我们可以这样认为这个可预见的结果其出现的概率是100%。所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。从定义我们可以了解到,伪随机数其实是有规律的。只不过这个规律周期比较长,但还是可以预测的。主要原因就是伪随机数是计算机使用算法模拟出来的,这个过程并不涉及到物理过程,所以自然不可能具有真随机数的特性。
那么我们通常使用的随机数函数:rand()又是什么原理呢,我们来简单介绍一下。依赖于stdlib.h的伪随机数生成函数rand(),使用时主要如下所示:
#include <stdio.h>
#include <stdlib.h>
int main (){
int random = rand();
printf("%d\n",random);
random = rand();
printf("%d\n",random);
random = rand();
printf("%d\n",random);}
我们可以通过整形变量来打印生成的随机数,但是当我们执行多次之后,会发现生成的随机数会发生重复,这并没有达到随机数的要求::随机性和不可预测性,而同时,随机性又有两个评价标准:
- 分布均匀性指的是0和1出现的概率大致相等
- 独立性指的是序列中任何子序列不能由其他子序列推导出
但是,没有可靠的方法表明一个序列的独立性好,只能证明一个序列不具有独立性。因此只好多测测,来回多次仍然表现不错的话,就姑且当它独立性不错。
不可预测性是指每个数都统计独立于其他数,因而不可预测。但是真正的随机数序列很少用,一般看上去随机的随机数序列都是由算法产生的。因此需要注意不能让攻击者从先前的随机数推导出后面的随机数。
其实,在c语言中的rand函数中有一个定义叫做种子,rand函数是通过对这个种子进行一系列的运算来模拟出一个随机数的。我们直接调用rand函数,并不指定种子,系统就会调用默认的种子:1,来产生随机数。因为每次重新运行时的种子都是1,运行出来的结果自然就还是这几个数啦。目前理想的种子采用时间,需要用到:
#include<time.h>
#include <time.h>
#include <stdlib.h>
int main (){
srand ((unsigned)time(NULL));
int random = rand();
printf("%d\n",random);
random = rand();
printf("%d\n",random);
random = rand();
printf("%d\n",random);}
对之前的代码进行改进。通过时间设置种子的值,然后再运行,每次都会得出不同的结果了。这里srand函数的定义就是:随机数生成器的初始化函数。通常是和rand函数配合使用的。将返回计算机目前的时刻与1970年1月1日0时0分0秒之间的时间差,单位是秒。srand又需要unsigned int类型,所以这里使用一个强制类型转换,最后完成种子的设置。需要注意的是,srand函数必须放在循环或者循环调用的外面,否则还是会得出重复的数字。
2、PRNG
伪随机数发生器PRNG则使用种子作为输入。攻击者知道算法和种子就可以重现输出流。
伪随机数函数PRF与PRNG的区别在于产生的位数量不同,PRNG产生不限长的位流,而PRT则产生固定长度的伪随机位串。此外PRT通常除了种子,还会加上一些上下文作为输入。PRNG和PRT两者没有本质的差异,可以使用相同的算法。
PRNG可产生用于流密码的伪随机位流,而PRT则可用于产生对称密码的密钥。
- 随机数发生器
PRNG算法大体分两类
1、特意构造的算法
这些算法是为了产生伪随机位流而专门设计的,最重要的例子是RC4
2、基于现存密码算法的算法
密码学算法在PRNG中起核心作用,三大类密码学算法常用来产生PRNG
对称分组密码、非对称密码、Hash函数和消息认证码
- 线性同余发生器
随机数序列产生公式
Xn+1 = (aXn + c) mod m m,a,c,X0∈Z
参数取值需要满足三个标准:函数在重复前应该产生0-m之间的所有数;产生的序列应该显得随机;生成函数可以用计算机方便地实现
满足条件的参数选择如下:
- m一般取素数,且要求很大,对于32位机一般取值为2^31-1
- a 的可取值不多,当a=75=16807时满足以上标准。
这个算法的缺点是,在参数确定后,伪随机序列只与X0相关,容易被破解。有一种改进的办法就是每隔N个数就以时钟值对m取模作为新的种子来产生新的序列。还有一种方法是直接将随机数加上时钟值再对m取模。
2、BBS发生器(三位设计者名字首字母合称)
产生过程如下:
首先,选择两个大素数p和q,且要求 p ≡ q ≡ 3 (mod 4),令n = p × q
接着选择一个随机数s,要求s与n互素,然后按以下算法产生位Bi序列
X0 = s^2 mod n
for i = 0 to ∞
Xi = (Xi-1)2 mod n
Bi = Xi mod 2
BBS发生器是产生安全伪随机数的普遍算法,是特意构造算法中密码强度有最强公开证明的一个,被称为密码安全伪随机位发生器(CSPRBG)。
BBS之所以被称为安全伪随机位生成器,是因为它能经受续位测试。续位测试是指给定序列的最开始k位,没有任何有效算法可以产生超过1/2的概率预测出第(K+1)位。因此对于实际应用,这个序列是不可预测的。
BBS的安全性是基于对n的因子分解的困难性上的。
此外,有两种分组密码的工作模式在构建PRNG上获得了广泛的接受:CTR模式和OFB模式

本文介绍了密码学中的伪随机数概念,包括伪随机函数(PRF)和伪随机数生成器(PRNG)。PRF用于产生固定长度的伪随机位串,而PRNG则产生无限长的位流。讨论了C语言中rand()函数的工作原理和种子设置,强调了随机数的分布均匀性和独立性。文章还探讨了PRNG的两种类型,特别提到了线性同余发生器和BBS发生器,它们的安全性和基于因子分解的困难性。
3679

被折叠的 条评论
为什么被折叠?



