我已经使用 Prime-256v1 从受信任的应用程序生成了 EC key 对,并将公钥导出到普通操作系统。 key 大小为 65 字节。公钥采用纯格式(仅 key 十六进制)。
导出的公钥需要提供给库(第三方)。该库需要 PEM 格式的公钥。
经过一段时间的搜索,我的理解是先将纯 key 转换为DER格式,然后将结果转换为PEM。但我还没有找到任何用于从普通 key 转换为 DER 或 PEM 的 API。
找到这个API PEM_ASN1_write((i2d_of_void*)i2d_PUBKEY,PEM_STRING_PUBLIC,outfile,ctx->cert->key->public_key,NULL,NULL,0,NULL,NULL);从文件指针转换而来。但我无法进行文件操作,因为无法进行文件存储。我正在缓冲区中获取公钥。
我正在 C 程序中执行此操作,如果有任何示例代码或 API 将普通十六进制 key 转换为 PEM。
提前致谢
最佳答案
使用 openssl 实用程序,您可以使用的命令是:
openssl ec -in .\prime256pubkey.cer -pubin -inform der -pubout -outform pem -out .\prime256pubkey.pem
要使用代码重现此内容,您需要使用这些主要的 openssl api
- d2i_EC_PUBKEY_bio - 读入 DER 格式的 EC 公钥
- PEM_write_bio_EC_PUBKEY - 以 PEM 格式写出 EC 公钥
一个 openssl 示例,转换为围绕 C openssl API 的 C++ 代码,如下所示:
template<typename T, typename D>
std::unique_ptr<T, D> make_handle(T* handle, D deleter)
{
return std::unique_ptr<T, D>{handle, deleter};
}
bool convert_der_ec_pubkey_to_pem()
{
// read in DER ec public key
auto infile = make_handle(BIO_new_file("prime256pubkey.cer", "rb"), BIO_free);
if(!infile) return false;
auto const eckey = make_handle(d2i_EC_PUBKEY_bio(infile.get(), nullptr), EC_KEY_free);
if(!eckey) return false;
infile.reset();
// write out PEM ec public key
auto outfile = make_handle(BIO_new_file("prime256pubkey.pem", "w"), BIO_free);
if(!outfile) return false;
return PEM_write_bio_EC_PUBKEY(outfile.get(), eckey.get()) != 0;
}
关于openssl - 将普通公钥转换为 PEM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56218946/