如何将公钥存储为c数组

我一直在寻找这个问题的答案,所以我可能会发布我发现的内容。

我正在使用openssl来签署和validation许可证,使用私钥进行签名和公钥进行validation。

因为我要将公钥发送给客户进行validation,所以我无法将其提供给他并要求输入密钥的路径,因为他可以使用自己的私钥/公钥更改公钥并加密消息。

解决方案:将公钥存储在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 ); 

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

首先,我们需要了解使用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 ---- 

我已经读过char中的char来了解’\ 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"; 

从char数组中读取键所需的代码是:

 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()(它从PEM编码的blob读取任意ASN.1对象)和d2i_PrivateKey()(它知道如何专门读取私钥blob)的包装器。

PEM_ASN1_read()只是从你给它的FILE *创建一个BIO,并调用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