我的应用程序将获取一组文件并对其进行签名。(我不是要对程序集进行签名。)我从中获取了一个.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);
根据这个答案,这是不可能的(RSACryptoServiceProvider它不支持SHA-256),但是我希望可以使用不同的库(例如Bouncy Castle)来实现。
我是新手,发现Bouncy Castle非常令人困惑。我正在将Java应用程序移植到C#,并且必须使用相同类型的加密来对文件进行签名,因此我陷入了RSA + SHA256的困境。
如何使用Bouncy Castle,OpenSSL.NET,Security.Cryptography或我未曾听说的其他第三方库来执行此操作?我假设,如果可以用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。那是对的吗?
撒科打诨