【发布时间】:2017-12-20 19:04:10
【问题描述】:
我正在尝试从生成的公钥加载 rsa 对象。我使用PEM_write_bio_RSAPublicKey 生成公钥字符串。然后我使用PEM_read_bio_RSA_PUBKEY 从公钥字符串中加载 rsa 对象。问题是 rsa 对象为空。据我所知,生成的字符串看起来不错。有什么想法吗?
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAxIReUspesPy6a4CPBjt/4Jt+H13q9MekMiutzNKdNO1uuwqcdqDX
pKPeTKXyUH6oCyRdUxkk6IVXGlBlxtW7OsxaYWhpfl9z3CCERCEpFmzN++dvlK2v
mckFL66e9q6Y+HwgyP1LJqrszeqlg2d29TCVKfD/UURVNmc/nPPjs9nO+IDhh7+P
NTQ2OqGBq8ghwVL5ZZyW3yVO5OAbRB6pjKBe9+j4B2TGnD5JO9Nu0jlFANZOKFJu
HDVE3XuTvOkuzL2i8Lwp4Myk42tbIgcCe4G58vKFddL651rWhg4hN3fRSx5YtDnQ
r5cgfNBOAww58S8lwXgU8lvzvEoNV+WMgwIDAQAB
-----END RSA PUBLIC KEY-----
gcc test_public_private_key.c -lcrypto -o test
#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;
}
【问题讨论】:
-
我记得看到一个设置了
BIO_FLAGS_BASE64_NO_NL标志的工作示例。也许尝试用BIO_set_flags( bio, BIO_FLAGS_BASE64_NO_NL );设置这个标志 -
@Daniel 我不确定它是否应该包含单词 RSA....它是库自己生成字符串的函数。我通过谷歌搜索看到了 NL 示例,但这并不意味着如果我使用该选项,我应该从生成的字符串中删除新行。
-
我尝试了 NO_NL 选项,带和不带换行符,但它仍然不起作用。
-
再看多一点后,我很确定 RSA 字应该在那里。至于标志,我看到它与一个有新行的键一起使用,但再次查看它并阅读 BIO_set_flags 我认为它可能无关紧要,因为我认为它仅用于 BIO_write 方法。无论如何,您都可以尝试一下,看看它是否有效。您还应该尝试使用由 openssl 命令生成的密钥并对其进行硬编码,看看它是否适用
-
我使用 open ssl 命令生成公钥,但没有 RSA 字。我试过了,我得到了同样的空结果。
标签: c openssl rsa public-key pem