【问题标题】:OpenSSL AES Segmentation Fault on Encrypt Update加密更新时出现 OpenSSL AES 分段错误
【发布时间】:2020-08-28 15:41:15
【问题描述】:

我有设置大小的字符串并尝试对其进行 AES 加密,但我在EVP_EncryptUpdate 收到分段错误

size_t dec_len = 20;
char *dec = malloc(dec_len + 1);

//Fill dec
...
//Encrypt

EVP_CIPHER_CTX *ctx;
ctx = EVP_CIPHER_CTX_new();
unsigned char *key = (unsigned char *)" no ";
EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, &key, NULL);
EVP_CIPHER_CTX_set_padding(ctx, 0);
unsigned char *ciphertext;
int ciphertext_len;
EVP_EncryptUpdate(ctx, ciphertext, &ciphertext_len, dec, dec_len);
EVP_EncryptFinal_ex(ctx, ciphertext + ciphertext_len, &ciphertext_len);
EVP_CIPHER_CTX_free(ctx);

我不知道是什么原因造成的。谢谢。

【问题讨论】:

  • 你告诉 OpenSSL 在哪里存储密文?
  • " no " 是实际密钥的替代品吗,我认为它实际上是正确的长度并正确生成?如果您只是将随机 cstrings 交给这个(例如,密码而不是正确的 AES 密钥),我不希望它起作用。鉴于您传递了错误的类型,我也希望收到警告(如下面的 Andrew 所述)。您是否确保解决所有警告?
  • 您似乎也将未初始化的指针作为密文传递(这可能也是 user253751 所要求的)。那只是写入随机存储器。你的意思是为密文分配一个缓冲区吗? (同样,我希望编译器会警告您这个 used-before-assignment 错误。)我将从如何使用这些函数的 OpenSSL 示例开始。 openssl.org/docs/man1.1.1/man3/EVP_EncryptInit_ex.html
  • 通过分配密文解决。

标签: c encryption openssl aes


【解决方案1】:

the OpenSSL documentation,被声明为

int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
    ENGINE *impl, const unsigned char *key, const unsigned char *iv);

注意key 被声明为const unsigned char *key

但是你的代码是

unsigned char *key = (unsigned char *)" no ";
EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, &key, NULL);

您将key 指针的地址 传递给函数-unsigned char ** 而不是const unsigned char *。你要传递字符串的地址,也就是key 指向的地址:

const unsigned char *key = (const unsigned char *)" no ";
EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, NULL);

【讨论】:

  • 感谢您的建议,但它没有做任何事情。它仍然在EVP_EncryptUpdate 出现段错误
【解决方案2】:

通过分配密文变量来解决。

【讨论】:

  • 确保您传入的密钥大小正确,否则无法解密。
猜你喜欢
  • 1970-01-01
  • 2021-08-05
  • 2018-09-09
  • 1970-01-01
  • 2019-04-14
  • 2015-01-29
  • 1970-01-01
  • 2017-05-01
相关资源
最近更新 更多