【问题标题】:Segfault on openssl RSA_public_encrypt() in CC中openssl RSA_public_encrypt()的段错误
【发布时间】:2018-11-13 17:59:52
【问题描述】:

我一直在尝试使用 openssl 的 RSA_public_encrypt 加密测试字符串,但在我尝试运行它的所有方式中都会导致段错误。

我尝试使用 BIO 检查我从 pem 文件中读取的 RSA 密钥是否有效,并且它以正确的密钥和指数大小正确返回了公钥。

我最初尝试使用 PEM_read_bio_RSA_PUBKEY,但没有成功。我不完全确定这和PEM_read_bio_RSAPublicKey 之间的区别,所以如果有人可以对此有所了解。

另外,在尝试BIO 之前,我使用了常规的 FILE 结构和与之对应的函数,它一直给我段错误,我也无法检查是否加载了正确的 RSA 密钥。不确定这是否相关。

#include <stdio.h>
#include <string.h>
#include <openssl/pem.h>
#include <openssl/rsa.h>
#include <openssl/conf.h>

int main()
{

  RSA *rsa;
  rsa = RSA_new();
  BIO *bp_public = NULL;
  RSA *pubkey;
  bp_public = BIO_new_file("public.pem", "rt");
  pubkey = PEM_read_bio_RSAPublicKey(bp_public, &rsa, NULL, NULL);

  BIO * keybio = BIO_new(BIO_s_mem());
  RSA_print(keybio, rsa, 0);
  char buffer [2048];

  while (BIO_read (keybio, buffer, 2048) > 0)
    {
      printf("%s", buffer);
    }
  BIO_free(bp_public);
  if (pubkey == NULL || rsa == NULL)
    printf("Something went wrong");

  char msg[] = "Hello";
  unsigned char * encrypted = NULL;

  RSA_public_encrypt(5, (unsigned char *)msg, encrypted, rsa, RSA_PKCS1_OAEP_PADDING);

  printf("Here: %s", encrypted);
}

另外,我尝试同时使用 pubkeyrsa 作为键,但没有一个起作用。

我确信我遗漏了一些非常明显的东西,但我已经花了几个小时的时间,现在我有点迷失在 openssl 文档中。

感谢您的帮助!

无关说明:如果我使用RSA_private_encrypt(),加密文本返回null

【问题讨论】:

  • @AnttiHaapala 呃,对不起。我在复制它们时错过了它们,有一个未使用的功能我不得不省略并且错过了过程中的包含。谢谢你提醒我。 :)
  • BIO_read 似乎无法使用%s 打印它...
  • @AnttiHaapala 好吧,这似乎对我有用。这就是我得到的:pasted.co/682d8a0d
  • 你认为空指针如何作用于RSA_public_encrypt的参数
  • 哦,看起来像在做unsigned char encrypted[RSA_size(rsa)];而不是把它设置为NULL实际上加密了文本。

标签: c openssl rsa


【解决方案1】:

来自RSA_public_encrypt

int RSA_public_encrypt(int flen, unsigned char *from,
   unsigned char *to, RSA *rsa, int padding);

RSA_public_encrypt() 使用公钥rsa 加密来自(通常是会话密钥)的flen 字节,并将密文存储在to 中。 to 必须指向 RSA_size(rsa) 字节的内存。

但是你有 to 参数作为

unsigned char * encrypted = NULL;

也许你应该为它分配RSA_size(rsa)字节的内存:

unsigned char *encrypted = malloc(RSA_size(rsa));

【讨论】:

  • 是的,这就是我自己尝试过的。谢谢,我将通过使用公钥解密来验证输出。
  • @dedipyaman 您也不想用%s 打印加密字符串,因为它是二进制数据,而不是字符串。相反,您希望遍历字节并单独打印每个字节。
【解决方案2】:

检查您是否正确管理各种 Openssl 资源。很多时候,可以释放的内容会受到限制。尽早释放资源可能会导致库中其他地方出现段错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2016-02-03
    • 1970-01-01
    • 2019-05-11
    • 2011-02-01
    相关资源
    最近更新 更多