首先我們需要了解什麼是什麼樣子,使用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