2015-09-06 73 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