C 加载公钥以创建用于公共加密的rsa对象

C 加载公钥以创建用于公共加密的rsa对象,c,openssl,rsa,public-key,pem,C,Openssl,Rsa,Public Key,Pem,我试图从生成的公钥加载rsa对象。我使用PEM\u write\u bio\u RSAPublicKey生成公钥字符串。然后我使用PEM\u read\u bio\u RSA\u PUBKEY从公钥字符串加载RSA对象。问题是rsa对象为空。据我所知,生成的字符串看起来不错。有什么想法吗 ----开始RSA公钥----- MIIBCGKCAQEAXIREUSEPEPY6A4CPBJT/4Jt+H13Q9MEKmiutzNKDNO1UWQCDQDX pKPeTKXyUH6oCyRdUxkk6IVX

我试图从生成的公钥加载rsa对象。我使用
PEM\u write\u bio\u RSAPublicKey
生成公钥字符串。然后我使用
PEM\u read\u bio\u RSA\u PUBKEY
从公钥字符串加载RSA对象。问题是rsa对象为空。据我所知,生成的字符串看起来不错。有什么想法吗

----开始RSA公钥-----
MIIBCGKCAQEAXIREUSEPEPY6A4CPBJT/4Jt+H13Q9MEKmiutzNKDNO1UWQCDQDX
pKPeTKXyUH6oCyRdUxkk6IVXGlBlxtW7OsxaYWhpfl9z3CCERCEpFmzN++dvlK2v
mckFL66e9q6Y+HwgyP1LJqrszeqlg2d29TCVKfD/UURVNmc/nPPjs9nO+IDhh7+P
NTQ2OqGBq8ghwVL5ZZyW3yVO5OAbRB6pjKBe9+J4B2TGND5JO9NU0JLFANZOKJU
HDVE3xUTVOKUZL2I8LWP4MYK42TBIGCCE4G58VKFDL651RWHG4HN3FRSX5YTDNQ
R5CGFNBAW58S8LWXGU8Lvzveonv+WMgwIDAQAB
-----结束RSA公钥-----
gcc测试\u public\u private\u key.c-lcrypto-o测试

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

char* get_public_key() {

        RSA* rsa = RSA_new();
        int kbits = 2048;
        BIGNUM* bne = BN_new();
        BN_set_word(bne, RSA_F4);

        int status = RSA_generate_key_ex(rsa, kbits, bne, NULL);
        if(status == 0) {
                fprintf(stderr, "rsa key generation failed\n");
        }


        BIO *bio = BIO_new(BIO_s_mem());
        PEM_write_bio_RSAPublicKey(bio, rsa);

        int length = BIO_pending(bio);

        char* pem_key = malloc(length+1);
        memset(pem_key, '\0', length+1);

        BIO_read(bio, pem_key, length);

        return pem_key;

}

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

        char* public_key = get_public_key();

        printf("%s", public_key);

        BIO* keybio = BIO_new_mem_buf(public_key, -1);

        if (keybio == NULL) {
                fprintf(stderr, "failed to create key BIO");
        }

        printf("keybio: %p\n", keybio);
        RSA* rsa = PEM_read_bio_RSA_PUBKEY(keybio, NULL, NULL, NULL);
        printf("rsa result %p\n", rsa);
        BIO_free(keybio);

        free(public_key);

        return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
char*get_public_key(){
RSA*RSA=RSA_new();
int kbits=2048;
BIGNUM*bne=BN_new();
BN_集_字(bne,RSA_F4);
int status=RSA\u generate\u key\u ex(RSA,kbits,bne,NULL);
如果(状态==0){
fprintf(stderr,“rsa密钥生成失败\n”);
}
BIO*BIO=BIO_new(BIO_s_mem());
PEM_write_bio_rsa公钥(bio,rsa);
int length=BIO_pending(BIO);
char*pem_key=malloc(长度+1);
memset(pem_键,'\0',长度+1);
BIO_读取(BIO、pem_键、长度);
返回pem_键;
}
int main(int argc,char*argv[]){
char*public_key=get_public_key();
printf(“%s”,公钥);
BIO*keybio=BIO_new_mem_buf(公钥,-1);
if(keybio==NULL){
fprintf(stderr,“未能创建密钥BIO”);
}
printf(“keybio:%p\n”,keybio);
RSA*RSA=PEM_read_bio_RSA_PUBKEY(keybio,NULL,NULL,NULL);
printf(“rsa结果%p\n”,rsa);
无生物素(keybio);
免费(公钥);
返回0;
}

我想最好补充一点,这不起作用的原因是
PEM_read_RSA_PUBKEY
需要一个
SubjectPublicKeyInfo
结构,它以
BEGIN PUBLIC KEY
开始,而
PEM_read_RSA PUBLIC KEY
需要一个
RSA PUBLIC KEY
结构,以
开始RSA公钥开始的

PEM_write_bio_RSAPublicKey
生成了与第二个函数相对应的后者,
PEM_read_RSAPublicKey

我记得看到了一个使用
bio_FLAGS_BASE64_NO_NL的工作示例。可以尝试使用
BIO\u set\u标志(BIO,BIO\u标志\u BASE64\u NO\u NL)设置此标志
@Daniel我不确定它是否应该包含RSA这个词……生成字符串的是库自己的函数。我在谷歌搜索中看到了NL示例,但这不意味着如果我使用该选项,我应该从生成的字符串中删除新行。我尝试了不删除新行和不删除新行的NO_NL选项,但仍然不起作用。再看一看,我非常确定RSA单词应该在那里。至于标志,我看到它与一个有新行的键一起使用,但是再看一次,读什么BIO_set_标志,我认为它可能不相关,因为我认为它只在BIO_写入方法中使用。不管怎样,你都可以试试看它是否管用。您还应该尝试使用openssl命令生成的密钥,并对其进行硬编码,看看它是否与itI一起工作。我使用openssl命令生成公钥,但RSA字不在那里。我试过了,得到了相同的空结果。
RSA\u generate\u key\u ex
创建内存表单;是
PEM_write_[bio_]RSAPublicKey
(在OP的
get_public_key
中)创建了PKCS1表单,该表单可以被
PEM_read_[bio_]RSAPublicKey
读取,但不能被
PEM_read_[bio_][RSA_]PUBKEY
@dave_thompson_085是的,我的错了。编辑了我的答案,非常感谢。