Почему я получаю исключение "Указан неверный алгоритм" - PullRequest
17 голосов
/ 15 сентября 2011

Вот мой код.

X509Certificate pXCert = new X509Certificate2(@"keyStore.p12", "password");
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)pXCert.PrivateKey;
string id = CryptoConfig.MapNameToOID("SHA256");
return csp.SignData(File.ReadAllBytes(filePath), id);

В последней строке я получаю исключение:

System.Security.Cryptography.CryptographicException «Указан неверный алгоритм.»

Что я делаю не так?

ОБНОВЛЕНИЕ:

id = 2.16.840.1.101.3.4.2.1

Ответы [ 4 ]

11 голосов
/ 15 сентября 2011

Нет проблем с предоставленным вами кодом .NET или кодом CSP.

Ваша проблема в том, что CSP просто не поддерживает SHA 256. Дополнительную информацию можно получить здесь

6 голосов
/ 06 апреля 2016

Обратите внимание, что я использую SHA512, но SHA256 будет работать с приведенными ниже примерами:

"Указан неверный алгоритм" У меня ушло на то, чтобы понять, и я попробовал практически все.Рекомендую Гонсало Галлотти за размещение ссылки на фрагмент кода, который мне помог.Я прокомментировал свой код, чтобы показать, что делает каждый шаг.ПРИМЕЧАНИЕ: этот код не будет работать без правильно сгенерированного сертификата, который размещен под образцом кода:

public void GetCertificate() {

    // Get the Machine Cert Store
    var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

    string alg = CryptoConfig.MapNameToOID("SHA512");

    // Open the cert store
    store.Open(OpenFlags.ReadWrite);

    // Loop through each certificate within the store
    foreach (X509Certificate2 myCert in store.Certificates)
    {
        // Get the certificate we are looking for
        if (myCert.IssuerName.Name.Contains("CN=YourSite"))
        {
            // Check if the certificate has a private key
            if (myCert.HasPrivateKey)
            {
                // Get your custom signature as a string
                string mySignature = GetSignatureString();

                // Convert signature to byte array
                byte[] originalData = Encoding.UTF8.GetBytes(mySignature);

                // Create RSA provider from private key
                RSACryptoServiceProvider rsaProvider = (RSACryptoServiceProvider)myCert.PrivateKey;

                // Sign the signature with SHA512
                byte[] signedSignature = signedSignature = rsaProvider.SignData(originalData, alg);

                if (rsaProvider.VerifyData(originalData, alg, signedSignature))
                {
                    // Signature is verified Do Stuff
                }
                else
                {
                    throw new Exception("The data does not match the signature.");
                }
            }
        }
    }
}

Далее - сертификат должен быть SHA512 и использовать CSP (поставщик услуг криптографии), который является SHA512Способный.Вот список CSP и их возможностей.Если вы ищете SHA512, вы найдете «Microsoft Enhanced RSA и AES Cryptographic Provider».По умолчанию генерирующие сертификаты не используют это (по крайней мере, в Windows), поэтому вы должны указать его при создании сертификата.

Создать закрытый ключ и сертификат - этот шаг будет задавать вам вопросы, состояние, регион и т. Д.и т. д.

openssl req -x509 -nodes -sha512 -newkey rsa:2048 -keyout 512key.pem -out 512cert.pem -days 3650

Создайте файл PFX для импорта в хранилище сертификатов, используя Microsoft Enhanced RSA и AES Cryptographic Provider:

openssl pkcs12 –export –in 512cert.pem –inkey 512key.pem –CSP “Microsoft Enhanced RSA and AES Cryptographic Provider” –out 512pfx.pfx
1 голос
/ 20 июня 2019

Для каркаса dot net 4.7.0 или выше не требуется sha1, поэтому настройте приведенное ниже при запуске приложения. это работало нормально для меня. AppContext.SetSwitch ("Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms", true); AppContext.SetSwitch ("Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms", true);

1 голос
/ 25 июля 2017

Возникла похожая проблема, но только что решена.Если вы не используете X509, а просто используете RSACryptoServiceProvider для получения ключей, то поддерживается только SHA1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...