【发布时间】:2011-11-18 15:56:36
【问题描述】:
我的应用程序将获取一组文件并对其进行签名。 (我不是要签署程序集。)我可以从一个 .p12 文件中获取私钥。
这是我尝试使用的代码,但我得到了 System.Security.Cryptography.CryptographicException "Invalid algorithm specified."。
X509Certificate pXCert = new X509Certificate2(@"keyStore.p12", "password");
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)pXCert.PrivateKey;
string id = CryptoConfig.MapNameToOID("SHA256");
return csp.SignData(File.ReadAllBytes(filePath), id);
根据answer 无法完成(RSACryptoServiceProvider 不支持 SHA-256),但我希望可以使用不同的库,例如 Bouncy Castle。
我是新手,我发现 Bouncy Castle 非常令人困惑。我正在将 Java 应用程序移植到 C#,并且我必须使用相同类型的加密来签署文件,所以我坚持使用 RSA + SHA256。
如何使用 Bouncy Castle、OpenSSL.NET、Security.Cryptography 或其他我没听说过的第 3 方库来做到这一点?我假设,如果它可以在 Java 中完成,那么它可以在 C# 中完成。
更新:
这是我从 poupou 的 anwser 中的链接得到的
X509Certificate2 cert = new X509Certificate2(KeyStoreFile, password");
RSACryptoServiceProvider rsacsp = (RSACryptoServiceProvider)cert.PrivateKey;
CspParameters cspParam = new CspParameters();
cspParam.KeyContainerName = rsacsp.CspKeyContainerInfo.KeyContainerName;
cspParam.KeyNumber = rsacsp.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2;
RSACryptoServiceProvider aescsp = new RSACryptoServiceProvider(cspParam);
aescsp.PersistKeyInCsp = false;
byte[] signed = aescsp.SignData(File.ReadAllBytes(file), "SHA256");
bool isValid = aescsp.VerifyData(File.ReadAllBytes(file), "SHA256", signed);
问题是我得到的结果与使用原始工具不同。据我通过阅读代码可以看出,进行实际签名的 CryptoServiceProvider 没有使用密钥存储文件中的 PrivateKey。对吗?
【问题讨论】:
标签: c# .net cryptography openssl bouncycastle