Как я могу подписать файл с помощью RSA и SHA256 с .NET?

Мое приложение примет набор файлов и подпишет их. (Я не пытаюсь подписать сборку.) Есть файл .p12, из которого я получаю закрытый ключ.

Это код, который я пытался использовать, но получаю System.Security.Cryptography.CryptographicException «Указан неверный алгоритм» .

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 очень запутанным. Я портирую Java-приложение на C #, и мне приходится использовать тот же тип шифрования для подписи файлов, поэтому я застрял на RSA + SHA256.

Как я могу это сделать, используя Bouncy Castle, OpenSSL.NET, Security.Криптография или другая сторонняя библиотека, о которой я не слышал? Я предполагаю, что если это можно сделать на Java, то это можно будет сделать на C #.

ОБНОВЛЕНИЕ:

это то, что я получил по ссылке в anwser poupou

        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 из файла хранилища ключей. Это правильно?

43
задан Community 23 May 2017 в 12:02
поделиться