我想将私有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与 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;
我知道keydata是正确的,因为Wincrypt API对它们没有问题。
答案 0 :(得分:1)
可以在内核模式驱动程序中使用
// Import the public key
hr = HRESULT_FROM_NT(BCryptImportKeyPair(
hAlg,
NULL,
**BCRYPT_RSAPRIVATE_BLOB**,
phKey,
(PUCHAR)pbPrivateKey,
cbKey,
0
));
一个好的起点是 OPM Example Code,来自Microsoft。该例程非常有用,因为在这里您将获得帮助例程,以正确的格式(Big Endian)在内存中放置结构的一部分。
答案 1 :(得分:0)
我找到了无需重建结构的解决方案。
hr = HRESULT_FROM_NT(BCryptImportKeyPair(
hAlg,
NULL,
**LEGACY_RSAPRIVATE_BLOB**,
phKey,
(PUCHAR)pbPublicKey,
cbKey,
0
));
现在,BLOB是从openssl导出的,并直接导入到 BCryptImportKeyPair 。