如何使用25519打开SSL 1.1.1 ECDH

如何使用25519打开SSL 1.1.1 ECDH,c,openssl,ecdh,curve-25519,C,Openssl,Ecdh,Curve 25519,我需要使用openssl实现带有25519的ecdh 使用: key = EC_KEY_new_by_curve_name(NID_X25519) 失败了 使用此选项: EVP_PKEY *pkey = NULL; EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(NID_X25519, NULL); EVP_PKEY_keygen_init(pctx); EVP_PKEY_keygen(pctx, &pkey); 似乎可以工作,但我不知道如何以未压缩

我需要使用openssl实现带有25519的ecdh

使用:

key = EC_KEY_new_by_curve_name(NID_X25519)
失败了

使用此选项:

EVP_PKEY *pkey = NULL;
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(NID_X25519, NULL);
EVP_PKEY_keygen_init(pctx);
EVP_PKEY_keygen(pctx, &pkey);
似乎可以工作,但我不知道如何以未压缩的bin格式导出公钥。或者如何导入其他方的公钥


有什么帮助吗?

可以使用EVP_PKEY_new_raw_public_key()函数从原始二进制格式导入另一方的公钥。此处的手册页:

以原始二进制格式导出公钥有点棘手,因为没有函数可以完成。您可以使用此处描述的i2d_PUBKEY()以SubjectPubKeyInfo格式执行此操作:


幸运的是,SubjectPublicKeyInfo格式将原始公钥作为其输出的最后32个字节。因此,您可以使用i2d_PUBKEY(),只使用最后的32字节。

由于缺少以二进制格式导出原始密钥的功能,我创建了一个OpenSSL问题:EVP_PKEY_new_raw_public_key似乎创建了一个新密钥,但这在ECDH中是如何工作的?我需要从上下文或我已经创建的EVP_PKEY中获取它?它仍然返回EVP_PKEY,而不是需要两个EVP_PKEY对象的行缓冲区。一个包含您的私钥/公钥对(即您在问题中的EVP_PKEY_keygen()调用中生成的私钥/公钥对),另一个包含对等方的公钥(例如,使用EVP_PKEY_new_raw_public_key()创建)。要生成X25519共享密钥,请调用EVP_PKEY_deriver()。请参阅手册页上的示例:i2d_PUBKEY用以下内容填充数组:第一个4:0x00 0x53 0xb5 0x01所有其余的都是0x00,但PEM_write_PUBKEY打印:MCowBQYDK2VuAyEADzQvR1de+xLCZrth9eRv62fXAaJooth0xJj1uVE4y14=Ah,我怀疑您遇到了OpenSSL API的一个特殊问题,即所有的“i2d”函数将提供的缓冲区的值增加到DER编码数据结束后指向的值。因此,如果您立即尝试查看缓冲区中的数据,而不再次递减数据(或保存指向原始缓冲区位置的指针),您只会得到垃圾。请参见此处对i2d_TYPE()的说明: