如何将公钥存储为c数组

时间:2015-09-06 10:03:33

标签: c openssl rsa

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

我使用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 个答案:

答案 0 :(得分: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 ----

我已经通过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()的包装器(它从一个任意的ASN.1对象中读取) PEM编码的blob)和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