首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使OpenSSL生成确定性密钥

使OpenSSL生成确定性密钥
EN

Stack Overflow用户
提问于 2014-03-31 10:40:53
回答 2查看 3.6K关注 0票数 6

我试图让openssl生成确定性的私有和公共RSA密钥对。我的想法是,我用一些设备相关数据的散列填充我的种子,并使用它作为种子。但是种子RAND似乎不起作用,钥匙仍然是随机的。

出于各种原因,我不想只生成一次密钥,然后存储它,我只希望私钥存在于内存中。

代码语言:javascript
复制
RAND_seed(seedbuf, sizeof(seedbuf));

bne = BN_new();
if (1 != BN_set_word(bne,e)) {
    goto free_stuff;
}

keypair = RSA_new();
if(1 != RSA_generate_key_ex(keypair, KEY_LENGTH, bne, NULL)) {
    goto free_stuff;
}

因此,基本上我希望"RSA_generate_key_ex“函数返回相同的密钥对,每次都是相同的输入。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-01 02:07:31

让openssl生成确定性密钥..。

我不相信你能当机立断。默认情况下,OpenSSL使用md_rand,并且自动种子本身。调用rand_seed内部调用rand_add,这会增加状态(而不是丢弃/替换状态)。您可以在md_rand中找到crypto/rand/md_rand.c的源代码。

如果您在启用FIPS的情况下进行构建,则会从NIST的SP800-90中生成确定性随机位生成器。然而,我似乎记得,它们的操作方式与md_rand类似。也就是说,您可以添加到内部状态,但您不能真正控制它。您可以在crypto/rand/rand_lib.c中找到源代码。

我觉得你有一个选择。您可以创建自己的my_rand。基于块密码或散列。在启动时,用设备相关的数据为它添加种子,然后返回确定性字节。

现在,要让像RSA_generate_key_ex这样的函数使用PRNG,必须将其打包到OpenSSL ENGINE中。OpenSSL的理查德·莱维特( Richard )在第一课:最低限度的无用引擎第2课: MD5引擎示例的OpenSSL博客上都有一个不错的两系列博客。

一旦你用引擎来包装它,你就可以像这样使用它。使用ENGINE_METHOD_RAND设置随机方法之后,您将使用算法。

代码语言:javascript
复制
ENGINE* eng = ENGINE_by_id("my_rand");
unsigned long err = ERR_get_error();

if(NULL == eng) {
    fprintf(stderr, "ENGINE_by_id failed, err = 0x%lx\n", err);
    abort(); /* failed */
}

int rc = ENGINE_init(eng);
err = ERR_get_error();

if(0 == rc) {
    fprintf(stderr, "ENGINE_init failed, err = 0x%lx\n", err);
    abort(); /* failed */
}

rc = ENGINE_set_default(eng, ENGINE_METHOD_RAND);
err = ERR_get_error();

if(0 == rc) {
    fprintf(stderr, "ENGINE_set_default failed, err = 0x%lx\n", err);
    abort(); /* failed */
}

如果要查看ENGINE实现,请查看crypto/engine/eng_rdrand.c中的rdrand引擎。发动机没有什么东西,而且很容易复制/粘贴。确保将新引擎添加到Makefile中的crypto/engine/Makefile中。

票数 6
EN

Stack Overflow用户

发布于 2019-12-13 20:04:48

如果您正在寻找一种生成不一定使用OpenSSL的确定性键的方法,GnuTLS可能会提供帮助:

代码语言:javascript
复制
certtool --generate-privkey --outfile privkey.pem --key-type=rsa --sec-param=high --seed=0000000000000000000000000000000000000000000000000000000000000000

使用--seed,至少在当前版本中,意味着使用--provable算法生成(FIPSPUB186-4)。

生成的privkey.pem将采用RSA格式,您可以使用以下命令将其转换为原始的RSA格式:

代码语言:javascript
复制
certtool --to-rsa --load-privkey privkey.pem --outfile privkey.key

然后,如果需要,可以从任一格式的密钥中生成一个自签名证书:

代码语言:javascript
复制
certtool --generate-self-signed --load-privkey privkey.key --outfile signed.crt --template cert.cfg

如果您希望使此步骤也具有确定性,或者避免每次运行该命令时回答问题,请将--template cert.cfg参数添加到最后一个命令中。使生成具有确定性的cert.cfg文件的最小内容是:

代码语言:javascript
复制
serial = 1
activation_date = "2019-01-01 00:00:00 UTC"
expiration_date = "2029-01-01 00:00:00 UTC"
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22759465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档