Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DSACryptoServiceProvider.ToXmlString抛出';指定的标志无效';例外_C#_.net_Cryptography_Dsa - Fatal编程技术网

C# DSACryptoServiceProvider.ToXmlString抛出';指定的标志无效';例外

C# DSACryptoServiceProvider.ToXmlString抛出';指定的标志无效';例外,c#,.net,cryptography,dsa,C#,.net,Cryptography,Dsa,我正在尝试使用DSACryptoServiceProvider生成密钥对 代码如下: var cspParameters = new CspParameters(); cspParameters.Flags = CspProviderFlags.CreateEphemeralKey; cspParameters.KeyContainerName = Guid.NewGuid().ToString(); DSA dsa = new

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

最大的keysize属性是1024,请参阅本文:


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

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

问题2:密钥大小不能大于1024(Windows是哑的)

然而,通过测试,您将发现问题3:

问题3:CreateEphemeralKey被DSACryptoProvider悄悄忽略


如果你想要一份有效的DSAManaged,可以从Mono上获取一份。

这里有几个问题

  • (无效标志的来源)您请求了一个临时密钥,但随后将其命名。命名密钥会将其标记为持久化;因此,您请求了一个持久化的临时密钥,系统被搞糊涂了
  • DSACryptoServiceProvider
    不支持对DSA的FIPS-186-3更新。您需要使用DSA-1024,或者升级到.NET 4.6.2并使用
    DSACng
    ,它支持FIPS-186-3(增加的密钥大小和SHA-2(SHA256、SHA384、SHA512)散列)
  • 默认的
    CspParameters
    对象具有
    ProviderType
    =24,这是用于RSA的。您需要使用13,这是用于DSA的。在wincrypt.h中,幻数不那么神奇(PROV_RSA_AES=24,PROV_DSS_DH=13)
  • 如果您想要一个短暂的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);
    }
    

    回答错了。看,你是对的,使用了太大的尺寸,但将尺寸更改为1024,它仍然会变大。
    {
        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);
    }