CAPICOM vs P/Invoke

本文关键字:Invoke vs CAPICOM | 更新日期: 2023-09-27 18:04:03

我想在c#中使用CryptoAPI访问证书存储和签名消息。

这篇MSDN文章"CAPICOM: CryptoAPI变得简单"展示了两种方法:使用CAPICOM或p/Invoke。

  1. 哪个是最好的?CAPICOM.dll或P/Invoke [DllImport("crypt32.dll", ...)]

  2. "crypt32.dll"总是存在于任何机器上吗?

CAPICOM vs P/Invoke

CAPICOM是一种老技术,已经/正在被Microsoft弃用。P/Invoke(平台调用)允许托管代码调用在DLL中实现的非托管代码。

它是一个基于com的CryptoAPI库包装器。你发表的文章是2003年的。那是8年前的事了,科技在不断进步。

MSDN上的这篇文章建议您使用。net框架来代替CAPICOM。

crypt32的可用性不应该是一个问题,而capicom的可用性是一个问题。

在同样的注意事项上,你应该确保在。net中没有托管包装器,然后前往p'invoke

使用CAPICOM是一个要求吗?它会工作,但它有几个非常烦人的缺点,如果你不/必须/使用它,你最好使用System.Security.Cryptography。

无论如何:要使用CAPICOM,您必须首先在您的项目中添加对它的引用。然后:

    CAPICOM.SignedData signeddata = new CAPICOM.SignedData();
    FileStream file = File.Open(tbSourceFile.Text, FileMode.Open);
    byte[] Content = new byte[(int)file.Length];
    file.Read(Content, 0, (int)file.Length);
    file.Close();
    StringWriter sw = new StringWriter();
    sw.Write(Content);
    signeddata.Content = sw.ToString();
    IStore store = new CAPICOM.Store();
    store.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "MY", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY | CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY);
    ICertificates2 certificates = (ICertificates2)store.Certificates;
    certificates = certificates.Find(CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_KEY_USAGE, CAPICOM_KEY_USAGE.CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE, true);
    if (certificates.Count > 0)
    {
        certificates = certificates.Select();
    }
    if (certificates.Count > 0)
    {
        ISigner2 signers = new CAPICOM.Signer();
        signers.Certificate = certificates[1];
        tbSignatureBlock.Text = signeddata.Sign(signers, true);
    }