【问题标题】:OpenSSL BIGNUM BN_mod_exp problemsOpenSSL BIGNUM BN_mod_exp 问题
【发布时间】:2012-09-04 18:07:17
【问题描述】:

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

我将 BIGNUM 用于使用有限域(也称为伽罗瓦域)的密码学项目。基本上我有一个大素数 (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

【问题讨论】:

    标签: cryptography openssl bignum


    【解决方案1】:

    当您在 sn-p 中计算它时,p 不一定是素数,它只是一个形式为 2*q+1q 素数的数字。对于q 的许多小值,这个p 恰好是素数,但这主要是巧合,如果您检查BN_is_prime,您可能会发现您生成的ps 没有通过测试。

    相反,通过设置BN_generate_primesafe 参数直接生成p,然后通过右移计算q,与safe 一样,素数将是您需要的形式,并切掉最低位给你一个素数q

    【讨论】:

    • 天哪,你完全正确。我什至没有考虑过!看来我需要阅读一些关于“安全”素数的内容(以及 BN_generate_prime 的 safe 参数的奖励。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多