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