我想在C#中使用CryptoAPI来访问证书存储和签名消息。
This MSDN article "CAPICOM: CryptoAPI Made Easy"显示了两种方法:使用CAPICOM或P / Invoke。
哪个最好? CAPICOM.dll或P / Invoke [DllImport("crypt32.dll", ...)]
任何机器上都会出现“crypt32.dll”吗?
答案 0 :(得分:4)
CAPICOM是一项旧技术,已被微软弃用。 P / Invoke(平台调用)允许托管代码调用DLL中实现的非托管代码。
它是CryptoAPI库的基于COM的包装器。你发布的文章是从2003年开始的。那是在8年前,技术已经发展了。
MSDN上的这篇文章recommends you use the .NET framework用于代替CAPICOM的安全功能。
答案 1 :(得分:1)
crypt32's availablility不应该反对问题,而capicom's会这样做。
但是在同一个注释中,你应该确保在前往p \ invoke
之前,.Net中没有托管包装器。答案 2 :(得分:1)
是否要求使用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);
}