我正试图将ECDSA Curve448密钥编码到一个可移植的小字节数组中。我正试图使用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实验版的OpenSSLV1.1.1。
发布于 2018-05-15 11:22:44
你是想写私钥还是公钥?我之所以这样问是因为您上面的代码有size_t n = i2d_PrivateKey(pkey, &buf);,即试图对私钥进行编码,但是错误消息是i2d_PublicKey:unsupported public key type。
无论如何,i2d_PublicKey是用来用旧的“传统”格式写公钥的。由于ED448是一种新的算法,因此没有为其定义这样的格式。相反,您必须使用SubjectPublicKeyInfo格式。它的OpenSSL函数是(令人困惑的相似的) i2d_PUBKEY()。手册页在这里:
https://stackoverflow.com/questions/50347455
复制相似问题