Мое приложение возьмет набор файлов и подпишет их. (Я не пытаюсь подписать сборку.) Есть файл .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 на С#, и я должен использовать тот же тип шифрования для подписи файлов, поэтому я застрял с RSA + SHA256.
Как я могу это сделать, используя Bouncy Castle, OpenSSL.NET, Security.Cryptography или другую стороннюю библиотеку, о которой я не слышал? Я предполагаю, что если это можно сделать в Java, то это можно сделать на С#.
UPDATE:
это то, что я получил от ссылки в 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 из файла хранилища ключей. Это правильно?