C++ 在给定Base64编码的情况下,如何为对等密钥创建EVP_密钥?
使用OpenSSL,我创建了Diffie-Hellman私钥/公钥,并收到了对等方的公钥。我可以将对等方的密钥从Base64字符串解码为字节数组,但如何将其插入原始公钥/私钥EVP_密钥结构中,以便与EVP_PKEY_deriver()一起使用以生成共享密钥 创建“peerkey”EVP_PKEY应该做什么还不清楚,但下面是我的代码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
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()。