【问题标题】:DSACryptoServiceProvider.ToXmlString throws 'Invalid flags specified' exceptionDSACryptoServiceProvider.ToXmlString 抛出“指定的标志无效”异常
【发布时间】:2012-06-21 10:03:05
【问题描述】:

我正在尝试使用 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); 我收到以下异常:指定的标志无效。怎么了?

【问题讨论】:

    标签: c# .net cryptography dsa


    【解决方案1】:

    这里有几个问题。

    1. (“无效标志”的来源)您请求了一个临时密钥,但随后将其命名。命名一个键将其标记为持久化;所以你要求一个持久的临时密钥,系统很混乱。
    2. DSACryptoServiceProvider 不支持 DSA 的 FIPS-186-3 更新。您需要使用 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);
    }
    

    【讨论】:

      【解决方案2】:

      问题 1:您必须要求一个支持 DH 的加密容器。

      问题 2:密钥大小不能大于 1024(Windows 很笨)。

          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 悄悄忽略。

      如果您想要一份有效的,请从 Mono 获取 DSAManaged 的​​副本。

      【讨论】:

        【解决方案3】:

        最大keysize属性为1024,见这篇文章:DSACryptoServiceProvider.KeySize Property

        “此算法支持从 512 位到 1024 位的密钥长度,以 64 位为增量。”

        【讨论】:

        • 错误答案。看你是对的,使用太大的尺寸来邻接 OP,但将尺寸更改为 1024,它仍然会飞溅。
        猜你喜欢
        • 1970-01-01
        • 2016-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-29
        • 2012-10-12
        • 1970-01-01
        • 2014-02-23
        相关资源
        最近更新 更多