Encryption 如何使用openssl中的BIO从pem文件读取公钥?

Encryption 如何使用openssl中的BIO从pem文件读取公钥?,encryption,openssl,cryptography,rsa,public-key-encryption,Encryption,Openssl,Cryptography,Rsa,Public Key Encryption,我正在使用openssl库,我想用BIO从.pem文件中读取公钥。我尝试了此操作,但我的rsa变量仍然未初始化: RSA *rsa = RSA_new(); BIO *keybio = NULL; keybio = BIO_new(BIO_s_file()); BIO_read_filename(keybio, "public.pem"); // and also tried this instead of last two lines: // keybio = BIO_new

我正在使用openssl库,我想用BIO从.pem文件中读取公钥。我尝试了此操作,但我的rsa变量仍然未初始化:

 RSA *rsa = RSA_new();

 BIO *keybio = NULL;

 keybio = BIO_new(BIO_s_file());
 BIO_read_filename(keybio, "public.pem");

 // and also tried this instead of last two lines:
 // keybio = BIO_new_file("public.rem", "r");

 rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL);
当我调试应用程序时,它向我显示如下内容:

rsa { padding = ???, n = ??? , ...} 
rsa->n <unable to read from memory> and so on for all rsa fields.
rsa{padding=?,n=?,…}
rsa->n,依此类推,适用于所有rsa字段。

我的文件有效,密钥是按照PKCS#1格式生成的。我用asn1解析器解析了它。

您的代码看起来不错。尝试以下输入:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1IHYYTavz9PQRxpcyO7J
m0dtiIjNUvW3coLQQKhq+wySTTN1cwm2zYTw0FSfLDPOtOBNXFwKF9wykiyHS2uU
D8vIU+T/fvlcADYTtZqdC5AoBWlSuhp0xqqtHmNUEjGa4FpRmKusL8s5/cuAfNRV
NVSxA3JCN3kYrT9Q1qBN+XbOQn+h7gPQU3ICmG7L1R/CwIsq/wwUbq+NeY0TMvz5
LM6AIS+GCV0UeJVm6UN6GDBCOHk02XuplyhkbCsNhq+HTfhHVeE1s7NcIavmgvqm
EtlIcTGemW9tXs5/REZUv+SDpR6RLUKhwuij/Ft5Pe9b7cH3wXqNmOBhJ3F/ht2C
swIDAQAB
-----END PUBLIC KEY-----
将其与您在asn1解析器中看到的内容进行比较:

$ openssl asn1parse -in public.pem
    0:d=0  hl=4 l= 290 cons: SEQUENCE          
    4:d=1  hl=2 l=  13 cons: SEQUENCE          
    6:d=2  hl=2 l=   9 prim: OBJECT            :rsaEncryption
   17:d=2  hl=2 l=   0 prim: NULL              
   19:d=1  hl=4 l= 271 prim: BIT STRING        

我认为最明显的是要确保正确设置了符号路径,以便调试器能够找到程序和库的符号。我还认为
RSA*
实际上是
RSA\u st*
。您可以先尝试强制转换它。@jww这是关于读取私钥的。在将某些内容标记为重复之前,请彻底检查其他问题/答案。您确定您的公钥是PEM格式的,包括头文件和base64编码吗?@Maarten-谢谢您的建议。如果你看一下,你会发现我对这个问题没有投赞成票。引用可能的副本是为了提供交叉引用,因为读取公钥和私钥之间几乎没有区别。例如,请参见Stack Exchange博客上的。在其中一个博客中有一个更好的参考资料。它必须提供一个“沙中的旗帜”。但是我现在找不到。再次感谢您的建议。他的代码正在从公钥PEM文件中读取RSA公钥。只要PEM文件有效,它就应该像写的一样工作。例如,如果PEM文件是X509证书文件,即使它包含公钥,此代码也无法工作。