【发布时间】:2017-05-08 03:21:35
【问题描述】:
我正在尝试使用 OpenSSL 编写自定义 RSA 密钥对生成算法。我已经使用PKCS5_PBKDF2_HMAC_SHA1 函数来生成 PRNG 种子,所以我使用这个种子作为 RAND_seed 输入。
不幸的是,每次我使用相同的种子调用RAND_bytes 时,我都会获得不同的随机数,但这不是预期的行为,因为正如How can one securely generate an asymmetric key pair from a short passphrase? 的答案所说,随机数生成器是确定性的(相同的种子相同的输出)。
下面是测试用例。我也声明了常量种子,但生成永远不是确定性的。
unsigned int seed = 0x00beef00;
unsigned int rnum[5];
RAND_seed(&seed, sizeof(seed));
RAND_bytes((unsigned char *)&rnum[0], sizeof(rnum));
哪里出错了?
【问题讨论】:
-
假设您使用默认的
RAND引擎,请查看rand_bytesinmd_rand.c的源代码。另请参阅 Stack Overflow 上的 Making openssl generate deterministic key。简而言之,您必须创建一个 OpenSSLENGINE才能做到这一点。 -
要创建自定义引擎,请参阅 OpenSSL 博客上的 Engine Building Lesson 1: A Minimum Useless Engine 和 Engine Building Lesson 2: An Example MD5 Engine。