应用级伪随机数生成器的使用与管理
1. 流密码作为生成器
流密码本身就是伪随机数生成器,其密钥(以及合适情况下的初始化向量)构成种子。若计划使用流密码作为生成器,强烈推荐 SNOW 2.0 密码。不过,由于 RC4 密码广受欢迎,即便它不如 SNOW 表现出色,人们可能仍会优先选择它。
RC4 流密码可作为可接受的伪随机数生成器,若不频繁重新密钥,其速度极快,这在需要大量随机数时尤为有用。但如果为避免回溯攻击而频繁重新密钥,基于块密码的方法可能更快,需进行测试以确定。
使用标准 API 正确使用 RC4 需要一些额外操作:
- 大多数 API 需要传入待加密的数据,而我们仅需要原始密钥流,因此必须始终传入零值。
- 要确保以安全的方式使用 RC4。
若 RC4 实现采用特定 API,将其作为伪随机数生成器进行播种与对算法进行密钥设置相同,RC4 可接受最长 256 字节的密钥。由于 RC4 的局限性,应丢弃前 256 字节的输出。
以下是将 RC4 绑定到 spc_rand()
函数的代码:
/* NOTE: This code should be augmented to reseed after each request
/* for pseudo-random data, as discussed in Recipe 11.6
/*
#ifndef WIN32
#include <pthread.h>
static pthread_mutex_t spc_rc4rng_mutex = PTHREAD_M