c - 如何将公钥存储为c数组

标签 c openssl rsa

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

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

由于我将公钥发送给客户端进行验证,因此我无法将其提供给他并询问 key 路径,因为他可以更改公钥并使用自己的私钥/公钥对消息进行加密.

解决方案:将公钥以数组形式存储在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 ----

我逐个字符地阅读了这个字符,以了解“\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 对象中读取任意 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*。)

顺便说一句,如果您的 key 存储在数据库中,则可能不需要对它们进行 PEM 编码;你可以保存一个 通过以 DER 格式存储它们并直接调用 d2i_PrivateKey() 来获取空间和时间位。 (PEM 格式为 或多或少只是 base64 编码的 DER。)有一个关于此的常见问题解答条目: http://www.openssl.org/support/faq.html#PROG3

关于c - 如何将公钥存储为c数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32422314/

相关文章:

c - 列表节点没有被释放,仍然消失

python - py2app、pycrypto、aes 未找到

c - 安装仅项目非系统版本的 OpenSSL 和 libcrypt 库

c - 为什么 OpenSSL 导致 sigpipe @ SSL_connect?

cryptography - RSA 密码系统的蒙哥马利模乘法的最终减法

Java RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING 迁移到去

c - 在 C 语言中使用命名管道

java - 将c/c++与Java原生代码集成为共享库(gcj编译)

c - 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

ssl - OpenSSL:openssl s_client 验证返回:1 但验证返回码:0(确定)