我正在做一些密码学实验。现在我有接收器的公钥,我想加密一些数据并传递给接收器。
我想使用RSAES-OAEP算法。使用SHA-256作为哈希函数,MGF1作为掩码生成函数。
我想用openssl做这件事。我找到了一个带有此函数的函数RSA_public_encrypt()
,我们可以指定填充。其中一个填充选项是
RSA_PKCS1_OAEP_PADDING
EME-OAEP,如PKCS#1 v2.0中定义的SHA-1,MGF1。
他们正在使用sha-1。
我想重新配置函数以使用SHA256作为散列函数和MGF1作为散列函数。我该怎么办?
答案 0 :(得分:3)
OpenSSL使用PKCS #1 v2.0
中的定义,因此EME-OAEP
的默认值为SHA-1
和MGF1
。如果您需要使用SHA-256
,则需要自行进行编码。但这并不十分困难,详见PKCS #1 v2.2 PDF。
答案 1 :(得分:3)
以下摘录允许将OAEP与SHA256一起用于MGF和散列函数。使用OpenSSL 1.0.2L进行测试
int flags = CMS_BINARY | CMS_PARTIAL | CMS_KEY_PARAM;
cms = CMS_encrypt(NULL, in, cipher, flags)
ri = CMS_add1_recipient_cert(cms, cert, flags);
pctx = CMS_RecipientInfo_get0_pkey_ctx(ri);
EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_OAEP_PADDING);
EVP_PKEY_CTX_set_rsa_oaep_md(pctx, EVP_sha256());
EVP_PKEY_CTX_set_rsa_mgf1_md(pctx, EVP_sha256());
答案 2 :(得分:1)
在最新版本的Openssl(1.0.2k)中,API的签名已更改,这为我们提供了更大的灵活性。请在下面找到详细信息,
int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char * to,int tlen, const unsigned char * from,int flen, int num,const unsigned char * param, int plen, const EVP_MD * md , const EVP_MD * mgf1md)
您可以使用此传递EVP_MD结构来调用SHA-256哈希。
答案 3 :(得分:0)
使用更新的OpenSSL 1.0.2+,您可以使用以下命令进行操作:
openssl pkeyutl -in PlaintextKeyMaterial.bin -out EncryptedKeyMaterial.bin -inkey PublicKey.bin -keyform DER -pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
这取自此处的AWS KMS文档:https://aws.amazon.com/es/premiumsupport/knowledge-center/invalidciphertext-kms/
答案 4 :(得分:0)
上面提到的PKCS#1文档是更数学的,并且没有给出编码示例,而CMS答案是针对ASN.1 / SMIME数据的,与提出的问题(与如何替换{{ 1}}处理简单的二进制/文本数据。我花了一整天的时间进行反复试验和在线搜索,以找到答案,最终通过查看“ openssl pkeyutl”的源代码获得了答案(使用OpenSSL的EVP API)-一旦我发现它,并不困难。
在我的情况下,我打算使用私钥替换RSA_public_encrypt()
进行解密,这就是这样做的方法-基于此,将RSA_public_encrypt()替换项放在一起应该很容易:>
RSA_private_decrypt()
您可以使用ERR_get_error()为失败案例添加错误处理。