为 RSA OpenSSL 设置特定密钥

Posted

技术标签:

【中文标题】为 RSA OpenSSL 设置特定密钥【英文标题】:Set up a specific key for RSA OpenSSL 【发布时间】:2018-04-20 08:49:35 【问题描述】:

我目前没有尝试为 RSA 实现实现一些测试向量,我想通过 OpenSSL v1.1.0f 实现来测试它们。但是,当我尝试设置密钥(对于 e、n p、q 或 d)时,出现以下错误:

erreur:解引用指向不完整类型« RSA alias struct rsa_st »的指针

我的代码如下:

int rsa_encrypt(byte *in, size_t in_len, byte *out, const char *n, const char *e, char padding)
    int err = -1;

    RSA *keys = NULL;
    keys = RSA_new();

    BN_hex2bn(&keys->n, n); // error here
    BN_hex2bn(&keys->e, e); // and here

    out = malloc(RSA_size(keys));

    if (padding == OAEP ) 
        err = RSA_public_encrypt(in_len, in, out, keys, RSA_PKCS1_OAEP_PADDING);
    
    else if (padding == v1_5) 
        err = RSA_public_encrypt(in_len, in, out, keys, RSA_PKCS1_PADDING);
    

    RSA_free(keys);

    return err;

其中 n 和 e 是一个字符串,以十六进制表示我的参数。

我找了对应RSA类型的结构,发现this。 我不明白为什么我不能设置 n 和 e...有什么想法吗?

【问题讨论】:

来自您链接的文档:“应用程序通常应避免直接使用 RSA 结构元素,而是使用 API 函数来查询或修改密钥”。您使用的实现可能会隐藏 struct 内容,因为它们使用不同的字段。 我看到了,但我认为这主要是出于安全原因,这不是我对测试向量的关注的一部分。你知道他们指的是哪个 API 吗? 你是否包含了 openssl/rsa.h ? @Pras 是的,openssl/rsa.h 和 openssl/bn.h 您使用的是 1.0.2 或更低版本,还是当前的 1.1.0(尽管 1.1.1 处于测试阶段,可能很快会发布)? 1.1.0 更改了 许多 以前公开的 API 结构并使它们不透明,包括 RSA = struct rsa_st。另请注意,OpenSSL 使用 CRT 形式的 RSA 私钥,它不仅需要 n、e、d、p、q,还需要 dmod(p-1)、dmod(q-1) 和 qinvmodp。您是否有某些原因不只是像其他人一样创建、存储和使用 DER(甚至 PEM)密钥 blob? 【参考方案1】:

OpenSSL 结构在 1.1.x 中是不透明的,你不能谈论它们的字段。除此之外,它还允许在服务版本期间添加新的结构字段,因为调用者代码无法知道字段偏移量。

对于 1.1.x,你需要做一些类似于

BN* bnN = NULL;
BN* bnE = NULL;
RSA* keys = RSA_new();

BN_hex2bn(&bnN, n);
BN_hex2bn(&bnE, e);
RSA_set0_key(keys, bnN, bnE, NULL);

...
RSA_free(keys);
// do not free bnN or bnE, they were freed by RSA_free.

请注意,我遗漏了必要的错误检查。

【讨论】:

谢谢,这正是我想要的!我编辑了您的消息以进行一些小的更正(例如类型名称)。

以上是关于为 RSA OpenSSL 设置特定密钥的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL笔记-生成RSA公私密钥以PEM格式到char*中(非保存为文件)

OpenSSL笔记-生成RSA公私密钥以PEM格式到char*中(非保存为文件)

Windows下RSA密钥生成工具openssl

OpenSSL之RSA用法

如何使用 sha512 为 JWT 生成 RSA 密钥?

php openssl生成的rsa密钥给android和ios使用注意哪些问题