随机数在密码学中的具有十分重要的地位,被广泛用于密钥产生、初始化向量、时间戳、认证挑战码、密钥协商、大素数产生等等方面。随机数产生器就是用于产生随机数的算法、函数以及设备。因此它的安全性也就对密码系统的安全性带来重要影响。随机数产生器包括非确定性(真随机)数产生器(Non-deterministic Random Bit Generators (NRBG))和确定性(伪随机)数产生器(Deterministic Random Bit Generators (DRBG))两类。真随机数产生器一般基于物理或化学熵源,比如原子运行轨迹、环境噪音、电路噪声,空气中颗粒数等等,这种随机数产生器的特点是随机性非常好,完全不可预测和回溯,但这些方法一般需要依靠特定的物理系统环境条件才能获取,所以应用范围有限。一般系统使用的随机数产生器都是伪随机的。伪随机数产生器之所以被称为确定性随机数产生器,是因为在确定输入(种子)的情况下,它的输出也就确定了,相同的输入必然导致相同的输出,这类随机数产生器一般只依赖软件算法实现,对系统要求较低,应用范围广泛。
根据NIST SP800-90 标准算法,提供了4 种标准算法。即,Hash_DRBG、HMAC_DRBG、CTR_DRBG、Dual_EC_DRBG。在polarssl中提供了两种随机数产生的方法:
1)HAVEGE(HArdware Volatile Entropy Gathering and Expansion) 随机数发生器,实现的具体代码在havege.c这个文件。
注意:默认的编译是没有开启它的,你需要在config.h这个文件中定义宏POLARSSL_HAVEGE_C,此外HAVEGE随机生成是依赖于时间和具体处理器的特性,因此,不建议使用HAVEGE作为你的应用程序的主要随机数发生器或主熵池输入。它能够添加(有限)额外的熵,作为辅助输入到你的熵池。HAVEGE不能使用在虚拟环境中。
下面介绍HAVEGE 的使用方法
int main( int argc, char *argv[] )
{
FILE *f;
time_t t;
int i, k;
havege_state hs;
unsigned char buf[1024];
if( argc < 2 )
{
fprintf( stderr, "usage: %s
关于haveged的具体实现算法,这里不做介绍,有兴趣的朋友可以去研究一下。本博文介绍了其使用方法。
2)CTR_DRBG随机数发生器,它是基于分组密码函数的确定性随机数产生器,如图(NIST SP800-90中定义起标准算法)。
![开源polarssl加密库使用详解之二:伪随机数发生器(DRBG)_第1张图片](http://img.e-com-net.com/image/info8/37bf0a5538bf427382562d18fcca0c94.jpg)
![开源polarssl加密库使用详解之二:伪随机数发生器(DRBG)_第2张图片](http://img.e-com-net.com/image/info8/3a7dfdf2f43b4d4593058b3e00016167.jpg)
下面介绍polarssl中如何使用CTR-DRBG
int main( int argc, char *argv[] )
{
FILE *f;
int i, k, ret;
ctr_drbg_context ctr_drbg;
entropy_context entropy;
unsigned char buf[1024];
if( argc < 2 )
{
fprintf( stderr, "usage: %s
一般建议使用CTR-DRBG作为主要的随机数发生器。。。。。。。。。。
补充术语:
1)熵(Entropy):在封闭系统中衡量无序、随机或差异性的量度,在信息论中,一个
离散随机变量的熵定义为:
其中的pi是各事件发生的概率。
2)熵源(Entropy Source):不可预测数据流的源。不一定满足均匀分布,熵源包括噪
声源,例如热噪声或者硬盘寻道时间,数字化过程,评估过程,选择性条件化过程和健康
度测试等等。
3)健康度测试(Health Testing):在运行中或者之前测试和验证算法实现工作情况是
否符合预期设计要求。
4)内部状态(Internal State):确定性随机数产生器初始化以后存储在其中的信息集合。
5)时间随机数(Nonce):一个基于时间变化的变量,几乎不可能重复,例如时间戳
等
6)个性化字符串(Personalization String):一个可选的字符串,混合了秘密输入和时
间随机数,用于产生随机数种子。
7)安全强度(Security Strength):一个与破解密码系统需要进行的操作数相关的数字。
在这个标准中,该数字为(112、128、192、256)集合中的一个,需要进行的操作数为
2Security_Strength。
8)种子(Seed):一个字符串用于确定性随机数产生器系统的输入,它决定了确定性
随机数产生器的部分内部状态,它的熵值必须足以满足系统安全强度的要求。