DSACryptoServiceProvider.ToXmlString выдает исключение «Указаны недопустимые флаги»

Я пытаюсь сгенерировать пару ключей с помощью DSACryptoServiceProvider.

Вот код:

        var cspParameters = new CspParameters();
        cspParameters.Flags = CspProviderFlags.CreateEphemeralKey;
        cspParameters.KeyContainerName = Guid.NewGuid().ToString();

        DSA dsa = new DSACryptoServiceProvider(2048, cspParameters); // Generate a new 2048 bit RSA key

        string publicPrivateKeyXML = dsa.ToXmlString(true);
        string publicOnlyKeyXML = dsa.ToXmlString(false);

dsa.ToXmlString(true); я получаю следующее исключение: Указаны недопустимые флаги. Что случилось?


person Arsen Zahray    schedule 19.06.2012    source источник


Ответы (3)


Свойство максимального размера ключа — 1024, см. эту статью: Свойство DSACryptoServiceProvider.KeySize

«Этот алгоритм поддерживает длину ключа от 512 до 1024 бит с шагом 64 бита».

person David Martin    schedule 19.06.2012
comment
Неправильный ответ. Послушайте, вы правы в том, что OP использует слишком большой размер, но измените размер на 1024, и он все равно будет размазываться. - person Joshua; 19.04.2016

Проблема 1: Вы должны потребовать криптоконтейнер, поддерживающий DH.

Проблема 2: Размер ключа не должен быть больше 1024 (винда тупая).

    var cspParameters = new CspParameters(13); // 13 = PROV_DSS_DH which is not exported
    cspParameters.Flags = CspProviderFlags.CreateEphemeralKey;

    DSA dsa = new DSACryptoServiceProvider(1024, cspParameters); // Generate a new 2048 bit RSA key

    string publicPrivateKeyXML = dsa.ToXmlString(true);
    string publicOnlyKeyXML = dsa.ToXmlString(false);

Однако при тестировании вы обнаружите проблему 3:

Проблема 3: CreateEphemeralKey незаметно игнорируется DSACryptoProvider.

Получите копию DSAManaged от Mono, если хотите, чтобы она работала.

person Joshua    schedule 19.04.2016

Здесь есть пара проблем.

  1. (Источник «Недопустимых флагов») Вы запросили эфемерный ключ, но затем назвали его. Имя ключа помечает его как сохраненное; Итак, вы запросили постоянный эфемерный ключ, и система запуталась.
  2. DSACryptoServiceProvider не поддерживает обновления FIPS-186-3 для DSA. Вам нужно использовать DSA-1024 или обновиться до .NET 4.6.2 и использовать DSACng, который поддерживает FIPS-186-3 (увеличенный размер ключа и хеширование SHA-2 (SHA256, SHA384, SHA512)).
  3. Объект CspParameters по умолчанию имеет ProviderType=24, что для RSA. Вам нужно использовать 13, то есть для DSA. Магические числа менее волшебны в wincrypt.h (PROV_RSA_AES=24, PROV_DSS_DH=13).
  4. Если вам нужен эфемерный DSACryptoServiceProvider, самый простой способ — не указывать объект CspParameters и позволить ему использовать значение по умолчанию.

Любая из этих работ:

{
    const int PROV_DSS_DH = 13;
    var cspParameters = new CspParameters(PROV_DSS_DH);
    DSA dsa = new DSACryptoServiceProvider(1024, cspParameters);

    string publicPrivateKeyXML = dsa.ToXmlString(true);
    string publicOnlyKeyXML = dsa.ToXmlString(false);
}

{
    const int PROV_DSS_DH = 13;
    var cspParameters = new CspParameters(PROV_DSS_DH);
    cspParameters.Flags = CspProviderFlags.CreateEphemeralKey;

    DSA dsa = new DSACryptoServiceProvider(1024, cspParameters);

    string publicPrivateKeyXML = dsa.ToXmlString(true);
    string publicOnlyKeyXML = dsa.ToXmlString(false);
}

{
    DSA dsa = new DSACryptoServiceProvider(1024);

    string publicPrivateKeyXML = dsa.ToXmlString(true);
    string publicOnlyKeyXML = dsa.ToXmlString(false);
}
person bartonjs    schedule 14.08.2016