【问题标题】:CryptoAPI CryptImportKey fails with ERROR_INVALID_PARAMETER but imports the keyCryptoAPI CryptImportKey 失败并显示 ERROR_INVALID_PARAMETER 但导入密钥
【发布时间】:2012-04-23 18:46:31
【问题描述】:

我正在尝试从 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 为我指明了正确的方向。

【问题讨论】:

  • 我怀疑关于 hPubKey 的注释:一些加密服务提供商可能会因操作而修改此参数,如果您向那里传递一个常量,它可以' t 被修改,所以我会尝试将其定义为类型为HCRYPTKEY 的变量,将其设置为 0 并将其传递给函数。但这只是猜测。
  • 我会试试看是否有帮助...
  • JEDI 库中的函数原型看起来像这样function CryptImportKey(hProv: HCRYPTPROV; pbData: LPBYTE; dwDataLen: DWORD; hPubKey: HCRYPTKEY; dwFlags: DWORD; var phKey: HCRYPTKEY): BOOL; stdcall;。所以我会尝试以这种方式声明最后一个参数hPubKey: HCRYPTKEY;.
  • 我正在使用绝地武士,我想我已经按照你说的那样声明了它。
  • 如果您使用 JEDI 的 JwaWinCrypt.pas,那么如果您在问题中使用变量声明 hpubkey:PHCRYPTKEY;,您将收到 Types of actual and formal var parameters must be identical 编译器错误,因此请包含您的真实变量声明。

标签: delphi winapi cryptography cryptoapi pkcs#12


【解决方案1】:

您写道,您尝试从 PKCS#12 文件导入私有 RSA 密钥。在我看来,您应该使用PFXImportCertStore 来执行此操作。导入的架构你可以找到here。如果您只需要获取私钥并将其保存在其他位置,您可以将步骤替换为 CertAddCertificateContextToStoreCertGetCertificateContextProperty 的用法。 PFXImportCertStore 的调用自动创建密钥容器。将CertGetCertificateContextPropertyCERT_KEY_PROV_INFO_PROP_ID 一起使用将为您提供作为pwszContainerName 字段的CRYPT_KEY_PROV_INFO 的密钥容器。

【讨论】:

  • 是的,这实际上也是一种选择。我曾短暂地研究过这种方式,但我选择了另一种方式,因为我已经有 PKCS#12 解析等用于导入 PKCS#11 令牌。我也有证书导入到 CSP 和 CSP 密钥生成和导出。因此,唯一缺少“完整”设置的就是导入密钥。但是,如果这种方式会失败,或者我会发现它更困难,我准备测试 PFXImportCertStore。据我所知,它将创建新的内存存储,我需要将其内容复制到我的存储中。
猜你喜欢
  • 2013-01-28
  • 1970-01-01
  • 2017-11-09
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 2015-06-19
相关资源
最近更新 更多