подпись с помощью SHA256

У меня есть смарт-карта и мне нужно подписать ею файл. Это большая проблема, как я вижу в stackover.

Я не мог использовать RSACryptoServiceProvider, потому что он не поддерживает алгоритм RSA-SHA256.

Сначала я использовал CAPICOM.dll, как код ниже,

SignedData sed = new SignedData();
sed.Content = "a"; // data to sign
Signer ser = new Signer();
ser.Certificate = cc;
string singnn = sed.Sign(ser, false, CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);

Но нет открытого ключа для проверки значения моей подписи, я не мог получить ключ проверки от capicom.dll.

И после,

я использовал X509Certificate2 и RSACryptoServiceProvider, как код ниже,

        X509Certificate2 certificate = new X509Certificate2();
        // Access Personal (MY) certificate store of current user
        X509Store my = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        my.Open(OpenFlags.ReadOnly);

        // Find the certificate we'll use to sign            
        RSACryptoServiceProvider csp = null;
        foreach (X509Certificate2 cert in my.Certificates)
        {
            if (cert.Subject.Contains(certSubject))
            {
                // We found it. 
                // Get its associated CSP and private key
                certificate = cert;
                csp = (RSACryptoServiceProvider)cert.PrivateKey;
            }
        }
        if (csp == null)
        {
            throw new Exception("No valid cert was found");
        }

        // Hash the data
        SHA1Managed sha1 = new SHA1Managed();
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = encoding.GetBytes(text);
        byte[] hash = sha1.ComputeHash(data);

        //byte[] data = Encoding.UTF8.GetBytes(text);
        //HashAlgorithm sha = new SHA256Managed();
        //byte[] hash = sha.TransformFinalBlock(data, 0, data.Length);

        string key = csp.ToXmlString(false);
        // Sign the hash
        csp.PersistKeyInCsp = true;
        byte[] response = csp.SignData(data, CryptoConfig.MapNameToOID("SHA1"));
        string signbase64 = Convert.ToBase64String(response);

Это работает, но мне нужно подписать с помощью алгоритма RSA-SHA256. Когда я изменяю алгоритм хеширования, подобный этому

byte[] response = csp.SignData(data, CryptoConfig.MapNameToOID("SHA256"));

, я получаю ошибку

: «неопределенная ошибка».

Это моя проблема, Каково решение или какую библиотеку я должен использовать?

Спасибо за любой совет..

5
задан Shubham Khatri 25 May 2016 в 05:26
поделиться