0

我正在尝试使用 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);我收到以下异常:Invalid flags specified。怎么了?

4

3 回答 3

0

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

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

于 2012-06-19T11:26:04.920 回答
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:CreateEphemeralKey 被 DSACryptoProvider 悄悄忽略。

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

于 2016-04-19T16:30:10.380 回答
0

这里有几个问题。

  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);
}
于 2016-08-14T18:27:57.057 回答