如何使用CryptoApi导入PKCS#8

问题描述

我有一个PKCS#8密钥,我拼命尝试导入CryptoAPI,但没有成功。我有:

-----BEGIN PRIVATE KEY-----
<privatekey>
-----END PRIVATE KEY-----

包含以下内容:

Private Key algo RSA
 Private Format  PKCS#8
 ASN1 Dump
RSA Private CRT Key [.....]
            modulus: .....
    public exponent: .....

我尝试这样导入密钥:

 if not CryptStringToBinaryA(
           PansiChar(aBase64PrivateKey),// pszString: LPCSTR;
           length(aBase64PrivateKey),// cchString: DWORD;
           CRYPT_STRING_BASE64HEADER,// dwFlags: DWORD;
           nil,// pbBinary: pByte;
           @cbPrivKey,// pcbBinary: PDWORD;
           nil,// pdwSkip: PDWORD;
           nil) then raiseLastOsError; // pdwFlags: PDWORD
  setlength(pPrivKey,cbPrivKey);
  if not CryptStringToBinaryA(
           PansiChar(aBase64PrivateKey),// dwFlags: DWORD;
           @pPrivKey[0],// pdwSkip: PDWORD;
           nil) then raiseLastOsError; // pdwFlags: PDWORD

  //init pKeyBlob
  if not CryptDecodeObjectEx(
           X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,// dwCertEncodingType: DWORD;
           PKCS_PRIVATE_KEY_INFO,// lpszStructType: LPCSTR;
           @pPrivKey[0],// const pbEncoded: PBYTE;
           cbPrivKey,// cbEncoded: DWORD;
           0,// pDecodePara: PCRYPT_DECODE_PARA;
           nil,// pvStructInfo: Pointer;
           @cbKeyBlob) then raiseLastOsError; // pcbStructInfo: PDWORD
  setlength(pKeyBlob,cbKeyBlob);
  if not CryptDecodeObjectEx(
           X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,// pDecodePara: PCRYPT_DECODE_PARA;
           @pKeyBlob[0],// pvStructInfo: Pointer;
           @cbKeyBlob) then raiseLastOsError; // pcbStructInfo: PDWORD

  //acquire a handle to a particular key container
  if (not CryptAcquireContextA(@hProv,// phProv: PHCRYPTPROV;
                               nil,// pszContainer: PAnsiChar;
                               nil,// pszProvider: PAnsiChar;
                               PROV_RSA_AES,// dwProvType: DWORD;
                               CRYPT_VERIFYCONTEXT)) then raiselastOsError; // dwFlags: DWORD
  try

    // Now import the key.
    if not CryptImportKey(hProv,// hProv: HCRYPTPROV;
                          @pKeyBlob[0],// const pbData: PBYTE;
                          cbKeyBlob,// dwDataLen: DWORD;
                          0,// hPubKey: HCRYPTKEY;
                          0,// dwFlags: DWORD;
                          @hRSAKey) then raiseLastOsError; // phKey: PHCRYPTKEY

但是CryptImportKey失败,并出现“提供程序的版本错误” ,我想是因为它正在等待PKCS#1密钥。如何导入 PKCS#8 密钥?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)