我正在尝试将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实验的openssl v1.1.1。
答案 0 :(得分:1)
您是在尝试写出私钥还是公钥?我问,因为上面的代码有size_t n = i2d_PrivateKey(pkey, &buf);
,即尝试编码私钥,但错误消息显示为i2d_PublicKey:unsupported public key type
。
无论如何i2d_PublicKey
用于以旧式“传统”格式写出公钥。由于ED448是一种新算法,因此没有为其定义这种格式。相反,您必须使用SubjectPublicKeyInfo格式。 OpenSSL函数就是(混淆性相似)i2d_PUBKEY()
。手册页在这里: