我希望在CryptoAPI中使用C#访问证书存储和签名消息。
这篇MSDN文章"CAPICOM: CryptoAPI变得容易“展示了两种方法:使用CAPICOM或P/Invoke。
[DllImport("crypt32.dll", ...)]发布于 2011-07-28 14:30:02
CAPICOM是微软( Microsoft )已经/正在反对的一项古老技术。P/Invoke (平台调用)允许托管代码调用在DLL中实现的非托管代码。
它是一个基于COM的CryptoAPI库包装器.你贴的那篇文章是2003年写的。那是8年前的事了,技术已经向前发展了。
本文在MSDN这里为建议您使用.NET框架提供安全特性,以代替CAPICOM。
发布于 2011-07-28 14:29:46
密码32的有效性不应该反对一个问题,而卡皮科姆应该反对。
不过,在同样的注意事项上,您应该确保.Net中没有托管包装器,然后再转到p\invoke
发布于 2011-07-28 14:42:37
使用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);
}https://stackoverflow.com/questions/6860402
复制相似问题