为什么我能';使用PEM_read_RSAPublicKey读取openssl生成的RSA发布密钥?

为什么我能';使用PEM_read_RSAPublicKey读取openssl生成的RSA发布密钥?,c,encryption,openssl,rsa,C,Encryption,Openssl,Rsa,我尝试读取openssl生成的RSA公钥,如下所示: Private Key: openssl genrsa -out mykey.pem 1024 Public Key afterwards: openssl rsa -in mykey.pem -pubout > somewhere.pub 然后我试着读: FILE *keyfile = fopen("somewhere.pub", "r"); RSA *rsa_pub = PEM_read_RSAPublicKey

我尝试读取openssl生成的RSA公钥,如下所示:

Private Key:
    openssl genrsa -out mykey.pem 1024

Public Key afterwards:
    openssl rsa -in mykey.pem -pubout > somewhere.pub
然后我试着读:

FILE *keyfile = fopen("somewhere.pub", "r");
RSA *rsa_pub = PEM_read_RSAPublicKey(keyfile, NULL, NULL, NULL);
//rsa_pub == NULL!
当我读取私钥时,它会工作

FILE *keyfile = fopen("mykey.pem", "r");
RSA *rsa_pri = PEM_read_RSAPrivateKey(keyfile, NULL, NULL, NULL);
//all good
有什么想法吗

我读过openssl生成RSA公钥的X509密钥。但我甚至无法加载X509 pub密钥


谢谢

您可以尝试使用
PEM\u read\u RSA\u publickey()
而不是
PEM\u read\u RSA publickey()

这都是关于格式的

openssl生成的默认公钥文件格式是PEM格式

PEM\u read\u RSA\u PUBKEY()
读取PEM格式
PEM_read_RSAPublicKey()
读取PKCS#1格式

因此,如果您想坚持使用
PEM_read_RSAPublicKey()
,您可以在生成公钥时指定
-outform DER
选项,使用PKCS#1格式生成公钥文件

openssl rsa实用程序使用 函数PEM_write_bio_RSA_publickey而不是PEM_write_bio_RSA publickey。所以 如果希望程序与其输出兼容,则 应使用PEM_write_bio_RSA_PUBKEY和PEM_read_bio_RSA_PUBKEY用于 保存/加载公钥文件


rsa公钥似乎有两种格式,编码方式不同

A.RSA_公钥
RSA*rsaPubKey=PEM\u read\u bio\u RSA\u PUBKEY(bio,NULL,0,pass);
使用此格式阅读
PUBKEY

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
产生于

$openssl rsa-in key.pri-pubout-out key.pub1
B.公共钥匙
RSA*rsaPubKey=PEM_read_bio_RSAPublicKey(bio,NULL,0,pass);
使用此格式读取公钥

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
产生于

$openssl rsa-in key.pri-RSAPublicKey\u out-out key.pub2
转换 A到B格式

$openssl rsa-in key.pub1-pubin-RSAPublicKey\u out-out key.pub2_
B到A格式

$openssl rsa-in key.pub2-RSAPublicKey\u in-pubout-out key.pub1_

我赞成编写一个解释,它远没有OpenSSL文档中提到的解释那么神秘。我使用
-outform DER
生成公钥,但它仍然会产生分段错误。我想从内存而不是文件中读取公钥。我曾使用过
PEM_read_bio_RSA_PUBKEY
,但不起作用。@mustafa.yavuz:由于这些问题似乎与这个特定问题无关,请将您的问题作为新问题提出。这个答案不正确且具有误导性。
PEM_read_RSA_PUBKEY
PEM_read_RSAPublicKey
read PEM格式,但前者需要SubjectPublicKeyInfo结构,而后者需要RSAPublicKey结构。前者由openssl命令行工具生成,以BEGIN公钥开始,后者以BEGIN RSA公钥开始。