【问题标题】:How to use d2i_ECPrivateKey() to load my private key with如何使用 d2i_ECPrivateKey() 加载我的私钥
【发布时间】:2022-01-06 21:12:16
【问题描述】:

我正在尝试使用 d2i_ECPrivateKey() 从包含我的私钥的 std::string 加载密钥。我的目标是进行 ECDSA 签名。

我的代码 sn-p。

function sign(){
  // random data
  std::string data = "....";

  // 256-bit key in hex
  std::string private_key =
      "ee52189da48a2aeda40e488ce3c711f852ebdd12a21d1c7fd8a5b78a0902fad1";

  const unsigned char *key_cstr = reinterpret_cast<unsigned char *>(
      const_cast<char *>(private_key.c_str()));

  const unsigned char *data_cstr =
      reinterpret_cast<unsigned char *>(const_cast<char *>(data.c_str()));

  EC_KEY *ec_key = d2i_ECPrivateKey(NULL, &key_cstr, private_key.length());
  if (ec_key == NULL) {
    LOG(ERROR) << "d2i_ECPrivateKey returns NULL";
    return {};
  }

}

并且 d2i_ECPrivateKey 总是通过返回一个空对象而失败。任何人都可以在这里阐明一下吗?因为 openssl 文档非常有限。谢谢

【问题讨论】:

    标签: c++ openssl cryptography


    【解决方案1】:

    这种方法不正确:d2i_ECPrivateKey 期望密钥是二进制(不是十六进制字符串)和 DER 编码。此外,这个函数调用似乎已被弃用,请参阅https://www.openssl.org/docs/manmaster/man3/d2i_ECPrivateKey.html

    附:您实际上是使用带有一些曲线参数的 ECDSA 还是 Ed25519?

    【讨论】:

    • 感谢您的回答! “P.S. 你真的使用带有一些曲线参数的 ECDSA,还是 Ed25519?”我不确定你指的是什么。实际上,我正在尝试查找有关如何使用 OPENSSL 使用现有私钥对数据进行签名的简单教程。但是找不到
    • 您应该首先找出您使用的私钥:它可能代表不同的曲线(如secp256p1,secp256k1,Ed25519)等等。根据您需要选择要使用的函数,因为 OpenSSL 以不同的方式处理后面的函数(Ed25519),请参阅EVP_PKEY_new_raw_private_key
    • ...您可以在此处的代码中找到 OpenSSL ECDSA/EdDSA 签名和验证的示例:github.com/rnpgp/rnp/blob/master/src/lib/crypto/ecdsa_ossl.cpp 这有点复杂,但可以让您了解调用哪些函数以及何时调用。跨度>
    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 2022-12-12
    • 2012-11-26
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2020-08-28
    • 2023-03-21
    相关资源
    最近更新 更多