C++ 在给定Base64编码的情况下,如何为对等密钥创建EVP_密钥?

C++ 在给定Base64编码的情况下,如何为对等密钥创建EVP_密钥?,c++,openssl,diffie-hellman,C++,Openssl,Diffie Hellman,使用OpenSSL,我创建了Diffie-Hellman私钥/公钥,并收到了对等方的公钥。我可以将对等方的密钥从Base64字符串解码为字节数组,但如何将其插入原始公钥/私钥EVP_密钥结构中,以便与EVP_PKEY_deriver()一起使用以生成共享密钥 创建“peerkey”EVP_PKEY应该做什么还不清楚,但下面是我的代码 void CreateSharedKey(string &peerKey64) { EVP_PKEY *publicKey; // Created

使用OpenSSL,我创建了Diffie-Hellman私钥/公钥,并收到了对等方的公钥。我可以将对等方的密钥从Base64字符串解码为字节数组,但如何将其插入原始公钥/私钥EVP_密钥结构中,以便与EVP_PKEY_deriver()一起使用以生成共享密钥

创建“peerkey”EVP_PKEY应该做什么还不清楚,但下面是我的代码

void CreateSharedKey(string &peerKey64)
{
    EVP_PKEY *publicKey;  // Created earlier
    EVP_PKEY *peerKey;

    // Decode peer key
    unsigned char *pBuff;
    int buffLen = base64Decode(peerKey64, &pBuff);
    const unsigned char *pConst = pBuff;

    // Create peer key
    peerKey = d2i_PUBKEY(NULL, &pConst, buffLen);
    if (peerKey == NULL)
        return;

    // Create shared key context
    EVP_PKEY_CTX *ctxShared;
    ctxShared = EVP_PKEY_CTX_new(publicKey, NULL);
    if (ctxShared == NULL)
        return;

    // Initialize for deriving shared key
    if (EVP_PKEY_derive_init(ctxShared) <= 0)
        return;

    // Add peer key to context
    if (int rc = EVP_PKEY_derive_set_peer(ctxShared, peerKey) <= 0)
        return;

    // Determine buffer length for shared key
    size_t sharedKeyBufferSize;
    if (EVP_PKEY_derive(ctxShared, NULL, &sharedKeyBufferSize) <= 0)
        return;

    // Allocate buffer for shared key
    unsigned char *sharedKeyBuffer = new unsigned char[sharedKeyBufferSize];
    if (sharedKeyBuffer == NULL)
        return;

    // Derive the shared key
    if (EVP_PKEY_derive(ctxShared, sharedKeyBuffer, &sharedKeyBufferSize) <= 0)
    {
        unsigned long error = ERR_get_error();
        cout << "Failed to derive shared key. Error code = " << error << std::endl;
        cout << ERR_reason_error_string(error) << std::endl;

        return;
    }

    // Free shared key context
    EVP_PKEY_CTX_free(ctxShared);

    // Create Base64 shared key string
    base64Encode(sharedKeyStr, sharedKeyBuffer, sharedKeyBufferSize);
}
void CreateSharedKey(字符串和peerKey64)
{
EVP_PKEY*publicKey;//先前创建
执行副总裁皮尔基;
//解码对等密钥
无符号字符*pBuff;
int buffLen=base64解码(peerKey64和pBuff);
常量无符号字符*pConst=pBuff;
//创建对等密钥
peerKey=d2i_PUBKEY(NULL,&pConst,buffLen);
if(peerKey==NULL)
返回;
//创建共享密钥上下文
EVP_PKEY_CTX*CTX共享;
ctxShared=EVP_PKEY_CTX_new(公钥,空);
if(ctxShared==NULL)
返回;
//初始化以派生共享密钥
如果(EVP_PKEY_deriver_init(ctxShared)(我知道这很晚了,但可能会对某些人有所帮助)您的关键点是EC吗?在这种情况下,您需要定义一条曲线或命名它,请参阅EC_KEY_set_asn1_flag()。