2012-09-04 34 views
1

我有一些问题使用OpenSSL的BIGNUM库提供“正确答案”。我正在使用OpenSSL 1.0.1c(2012年5月,标准Mint仓库中提供的最新软件包)。OpenSSL BIGNUM BN_mod_exp问题

我使用BIGNUMs作为使用有限域(又名伽罗瓦域)的密码学项目。基本上我有一个大素数(q)和一个安全素数(p,其中p = 2q + 1)。我的领域是q阶的Fp。

我需要生成一个“g”。我发现最简单的方法是选择一个随机的“h”(1 < h < p-1),然后做g = h ^((p-1)/ q)mod p。随着“克”我摆脱了这一点,我应该能够通过做g^q mod p = 1来证明它是在FF中。

当我对纸上的任何合理的小数字执行此操作时,真正。但是,当我使用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

当你在你的代码片段计算它,p不一定素,它只是一个数字,它是形式2*q+1q素。对于q的很多小数值,这个p碰巧是主要的,但这大多是巧合,如果您使用BN_is_prime进行检查,您可能会发现您生成的p未通过测试。

相反,通过设置BN_generate_primesafe参数,然后通过右移计算q,与safe的主要将是你所需要的形式,并且斩去最低位给你的黄金q直接生成p

+0

哦,男人,你是完全正确的。我甚至没有想到这个!看起来我需要做一些关于“安全”素数的阅读(以及BN_generate_prime的'safe'参数的奖励。谢谢! –