为什么我无法使用PEM_read_RSAPublicKey读取openssl生成的RSA pub密钥?

Jon*_*lli 16 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
Run Code Online (Sandbox Code Playgroud)

然后我试着读:

FILE *keyfile = fopen("somewhere.pub", "r");
RSA *rsa_pub = PEM_read_RSAPublicKey(keyfile, NULL, NULL, NULL);
//rsa_pub == NULL!
Run Code Online (Sandbox Code Playgroud)

当我正在阅读私钥时,它可以工作

FILE *keyfile = fopen("mykey.pem", "r");
RSA *rsa_pri = PEM_read_RSAPrivateKey(keyfile, NULL, NULL, NULL);
//all good
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

我已经读过openssl生成RSA公钥的X509密钥.但我甚至无法加载X509发布密钥.

谢谢

alk*_*alk 27

你可以试试PEM_read_RSA_PUBKEY()而不是PEM_read_RSAPublicKey().

这都是关于格式的.

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

PEM_read_RSA_PUBKEY()读取PEM格式.PEM_read_RSAPublicKey()读取PKCS#1格式.

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

  • 这个答案是不正确和误导的."PEM_read_RSA_PUBKEY"和"PEM_read_RSAPublicKey"都读取PEM格式,但前者需要一个SubjectPublicKeyInfo结构,而后者需要一个RSAPublicKey结构.前者由openssl命令行工具生成,以BEGIN PUBLIC KEY开头,后者以BEGIN RSA PUBLIC KEY开头. (17认同)
  • 我的upvote写的解释远不如OpenSSL文档中提到的那么神秘. (2认同)
  • 尼古拉的评论应该就是答案。 (2认同)

yur*_*hen 7

似乎有两种格式的 rsa 公钥,具有不同的编码。

A、RSA_PUBKEY

RSA* rsaPubKey = PEM_read_bio_RSA_PUBKEY( bio, NULL, 0, pass ) ;
Run Code Online (Sandbox Code Playgroud)

PUBKEY用这种格式阅读

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

产生于

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

B.RSA公钥

$ openssl rsa -in key.pri -pubout -out key.pub1
Run Code Online (Sandbox Code Playgroud)

PublicKey用这种格式阅读

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

产生于

RSA* rsaPubKey = PEM_read_bio_RSAPublicKey( bio, NULL, 0, pass ) ;
Run Code Online (Sandbox Code Playgroud)

转变

A 到 B 格式

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

B 到 A 格式

$ openssl rsa -in key.pri -RSAPublicKey_out -out key.pub2
Run Code Online (Sandbox Code Playgroud)