3

我有以下 C# 代码来执行我在主题中要求的操作:

public static void ExportCertificatesToFile(string FileName)
{
    stringBuilder builder = new StringBuilder();

    X509Store storeMy = new X509Store(StoreName.My);
    storeMy.Open(OpenFlags.ReadOnly);

    foreach (X509Certificate2 cert in storeMy.Certificates)
    {
        builder.AppendLine("-----BEGIN CERTIFICATE-----");   
              builder.AppendLine(Convert.ToBase64String(cert.Export(X509ContentType.Cert),  Base64FormattingOptions.InsertLineBreaks));
        builder.AppendLine("-----END CERTIFICATE-----");
    }

    storeMy.Close();

    File.WriteAllText(FileName, builder.ToString());
}

正是我想使用 CryptoAPI (JwaWinCrypt.pas) 使用 Delphi 进行归档,我尝试了以下代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  hStore: HCERTSTORE;
  CertContext: PCertContext;
  pszString: PAnsiChar;
  pchString: Cardinal;
begin
  hStore := CertOpenSystemStore(0, PChar('MY'));

  try
    CertContext := CertEnumCertificatesInStore(hStore, nil);
    while CertContext <> nil do
    begin
      pszString := '';
      pchString := 0;
      CryptBinaryToString(CertContext.pbCertEncoded, CertContext.cbCertEncoded,  CRYPT_STRING_BASE64, pszString, pchString);

      ShowMessage(StrPas(pszString));

      CertContext := CertEnumCertificatesInStore(hStore, CertContext);
    end;
  finally
    CertCloseStore(hStore, 0);
  end;
end;

问题是 ShowMessage 什么都不显示,字符串为空。有人知道我做错了什么吗?

4

1 回答 1

1

的文档说明了CryptBinaryToString这个pszString参数。

指向接收转换后的字符串的缓冲区的指针。要计算必须分配以保存返回的字符串的字符数,请将此参数设置为 NULL。该函数将在 pcchString 指向的值中放置所需数量的字符,包括终止 NULL 字符。

您有义务分配缓冲区,以便 API 函数可以填充它。你没有这样做。为了继续,您必须仔细阅读文档并遵守 API 的要求。

所以你需要像这样调用函数:

szString: AnsiString;
....
chString := 0;
CryptBinaryToString(CertContext.pbCertEncoded, CertContext.cbCertEncoded,  
    CRYPT_STRING_BASE64, nil, chString);
SetLength(szString, chString-1);
CryptBinaryToString(CertContext.pbCertEncoded, CertContext.cbCertEncoded,  
    CRYPT_STRING_BASE64, PAnsiChar(szString), chString);

您还应该检查 的返回值CryptBinaryToString以检测故障。为简洁起见,我省略了它。

我还假设您的是 ANSI Delphi。我假设是因为您使用了PAnsiChar.

于 2013-02-09T20:33:04.367 回答