CAPICOM vs P/Invoke
本文关键字:Invoke vs CAPICOM | 更新日期: 2023-09-27 18:04:03
我想在c#中使用CryptoAPI访问证书存储和签名消息。
这篇MSDN文章"CAPICOM: CryptoAPI变得简单"展示了两种方法:使用CAPICOM或p/Invoke。
-
哪个是最好的?CAPICOM.dll或P/Invoke
[DllImport("crypt32.dll", ...)]
-
"crypt32.dll"总是存在于任何机器上吗?
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);
}