对称加密的密钥及非对称加密的私钥,通常是随机生成的比特串。在公钥加密、数字签名计算过程中,如果使用概率性非对称算法(比如椭圆曲线算法),将会用到随机数。要生成随机数,可以使用物理噪声源。在对安全性要求较高的环境中,随机数一般使用特殊硬件生成。当没有可用来生成随机数的硬件时,如果能够进行人机交互,可以采集用户的随意行为轨迹数据(比如敲击键盘的时间间隔、鼠标随意移动的轨迹)作为随机源。当随机源一次只能生成长度有限的随机字节流,并且每次访问随机源后都必须等待很久才能进行下一次访问时,可以使用“确定性随机比特生成器”(Deterministic Random Bit Generator,缩写为DRBG)。DRBG 的优点是:只要将长度有限的随机数据作为“种子”(Seed)输入到 DRBG 中,它就能够输出比较长的伪随机字节流。
在 NIST SP 800-90A 《Recommendation for Random Number Generation Using Deterministic Random Bit Generators》Revision 1 文档(下载网址:https://csrc.nist.gov/publications/detail/sp/800-90a/rev-1/final)中,给出了以下三种 DRBG 的构造方法:Hash_DRBG,HMAC_DRBG 和 CTR_DRBG。其中 Hash_DRBG 是基于杂凑函数构造的确定性随机比特生成器,它在生成随机比特流的过程中,要进行大整数的模加运算,效率不够高。在追求高效率的环境中,一般使用 CTR_DRBG。
根据 NIST SP 800-90A Rev.1 文档,我通过调用 OpenSSL 1.1.1版中提供的大整数模运算函数和杂凑函数,编程实现了基于杂凑函数的DRBG,代码已发布在以下网址:https://github.com/greendow/Hash-DRBG