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

时间:2011-10-19 07:48:38

标签: 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(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发布密钥。

由于

3 个答案:

答案 0 :(得分:27)

您可以尝试使用PEM_read_RSA_PUBKEY()代替PEM_read_RSAPublicKey()

这完全是关于格式的。

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

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

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

答案 1 :(得分:1)

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

A。 RSA_PUBKEY

    obtainLock("GET_OR_CREATE_FOOBAR")
    // now we hold the lock and are synchronized
    get()
    if (doesNotExistYet) create()
    commit / release-lock

以这种格式阅读RSA* rsaPubKey = PEM_read_bio_RSA_PUBKEY( bio, NULL, 0, pass ) ;

PUBKEY

生成
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

B。 RSAPublicKey

openssl rsa -in key.pri -pubout -out key.pub1

以这种格式阅读RSA* rsaPubKey = PEM_read_bio_RSAPublicKey( bio, NULL, 0, pass ) ;

PublicKey

生成
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

将A转换为B格式

openssl rsa -in key.pri -RSAPublicKey_out -out key.pub2

答案 2 :(得分:0)

  

openssl rsa实用程序使用保存公钥   函数PEM_write_bio_RSA_PUBKEY而不是PEM_write_bio_RSAPubicKey。所以,   如果您希望您的程序与其输出兼容,那么您   应该使用PEM_write_bio_RSA_PUBKEY和PEM_read_bio_RSA_PUBKEY   保存/加载公钥文件。

http://openssl.6102.n7.nabble.com/RSA-public-private-keys-only-work-when-created-programatically-td12532.html