OpenSSL BIGNUM BN_mod_exp问题

时间:2012-09-04 18:07:18

标签: cryptography openssl bignum

我在使用OpenSSL的BIGNUM库时遇到了“正确答案”的问题。我使用的是OpenSSL 1.0.1c(2012年5月,标准Mint回购中提供的最新软件包)。

我正在使用BIGNUM进行使用有限字段(又名Galois字段)的加密项目。基本上我有一个大素数(q)和一个安全素数(p,其中p = 2q + 1)。我的字段是q阶的Fp。

我需要生成一个“g”。我发现这样做的最简单方法是选择随机的“h”(1

当我在纸上做任何合理的小数字时,这是正确的。但是,当我使用OpenSSL和大数字素数时,它不起作用!当我测试我的g ^ q mod p == 1的结果时,它经常使用BN_is_one()失败。如果我打印出值,它总是一个很大的无关素数。

发生了什么事?我不确定这里发生了什么,或者我是否误解了什么。

我的代码片段如下:

BN_generate_prime(q, KEYSIZE - 1, 0, 0, 0, 0, 0); //generate "q"

// Calculate "p" = 2q + 1 
BN_lshift1(p, q);
BN_add(p, p, one);  //one = BN_one()

// 1: gExp = (p-1)/q
// 2: h =>   1 < h < (p-1)
// 3: g = h^gExp mod p
BN_div(gExp, NULL, pMinusOne, q, ctx);      // (1)
BN_pseudo_rand_range(h, pMinusOne);         // (2)
BN_mod_exp(g, h, gExp, p, ctx);             // (3)

BN_mod_exp(temp, g, q, p, ctx); // g^q mod p = 1, or it should

1 个答案:

答案 0 :(得分:1)

当您在自己的代码段中计算时,p不一定是素数,它只是一个2*q+1形式且q素数的数字。对于q的许多小值,此p恰好是素数,但这大部分是巧合,如果您使用BN_is_prime进行检查,则可能会找到p s {}生成不通过测试。

相反,通过设置p的{​​{1}}参数直接生成safe,然后通过右移计算BN_generate_prime,就像q素数一样是你需要的形式,砍掉最低位给你一个素数safe