我一直在尝试使用openssl的RSA_public_encrypt
对测试字符串进行加密,但是以我尝试运行它的所有方式导致segfault。
我尝试使用BIO检查我从pem文件中读取的RSA密钥是否有效,并且它正确返回了具有正确密钥和指数大小的公钥。
我最初尝试使用PEM_read_bio_RSA_PUBKEY
,但没有成功。我不确定PEM_read_bio_RSAPublicKey
与BIO
之间的区别,因此是否有人可以对此有所了解。
另外,在尝试#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
此外,我尝试同时使用rsa
和RSA_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)
答案 0 :(得分:0)
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资源。通常情况下,释放的内容会受到限制。尽早释放资源可能会导致库中其他地方出现段错误。