我想在 C# 中使用 CryptoAPI 来访问证书存储和签名消息。
这篇 MSDN 文章“CAPICOM:CryptoAPI Made Easy”展示了两种方法:使用 CAPICOM 或 P/Invoke。
哪个最好?CAPICOM.dll 或 P/Invoke
[DllImport("crypt32.dll", ...)]
“crypt32.dll”是否总是出现在任何机器上?
我想在 C# 中使用 CryptoAPI 来访问证书存储和签名消息。
这篇 MSDN 文章“CAPICOM:CryptoAPI Made Easy”展示了两种方法:使用 CAPICOM 或 P/Invoke。
哪个最好?CAPICOM.dll 或 P/Invoke[DllImport("crypt32.dll", ...)]
“crypt32.dll”是否总是出现在任何机器上?
CAPICOM 是一项已被 Microsoft 弃用的旧技术。P/Invoke (Platform Invoke) 允许托管代码调用在 DLL 中实现的非托管代码。
它是 CryptoAPI 库的基于 COM 的包装器。您发布的文章是 2003 年的。那是 8 年前的事了,技术已经发展。
此处 MSDN 上的这篇文章建议您使用 .NET 框架来代替 CAPICOM 的安全功能。
crypt32 的可用性不应该成为一个问题,而capicom则可以。
尽管如此,在前往 p\invoke 之前,您应该确保 .Net 中没有托管包装器
使用 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);
}