DSACryptoServiceProvider.ToXmlString抛出'指定的无效标志'异常

时间:2012-06-19 11:10:14

标签: c# .net cryptography dsa

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

3 个答案:

答案 0 :(得分:0)

最大密钥大小属性为1024,请参阅此文章:DSACryptoServiceProvider.KeySize Property

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

答案 1 :(得分:0)

问题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:DSACryptoProvider会悄悄忽略CreateEphemeralKey。

如果你想要一个有效的DSAManaged,请从Mono获得一份DSAManaged。

答案 2 :(得分:0)

这里有几个问题。

  1. (“无效标志”的来源)您已请求临时密钥,但随后将其命名。命名一个键将其标记为持久;所以你要求一个持久的临时密钥,系统很困惑。
  2. DSACng不支持对DSA的FIPS-186-3更新。您需要使用DSA-1024或升级到.NET 4.6.2并使用CspParameters,它支持FIPS-186-3(密钥大小增加,SHA-2(SHA256,SHA384,SHA512)哈希)
  3. 默认ProviderType对象的{ 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); } = 24,适用于RSA。您需要使用13,这适用于DSA。在wincrypt.h中,神奇的数字不那么神奇(PROV_RSA_AES = 24,PROV_DSS_DH = 13)。
  4. 如果您想要一个短暂的DSACryptoServiceProvider,最简单的方法是不指定CspParameters对象,并让它使用默认值。
  5. 任何这些工作:

    {{1}}