BCrypt RSA私钥导入
BCrypt RSA private key import
我想将私有 RSA pem 密钥导入 BCryptImportKeyPair。
我导入 public 密钥没有问题,但我不知道如何设置以下结构,尤其是必须设置私钥 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;
我知道密钥数据是正确的,因为我对 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
));
- 在驱动程序项目中包含 "Ksecdd.lib"。
- 在 CryptDecodeObjectEx 的帮助下将私钥从 PEM 转换为 PKCS_7_ASN_ENCODING。这只能在用户模式下完成。将结果放在驱动程序项目的结构中。
- 使用BCryptImportKeyPair和参数导入密钥BCRYPT_RSAPRIVATE_BLOB。(内核模式)
一个好的起点是
OPM Example Code 来自微软。这个例程非常有用,因为在这里您可以获得帮助例程,以正确的格式 (Big Endian) 在内存中放置部分结构。
我想将私有 RSA pem 密钥导入 BCryptImportKeyPair。 我导入 public 密钥没有问题,但我不知道如何设置以下结构,尤其是必须设置私钥 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;
我知道密钥数据是正确的,因为我对 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
));
- 在驱动程序项目中包含 "Ksecdd.lib"。
- 在 CryptDecodeObjectEx 的帮助下将私钥从 PEM 转换为 PKCS_7_ASN_ENCODING。这只能在用户模式下完成。将结果放在驱动程序项目的结构中。
- 使用BCryptImportKeyPair和参数导入密钥BCRYPT_RSAPRIVATE_BLOB。(内核模式)
一个好的起点是 OPM Example Code 来自微软。这个例程非常有用,因为在这里您可以获得帮助例程,以正确的格式 (Big Endian) 在内存中放置部分结构。