首先我们需要了解什么是什么样子,使用cat:
cat public_key.pem
我们得到
---- BEGIN PUBLIC KEY ----
AAAAB3NzaC1yc2EAAAABJQAAAQB/nAmOjTmezNUDKYvEeIRf2YnwM9/uUG1d0BYs
c8/tRtx+RGi7N2lUbp728MXGwdnL9od4cItzky/zVdLZE2cycOa18xBK9cOWmcKS
0A8FYBxEQWJ/q9YVUgZbFKfYGaGQxsER+A0w/fX8ALuk78ktP31K69LcQgxIsl7r
NzxsoOQKJ/CIxOGMMxczYTiEoLvQhapFQMs3FL96didKr/QbrfB1WT6s3838SEaX
fgZvLef1YB2xmfhbT9OXFE3FXvh2UPBfN+ffE7iiayQf/2XR+8j4N4bW30DiPtOQ
LGUrH1y5X/rpNZNlWW2+jGIxqZtgWg7lTy3mXy5x836Sj/6L
---- END PUBLIC KEY ----
我读过这个字符的字符来理解是“\ n '和其他隐形字符,我发现每行都以'\ n'结尾
所以我们得到的数组为C:
char *key_string = "---- BEGIN PUBLIC KEY ----\nAAAAB3NzaC1yc2EAAAABJQAAAQB/nAmOjTmezNUDKYvEeIRf2YnwM9/uUG1d0BYs\nc8/tRtx+RGi7N2lUbp728MXGwdnL9od4cItzky/zVdLZE2cycOa18xBK9cOWmcKS\n0A8FYBxEQWJ/q9YVUgZbFKfYGaGQxsER+A0w/fX8ALuk78ktP31K69LcQgxIsl7r\nNzxsoOQKJ/CIxOGMMxczYTiEoLvQhapFQMs3FL96didKr/QbrfB1WT6s3838SEaX\nfgZvLef1YB2xmfhbT9OXFE3FXvh2UPBfN+ffE7iiayQf/2XR+8j4N4bW30DiPtOQ\nLGUrH1y5X/rpNZNlWW2+jGIxqZtgWg7lTy3mXy5x836Sj/6L\n---- END PUBLIC KEY ----\n";
并读取从一个字符阵列的密钥所需的代码是:
EVP_PKEY *public_key = NULL;
BIO *bio;
bio = BIO_num_mem_buf(key_string, strlen(key_string));
PEM_read_bio_PUBKEY(bio, &public_key, NULL, NULL);
交代: PEM_read_PrivateKey()是围绕PEM_ASN1_read()(其从读取的任意ASN.1对象的包装一个 PEM编码的blob)和d2i_PrivateKey()(它知道如何专门读取私钥BLOB)。
PEM_ASN1_read()只是简单地创建从你给它FILE *生物,并调用PEM_ASN1_read_bio()。如果 你愿意,你可以而不是从使用类似BIO_new_mem_buf()的字符串创建一个BIO并调用 PEM_ASN1_read_bio()自己。 (一个BIO是一个openssl对象,就像一个更通用的FILE *一样)。
顺便说一句,如果你的密钥存储在数据库中,可能不需要它们进行PEM编码;您可以通过将它们存储为DER格式并直接调用d2i_PrivateKey()来节省一小部分空间和时间。 (PEM格式是 或多或少只是base64编码的DER。)这里有一个FAQ条目: http://www.openssl.org/support/faq.html#PROG3