c++ - OpenSSL DER ECDSA 编码错误

标签 c++ openssl ecdsa der

我正在尝试将 ECDSA Curve448 key 编码为一个小型且可移植的字节数组。我正在尝试使用 DER 来完成此操作,因为低级 API 不适用于 Curve448。但是,当我使用以下代码时:

std::vector<std::vector<uint8_t>> vecs;
uint8_t* buf = nullptr;

EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_ED448, NULL);
EVP_PKEY_keygen_init(pctx);
EVP_PKEY* pkey;
EVP_PKEY_keygen(pctx, &pkey);
EVP_PKEY_CTX_free(pctx);

size_t n = i2d_PublicKey(pkey, &buf);

ERR_print_errors_fp(stderr);

vecs.emplace_back(buf, buf + n);

n 设置为 -1,因此 vecs.emplace_back 失败。 ERR_print_errors_fp 打印:

140691149055104:error:0D0A40A7:asn1 encoding routines:i2d_PublicKey:unsupported public key type:../crypto/asn1/i2d_pu.c:35

我该如何解决这个问题,或者是否有更好的方法来解决这个问题?

我正在使用来自 debian experimental 的 openssl v1.1.1。

最佳答案

您是要写出私钥还是公钥?我问是因为您上面的代码有 size_t n = i2d_PrivateKey(pkey, &buf);,即尝试对私钥进行编码,但错误消息显示 i2d_PublicKey:unsupported public key type.

无论如何,i2d_PublicKey 用于以旧式“传统”格式写出公钥。由于 ED448 是一种新算法,因此没有为其定义这种格式。相反,您必须使用 SubjectPublicKeyInfo 格式。 OpenSSL 函数是(令人困惑的相似)i2d_PUBKEY()。手册页在这里:

https://www.openssl.org/docs/man1.1.1/man3/i2d_PUBKEY.html

关于c++ - OpenSSL DER ECDSA 编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50347455/

相关文章:

c++ - C++ 中的堆栈溢出校正

macos - Mac OS X 上的 OpenSSL 用于 SHA-256 签名算法

C++ OpenSSL 导出私钥

c# - 从 ECC X509Certificate 创建 X509Certificate2 在 C# 中抛出 'System.NotSupportedException'

openssl - 如何使用 ECDSA 以编程方式创建自签名数字证书

c++ - 使用公钥进行 RSA 加密。基于键的数据大小

C++ MatLab 类构造函数重载

c++ - C++ 中的简单警告框,而不是 Objective-C

c - 如何在网络内核扩展中使用OpenSSL?

c - 带有 libssl 的 EMSA_PSS_ENCODE