BCrypt RSA私钥导入



我想将专用RSA pem密钥导入BCryptImportKeyPair。我导入公钥没有问题,但我不知道以下结构,尤其是私钥blob的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与rspubkey。

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没有任何问题。

我找到了一个不需要重建结构的解决方案。

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

BLOB现在从openssl导出,并直接导入到BCryptImportKeyPair中。

这可以在带有的内核模式驱动程序中完成

// Import the public key
hr = HRESULT_FROM_NT(BCryptImportKeyPair(
hAlg,
NULL,
**BCRYPT_RSAPRIVATE_BLOB**,
phKey,
(PUCHAR)pbPrivateKey,
cbKey,
0
));
  1. 在驱动程序项目中包含"Ksecdd.lib">
  2. 借助CryptDecodeObjectEx将私钥从PEM转换为PKCS_7_ASN_ENCODING。这只能在用户模式下完成。将结果放在驱动程序项目的结构中
  3. 使用BCryptImportKeyPair和参数BCRYPT_RSAPRIVATE_BLOB导入密钥。(内核模式(

一个好的起点是Microsoft的OPM示例代码。这个例程非常有用,因为在这里你可以得到帮助程序,以正确的格式(Big Endian(将结构的一部分放在内存中。

最新更新