gpt4 book ai didi

c++ - 使用 openssl c/c++ API 解密失败

转载 作者:行者123 更新时间:2023-11-30 05:04:39 28 4
gpt4 key购买 nike

我从命令行使用 openssl 创建了一个文件。比方说:

echo 'foobar' | openssl enc -aes-128-cbc -e -pass pass:testing > sample

我可以解密这个做

cat sample | openssl enc -aes-128-cbc -d -pass pass:testing

这很好用。

现在我想使用 openssl c/c++ API 解密该文件,但我不太正确。我正在尝试像这样解密

#include <fstream>
#include <memory>
#include <string>

#include <openssl/err.h>
#include <openssl/evp.h>

using EVP_CIPHER_CTX_free_ptr = std::unique_ptr<EVP_CIPHER_CTX, decltype(&::EVP_CIPHER_CTX_free)>;

int main(int argc, char* argv[])
{

ERR_load_crypto_strings();

EVP_add_cipher(EVP_aes_128_cbc());

std::string l_key{"testing"};
std::string l_ctext{};

std::ifstream l_file("sample", std::ios::binary | std::ios::in | std::ios::ate);

if(l_file.is_open())
{
std::streampos l_size = l_file.tellg();
char * lp_buffer = new char[l_size];

l_file.seekg(0, std::ios::beg);
l_file.read(lp_buffer, l_size);
l_ctext.append(lp_buffer, l_size);

delete lp_buffer;
l_file.close();
}

std::string l_rtext;

EVP_CIPHER_CTX_free_ptr ctx(EVP_CIPHER_CTX_new(), ::EVP_CIPHER_CTX_free);

if(1 != EVP_DecryptInit_ex(ctx.get(), EVP_aes_128_cbc(), NULL,
(const unsigned char*)l_key.c_str(), NULL));
ERR_print_errors_fp(stdout);

int l_len;

if(1 != EVP_DecryptUpdate(ctx.get(), (unsigned char*)&l_rtext[0], &l_len,
(const unsigned char*)l_ctext.data(),
l_ctext.size()))
ERR_print_errors_fp(stdout);

if(1 != EVP_DecryptFinal_ex(ctx.get(), (unsigned char*)&l_rtext[0] + l_len,
&l_len))
ERR_print_errors_fp(stdout);

ERR_free_strings();

exit(0);
}

然而,最后一次调用 EVP_DecryptFinal_ex 失败了

140559955420968:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:596:

此代码的大部分基于 openssl API 附带的示例。我究竟做错了什么?我在 EVP_DecryptInit_ex 中将 IV 设置为 NULL,因为据我所知,只要我不多次使用 key ,这是可以接受的。

所有这些都在装有 GCC 的 Fedora 机器上

最佳答案

我有点想通了我做错了什么。

  • 命令行“openssl enc”命令使用默认盐,我上面的代码没有寻找它。因此(而不是尝试使用“-nosalt”选项)我从加密字符串中删除了前 16 个字节,并将后 8 个字节用作盐。
  • 我将密码作为“ key ”提供给 EVP 方法。似乎“openssl enc”没有这样做,所以需要使用盐和密码来创建 key 和 IV(而不是使用我所做的 NULL)。
  • 上面的代码中有一个错误,l_rtext 需要一个 resize() 来反射(reflect)添加了字符的事实。

关于c++ - 使用 openssl c/c++ API 解密失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48768226/

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