我正在使用OpenSSL的c库生成椭圆曲线Diffie-Hellman(ECDH)密钥对,遵循第一个代码示例here。它用这一行掩盖了公钥的实际交换:
peerkey = get_peerkey(pkey);
pkey
变量和返回值都是EVP *
类型。 pkey
包含先前生成的公钥,私钥和params,返回值仅包含对等方的公钥。所以这提出了三个问题:
get_peerkey()
如何实际仅从pkey
中提取公钥以发送给对等方?pKey
中提取私钥和参数以存储它们以供以后在密钥交换后使用?get_peerkey()
如何从对等方的原始公钥生成新的EVP_PKEY
结构?我见过OpenSSL函数EVP_PKEY_print_public()
,EVP_PKEY_print_private()
和EVP_PKEY_print_params()
但这些函数用于生成人类可读的输出。我还没有找到将人类可读的公钥转换回EVP_PKEY
结构的任何等价物。
答案 0 :(得分:36)
要回答我自己的问题,私钥和公钥有不同的路径。
序列化公钥:
要反序列化公钥:
要序列化私钥:
要反序列化私钥:
也可以将BIGNUM转换为十六进制,十进制或“bin”,尽管我认为mpi使用的字节最少。