gpt4 book ai didi

c++ - 在 openssl 中使用 PKCS7_decrypt() 解密 char*

转载 作者:太空宇宙 更新时间:2023-11-04 14:16:02 25 4
gpt4 key购买 nike

我想在 openSSL 中使用 PKCS7_encrypt()PKCS7_decrypt() 函数进行加密和解密。我在 openSSL Demo 中使用了示例。我想要做的是以 char* 格式加密消息并使用该 char* 解密。我不想读取和写入文件。这是要加密的代码,它可以正常工作并且没有问题:

in = BIO_new_file("encr.txt", "r");
if (!in)
return 0;

/* encrypt content */
p7 = PKCS7_encrypt(recips, in, EVP_des_ede3_cbc(), flags);
if (!p7)
return 0;

char* chEnc = new char[1000];

BIO* memorybio = BIO_new(BIO_s_mem());
BIO* base64bio = BIO_new(BIO_f_base64());
BIO* outbio = BIO_push(base64bio, memorybio);

/* Copy PKCS#7 */
long ll = i2d_PKCS7_bio(outbio, p7);
BIO_flush(outbio);
BIO_set_flags(memorybio, BIO_FLAGS_MEM_RDONLY);
BIO_get_mem_data(memorybio, &chEnc);
cout << chEnc << "\n";

现在,当我想反向解密 char* chEnc 时,我做了如下操作:

BIO *in = NULL, *out = NULL, *tbio = NULL;
X509 *rcert = NULL;
EVP_PKEY *rkey = NULL;
PKCS7 *p7 = NULL;
int ret = 1;

OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();

/* Read in recipient certificate and private key */
tbio = BIO_new_file("signer.pem", "r");

if (!tbio)
return 0;

rcert = PEM_read_bio_X509(tbio, NULL, 0, NULL);
BIO_reset(tbio);
rkey = PEM_read_bio_PrivateKey(tbio, NULL, 0, NULL);
if (!rcert || !rkey)
return 0;

BIO* memorybio = BIO_new(BIO_s_mem());
int iLength = BIO_puts(memorybio, chEnc);

BIO* base64bio = BIO_new(BIO_f_base64());
BIO* inbio = BIO_push(base64bio, memorybio);

/* Copy PKCS#7 */
BIO_flush(inbio);
BIO_set_flags(inbio, BIO_FLAGS_MEM_RDONLY);
p7 = d2i_PKCS7_bio(inbio, &p7);
if (!PKCS7_decrypt(p7, rkey, rcert, out, 0))
return 0;

ret = 0;

if (ret) {
fprintf(stderr, "Error Signing Data\n");
ERR_print_errors_fp(stderr);
}

if (p7)
PKCS7_free(p7);
if (rcert)
X509_free(rcert);
if (rkey)
EVP_PKEY_free(rkey);

if (in)
BIO_free(in);
if (out)
BIO_free(out);
if (tbio)
BIO_free(tbio);

return ret;

问题是 PKCS7_decrypt 不起作用,它不会解密到 out 变量中。在行 if (!PKCS7_decrypt(p7, rkey, rcert, out, 0)) return 0; 之后,它从函数返回。解密程序是否正确?我应该使用 openSSL 的其他 API 来转换什么的吗?

期待您的建议和意见。

谢谢

最佳答案

PKCS7_decrypt(p7, rkey, rcert, out, 0) 失败,因为您传递给例程的 BIO“out”是空指针。

如果您不想将输出写入文件,请尝试传递内存 BIO:

BIO *out = BIO_new(BIO_s_mem());

然后你可以直接从out访问解密后的数据,一旦你用完了就可以销毁它。

关于c++ - 在 openssl 中使用 PKCS7_decrypt() 解密 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11311831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com