读取和写入OpenSSL ECDSA密钥到PEM文件

时间:2016-07-08 15:03:25

标签: c openssl pem ecdsa

我想生成一个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是否有现成的功能?我没有偏好键是否以任何格式编码,只要加载后我就可以使用它。任何例子都会很棒。

1 个答案:

答案 0 :(得分:1)

  

我想知道如何编写和加载PEM文件的密钥? openssl是否有现成的功能?

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

d2i_* &#34; DER为内部&#34; ,用于读取ASN.1 / DER键。写函数使用i2d_*及其&#34;内部的DER&#34; 。 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手册页。