【发布时间】: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