使用 OpenSSL 的具有 SHA -256 密钥大小 2048 位的 RSA-OAEP

Posted

技术标签:

【中文标题】使用 OpenSSL 的具有 SHA -256 密钥大小 2048 位的 RSA-OAEP【英文标题】:RSA-OAEP with SHA -256 key size 2048 bits using OpenSSL 【发布时间】:2017-07-11 04:34:50 【问题描述】:

我正在尝试解决与 How to encrypt data using RSA, with SHA-256 as hash function and MGF1 as mask generating function? 完全相同的用例,但我需要更清楚地说明这一点。

上述查询是在 2013 年提出的。当时 OpenSSL 仅支持 SHA1 哈希(硬编码)用于 OAEP 填充。在最新的 OpenSSL (1.0.2k) 中,我可以看到这是通过使用以下 API 解决的:

int RSA_padding_add_PKCS1_OAEP_mgf1(unsigned char *to, int tlen,
                                    const unsigned char *from, int flen,
                                    const unsigned char *param, int plen,
                                    const EVP_MD *md, const EVP_MD mgf1md)

RSA_public_encrypt() 不采用EVP_MD 结构作为参数我不知道如何指定它。

如何使用掩码生成功能在RSA_public_encrypt() 中调用 SHA-256 模式?

【问题讨论】:

这个有什么答案吗?请分享。 这能回答你的问题吗? How to encrypt data using RSA, with SHA-256 as hash function and MGF1 as mask generating function? 【参考方案1】:

RSA_public_encrypt(...) 已弃用;应该改用EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, ...)。

为作为第一个参数传递给EVP_PKEY_encrypt的上下文配置填充、掩码生成函数和其他参数:

    EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
    if (evp_key == NULL) 
        // handle error
    

    EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(evp_key, NULL);
    if (ctx == NULL) 
        // handle error
    

    if (EVP_PKEY_encrypt_init(ctx) <= 0) 
        // handle error
    

    if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING) <= 0) 
        // handle error
    
    if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, EVP_sha256()) <= 0) 
        // handle error
    
    if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, EVP_sha256()) <= 0) 
        // handle error
    

    if (EVP_PKEY_encrypt(ctx, encrypted, &outlen, data, len) <= 0) 
        // handle error
    

【讨论】:

以上是关于使用 OpenSSL 的具有 SHA -256 密钥大小 2048 位的 RSA-OAEP的主要内容,如果未能解决你的问题,请参考以下文章

Centos7 编译安装 Openssl 1.1.1 支持国密标准

Emscripten 编译错误:“'openssl/sha.h' 文件未找到”

openssl 加解密以及国密算法

OpenSSl

OpenSSl

网站开启https后加密协议始终是TLS1.0如何配置成TLS1.2?