Импорт закрытого ключа BCrypt RSA - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу импортировать закрытый ключ pem RSA в BCryptImportKeyPair.У меня нет проблем с импортом открытого ключа, но я не знаю, как установить следующую структуру и особенно cbPrime1 / cbPrime2 для блоба с закрытым ключом:

pRsaBlob->Magic = BCRYPT_RSAPRIVATE_MAGIC;
pRsaBlob->BitLength = pKey->rsapubkey.bitlen;
pRsaBlob->cbPublicExp = cbExp;
pRsaBlob->cbModulus = cbModulus;
pRsaBlob->cbPrime1 = 0;
pRsaBlob->cbPrime2 = 0;

Проблема должна быть решена с помощью BCrypt APIпотому что код находится внутри драйвера режима ядра.

В данный момент я заполняю эту структуру своим личным BLOB-объектом:

struct PUBLIC_KEY_VALUES {
BLOBHEADER blobheader;
RSAPUBKEY rsapubkey;
BYTE modulus[4096];};

Я знаю, что это также необходимо изменить, потому что частный BLOB-объект делаетне соответствует RSAPUBKEY.

Данные для BLOB получены из функции:

   CryptDecodeObjectEx(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, privateKeyInfo->PrivateKey.pbData, privateKeyInfo->PrivateKey.cbData,
    CRYPT_DECODE_ALLOC_FLAG, NULL, &keydata, &keyLen);
hr = HRESULT_FROM_WIN32(GetLastError());
if (FAILED(hr)) goto cleanup;

Я знаю, что ключевые данные верны, потому что у меня нет проблем с ними при использовании Wincrypt API.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Это можно сделать в драйвере режима ядра с помощью

    // Import the public key
hr = HRESULT_FROM_NT(BCryptImportKeyPair(
    hAlg,
    NULL,
    **BCRYPT_RSAPRIVATE_BLOB**,
    phKey,
    (PUCHAR)pbPrivateKey,
    cbKey,
    0
));
  1. Включите «Ksecdd.lib» в проект драйвера.
  2. Преобразуйте закрытый ключ из PEM в PKCS_7_ASN_ENCODINGс помощью CryptDecodeObjectEx.Это можно сделать только в пользовательском режиме.Положите результат в структуру для проекта драйвера.
  3. Импортируйте ключ с помощью BCryptImportKeyPair и параметра BCRYPT_RSAPRIVATE_BLOB. (Режим ядра)

Хорошая отправная точка - Пример OPMКод от Microsoft.Эта процедура очень полезна, потому что здесь вы можете получить вспомогательные процедуры для размещения частей структуры в памяти в нужном формате (Big Endian).

0 голосов
/ 06 декабря 2018

Я нашел решение, при котором нет необходимости перестраивать структуру.

    hr = HRESULT_FROM_NT(BCryptImportKeyPair(
    hAlg,
    NULL,
    **LEGACY_RSAPRIVATE_BLOB**,
    phKey,
    (PUCHAR)pbPublicKey,
    cbKey,
    0
));

BLOB теперь экспортируется из openssl и напрямую импортируется в BCryptImportKeyPair .

...