2015-09-06 74 views
0

我一直在尋找這個答案了一段時間,所以我雖然我可能藏漢寄我已經找到。如何存儲公鑰爲C數組

我使用OpenSSL的簽署和使用私鑰簽名和公鑰來驗證驗證許可證。

因爲我發送公鑰到客戶端進行驗證,我不能給他,並要求路徑的關鍵,因爲他可以改變公共密鑰和用自己的私有/公共加密消息鍵。

溶液:存儲所述C程序作爲陣列內的公共密鑰。

現在我需要改變的讀取公鑰我的代碼:

EVP_PKEY *public_key = NULL; 

public_key_fd = fopen(public_key_path, "r"); 
if (!public_key_fd) 
    // something went wrong 
PEM_read_PUBKEY(public_key_fd, &public_key, NULL, NULL); 
fclose(public_key_path); 

到使用字符串而不是文件的東西。

回答

1

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