在C中的openssl RSA_public_encrypt()上出现段错误

时间:2018-11-13 17:59:53

标签: c openssl rsa

我一直在尝试使用openssl的RSA_public_encrypt对测试字符串进行加密,但是以我尝试运行它的所有方式导致segfault。

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

我最初尝试使用PEM_read_bio_RSA_PUBKEY,但没有成功。我不确定PEM_read_bio_RSAPublicKeyBIO之间的区别,因此是否有人可以对此有所了解。

另外,在尝试#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); } 之前,我使用了常规的FILE结构和与其对应的功能,并且该结构不断给我带来段错误,并且我也无法检查是否已加载了正确的RSA密钥。不确定是否相关。

pubkey

此外,我尝试同时使用rsaRSA_private_encrypt()作为密钥,但均无用。

我确定我确实遗漏了一些明显的东西,但是我花了几个小时来解决这个问题,现在我有点迷失在openssl文档中。

感谢您的帮助!

注意事项:如果我使用def NewMonth(x): if x == 1 or 2: return 1 elif x == 3 or 4: return 2 elif x == 5: return 3 elif x == 6: return 4 elif x == 7 or 8: return 5 elif x == 9 or 10: return 6 elif x == 11 or 12: return 7 df_train.apply(lambda y: NewMonth(y['month']), axis=1)

,则加密的文本将返回null

2 个答案:

答案 0 :(得分:0)

来自RSA_public_encrypt

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

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

但是您拥有to参数

unsigned char * encrypted = NULL;

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

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

答案 1 :(得分:0)

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