如何使用RSA加密数据,SHA-256作为哈希函数,MGF1作为掩码生成函数?

我正在做一些密码学实验。 现在我有接收器的公钥,我想加密一些数据并传递给接收器。

我想使用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作为散列函数。 我该怎么做 ?

OpenSSL使用PKCS #1 v2.0定义,因此EME-OAEP的默认值为SHA-1MGF1 。 如果您需要使用SHA-256 ,则需要自己进行编码。 但这并不十分困难,详见PKCS#1 v2.2 PDF第18页。

以下摘录允许将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()); 

在最新版本的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哈希。

使用较新的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 doc: https : //aws.amazon.com/es/premiumsupport/knowledge-center/invalidciphertext-kms/