【发布时间】:2021-04-07 13:19:25
【问题描述】:
执行此操作的 OpenSSL 控制台命令是:
openssl cms -encrypt -aes-256-cbc -in plain-original.txt -outform der -out encrypted.p7 -recip certificate.pem -keyopt ecdh_kdf_md:sha256
假设 certificate.pem 是 EC 类型。
我正在尝试使用 CMS_encrypt 函数(这适用于 RSA)
STACK_OF(X509)* stackOfX509 = sk_X509_new_null();
X509* x509Cert = d2i_X509(NULL, &(cert->buff), cert->buffLen);
sk_X509_push(stackOfX509, x509Cert);
CMS_ContentInfo* pkcs7EnvelopedData = CMS_ContentInfo_new();
BIO* dataBIOToEncrypt = BIO_new_mem_buf(data2Encrypt->buff, data2Encrypt->buffLen);
pkcs7EnvelopedData = CMS_encrypt(stackOfX509, dataBIOToEncrypt, cipher, CMS_BINARY);
这当然行不通。我不知道如何通过keyopt。我现在正在寻找这个。找到即EVP_PKEY_CTX_ctrl_str(ctx, "ecdh_kdf_md", "sha256");,但这需要我拥有EVP_PKEY_CTX。
在我开始挖掘 OpenSSL 源代码以确定他们是如何做到的之前,也许有人可以给我任何提示?
--- 更新 ---
好的,我现在知道我的第一次尝试确实过于简单了。我希望越来越近:
pkcs7EnvelopedData = CMS_encrypt(NULL, dataBIOToEncrypt, cipher, CMS_BINARY | CMS_PARTIAL);
CMS_RecipientInfo *ri = CMS_add1_recipient_cert(pkcs7EnvelopedData, x509Cert, CMS_BINARY | CMS_PARTIAL | CMS_KEY_PARAM);
EVP_PKEY_CTX *pctx = CMS_RecipientInfo_get0_pkey_ctx(ri);
EVP_PKEY_CTX_ctrl_str(pctx, "ecdh_kdf_md", "sha256");
EVP_CIPHER_CTX *wctx = CMS_RecipientInfo_kari_get0_ctx(ri);
EVP_EncryptInit_ex(wctx, EVP_aes_256_wrap(), NULL, NULL, NULL);
CMS_final(pkcs7EnvelopedData, dataBIOToEncrypt, NULL, CMS_BINARY | CMS_PARTIAL);
【问题讨论】:
标签: c openssl elliptic-curve pkcs#7