Encryption 加载ECIES公钥

Encryption 加载ECIES公钥,encryption,cryptography,public-key-encryption,elliptic-curve,Encryption,Cryptography,Public Key Encryption,Elliptic Curve,[生成的公钥如下](https://jameshfisher.com/2017/04/14/openssl-ecc/) Alice生成她的私钥: openssl ecparam -name secp256k1 -genkey -noout -out alice_priv_key.pem openssl ec -in alice_priv_key.pem -pubout -out alice_pub_key.pem Alice从私钥中提取公钥: openssl ecparam -name se

[生成的公钥如下](https://jameshfisher.com/2017/04/14/openssl-ecc/)

Alice生成她的私钥:

openssl ecparam -name secp256k1 -genkey -noout -out alice_priv_key.pem
openssl ec -in alice_priv_key.pem -pubout -out alice_pub_key.pem
Alice从私钥中提取公钥:

openssl ecparam -name secp256k1 -genkey -noout -out alice_priv_key.pem
openssl ec -in alice_priv_key.pem -pubout -out alice_pub_key.pem
当我需要使用公钥发送加密数据时,我有一个C语言的应用程序。我正在尝试从public(
alice\u pub\u key.pem
)文件加载数据

我将PEM文件从()转换为十六进制数据

看来我没有提供正确格式的数据。有人能告诉我哪里出了问题吗

key = EC_KEY_new_by_curve_name(NID_secp256k1)
group = EC_KEY_get0_group(key)
pub_key = EC_POINT_new(group)
EC_POINT * point = EC_POINT_hex2point(group, ptr, pub_key, NULL)
这一点是返回的
null

您可以尝试读取公钥。这避免了必须解析或重新编码公钥本身


请注意,您可能需要一个最新的OpenSSL来实现此功能;很难从文档中找到此功能是何时引入的。

为什么您首先使用十六进制作为中间格式?为什么不加载PEM?@MaartenBodewes感谢您的快速响应
-----BEGIN公钥------MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjWrT7F97QrSqGrlIgPK8dphNBicNO6gD lfoimjhf2miluuuuzd7l7bp+bLCuNtKKe/2dokgpqggxv4bfwqgp6pzxq==----这是生成的公钥----
当我将其作为缓冲区传递时,它失败了。然后我检查了一些文档,其中提到数据需要作为十六进制传递。所以我无法找到如何传递对等公钥来获得X和Y cordinate或将共享公钥加载到我生成的ECC私钥中,您拥有的是PEM格式的SubjectPublicKeyInfo结构,其中包含一个EC公钥。现在这一切都很好,但我似乎无法找到如何解析该结构,例如使用EVP BIO函数。这应该是可能的,但如果我能找到它,请注意,您的代码bove还不完整,发布一个更完整的示例应该会有所帮助,因为目前我们不知道
ptr
包含什么。呃,你能试试吗?我不确定它是否支持
公钥而不是
EC公钥(因为OpenSSL文档很烂)但这是可以修复的。@MaartenBodewes`ptr是pem2Hex值char*ptr=“3056301006072A8648CE3D0201006052B8104000A034200048D6AD3EC5F7B42B4AA1AB94880F2BC76984D0670D3BA8032DF38323845D8C88BBAECDEC13FE6CB0AE36D28A7BFD9D3A480FAA05EFE01156AA0A7A395D”EC_KEY*KEY=NULL;EC_POINT*pub_KEY;const EC_GROUP*GROUP;KEY=EC_KEY\u new_by_curve_name(NID_secp256k1);GROUP=EC_KEY\u get0_GROUP(KEY);pub_KEY=EC_POINT_new(GROUP);EC_POINT*POINT=EC_POINT\u hex2点(GROUP,ptr,pub_KEY,NULL);EC_KEY\u set_public_KEY(KEY,pub_KEY)(KEY,pub_KEY);if(!EC_KEY,check_KEY)(检查打印失败)else printf(“OK”)