Используя OpenSSL, я создал свой личный / открытый ключ Диффи-Хеллмана и получил открытый ключ моего партнера. Я могу декодировать ключ своего пира из строки Base64 в байтовый массив, но как мне вставить это в мою исходную структуру открытого / закрытого ключа EVP_KEY, чтобы его можно было использовать с EVP_PKEY_derive () для создания общего ключа?
Очень непонятно, что именно нужно делать, чтобы создать EVP_PKEY «peerkey», но вот мой код, который делает это.
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);
}
Вывод ошибки OpenSSL выглядит следующим образом:
Не удалось добавить одноранговый узел в контекст общего ключа. Код ошибки = 101298329
разные параметры
Как он может иметь разные параметры, если он был получен из контекста, который был основан на параметрах, уже существующих в оригинальном publicKey?
Задача ещё не решена.