【问题标题】:Reading and writing OpenSSL ECDSA keys to PEM file读取和写入 OpenSSL ECDSA 密钥到 PEM 文件
【发布时间】:2016-11-11 05:05:30
【问题描述】:

我想生成一个 ecdsa 密钥对并将其保存到 PEM 文件中。这是我生成密钥的代码。

#include <openssl/ec.h>      // for EC_GROUP_new_by_curve_name, EC_GROUP_free, EC_KEY_new, EC_KEY_set_group, EC_KEY_generate_key, EC_KEY_free
#include <openssl/ecdsa.h>   // for ECDSA_do_sign, ECDSA_do_verify
#include <openssl/obj_mac.h> // for NID_secp256k1

/*
* Function generate_eckey
* -----------------------
*
* This function generates an EC_Key object that stores the ECDSA key pair.
*
* return: ec key pair
*/
EC_KEY * generate_eckey() {
    EC_KEY *eckey=EC_KEY_new();
    EC_GROUP *ecgroup= EC_GROUP_new_by_curve_name(NID_secp256k1);
    EC_KEY_set_group(eckey, ecgroup);
    EC_KEY_generate_key(eckey);

    return eckey;
}


int main() {

    // generate a eckey used to produce signatures
    EC_KEY *eckey = generate_eckey();

    return 0;
}

现在我有了这个可用于签署和验证消息的密钥对。我想要做的是将信息保存到文件中,以便下次我可以简单地加载并使用它。

我想知道如何将密钥写入和加载到 PEM 文件? openssl 是否具有这样做的现有功能?我对密钥是否以任何格式编码没有偏好,只要加载后我可以使用它。任何例子都会很棒。

【问题讨论】:

  • 这是从 2009 年开始的(并且 OP 有问题),但看起来确实有函数调用可以满足您的需求。探索 OP 所做的一些事情可能会导致解决方案:openssl.6102.n7.nabble.com/…

标签: c openssl pem ecdsa


【解决方案1】:

我想知道如何将密钥写入和加载到 PEM 文件中? openssl 是否有现有的功能可以这样做?

是的,OpenSSL 已有功能。对于 ASN.1/DER,使用 d2i_ECPrivateKeyd2i_EC_PUBKEY;对于 PEM,请使用 PEM_read_ECPrivateKeyPEM_read_EC_PUBKEY。写入函数类似,并记录在手册页中。

d2i_*“DER 到内部”,它用于读取 ASN.1/DER 密钥。写入函数使用i2d_* 及其“DER 内部”。 PEM 不使用神秘前缀。

有关在带有输出的 C++ 程序中使用带有 RSA 密钥的 d2i_*PEM_* 的示例,请参阅 Use OpenSSL RSA key with .Net。您可以将您的 EC 函数替换为 RSA 函数。


EC_KEY * generate_eckey() {
    EC_KEY *eckey=EC_KEY_new();
    EC_GROUP *ecgroup= EC_GROUP_new_by_curve_name(NID_secp256k1);
    EC_KEY_set_group(eckey, ecgroup);
    EC_KEY_generate_key(eckey);

    return eckey;
}

相关,当您编写您的 EC 密钥时,请务必通过调用EC_KEY_set_asn1_flag(ecKey, OPENSSL_EC_NAMED_CURVE) 使用命名曲线。如果您不这样做,那么这些密钥的用途可能会受到限制。另请参阅 OpenSSL wiki 上的 Elliptic Curve Cryptography | Named Curves

此外,您将忽略来自 EC_KEY_newEC_KEY_generate_key 等函数的返回值。您可能需要重新考虑该策略,因为这些功能可能由于非显而易见的原因(例如策略设置)而失败。另请参阅 EC_KEY_new 手册页。

【讨论】:

  • 我在您之前的帖子中看到您首先将 RSA 密钥转换为 PKEY。我是否也需要为 EC_KEY 应用它?顺便说一句,我不懂 c++,所以阅读代码对我来说很痛苦。
猜你喜欢
  • 2012-09-20
  • 2021-11-07
  • 2016-08-26
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
相关资源
最近更新 更多