1

我正在尝试从 PKCS#12 文件中导入 RSA 私钥。我正在使用 OpenSSL 解析 P12,然后尝试使用 CryptImportKey 将密钥导入 CSP(“标准”增强型 RSA 提供程序)。

Ï 创建 blob 的方式与我使用 CryptExportKey 从 CSP 导出密钥时获得的方式完全相同。

最后,我不想使用任何会话加密,因为我只是解析加密文件并将其存储到 CSP 中。如果我使用

publickeystruc.aiKeyAlg := CALG_RSA_KEYX;

if not CryptImportKey(tmpprovider,addr(privkey),dwBlobLen,0,flags,hPubKey) then 
  errorCode := GetLastError;

(所以关键参数为 0)然后函数失败,我得到 ERROR_INVALID_PARAMETER 错误。但是密钥被导入并且可以正常工作(我试图用它签名,如果它被标记为可导出,我就可以导出它)。

变量声明如下:

 hpubkey:PHCRYPTKEY;
 privkey:privkeyblob;

在哪里

  HCRYPTKEY   = ULONG;
  PHCRYPTKEY  = ^HCRYPTKEY;

其余的是整数和基数...

问题解决了,这是一个非常愚蠢的错误。当我在函数开始时将它归零时,我忘记取消引用最后一个参数,所以而不是

hPubKey^:=0;

我有

hPubKey := 0;

感谢 TLama 为我指明了正确的方向。

4

1 回答 1

0

您写道,您尝试从 PKCS#12 文件中导入私有 RSA 密钥。在我看来,您应该使用PFXImportCertStore来执行此操作。您可以在此处找到导入模式。如果您只需要获取私钥并将其保存在其他地方,您可以使用CertAddCertificateContextToStoreto替换该步骤CertGetCertificateContextProperty自动PFXImportCertStore创建密钥容器的调用。使用with将为您提供 CRYPT_KEY_PROV_INFO 的密钥容器CertGetCertificateContextPropertyCERT_KEY_PROV_INFO_PROP_IDpwszContainerName

于 2012-04-23T21:36:38.817 回答