2

我想使用 2048 位 DSA 密钥,并且我使用的是 .NET DSACryptoServiceProvider。我在将关键参数加载到 .NET 对象时遇到问题DSAParameters,因此我编写了以下代码来输出 a 的有效密钥大小DSACryptoServiceProvider

DSACryptoServiceProvider sampleDSA = new DSACryptoServiceProvider();
Console.Write("----- DSA LEGAL KEY SIZES -----\n");
foreach (KeySizes ks in sampleDSA.LegalKeySizes)
{
  Console.WriteLine("Min: " + ks.MinSize.ToString());
  Console.WriteLine("Max: " + ks.MaxSize.ToString());
}

数组中只有一个KeySizes对象,输出如下:

----- DSA LEGAL KEY SIZES -----
Min: 512
Max: 1024

有没有办法使用 2048 位密钥DSACryptoServiceProvider?不能使用 1024 位密钥。

- - 编辑 - - -

我列举了所有处理数字签名的LegalKeySizes.NET类。CryptoServiceProvider结果如下。

System.Security.Cryptography.DSACryptoServiceProvider
Min: 512
Max: 1024

System.Security.Cryptography.RSACryptoServiceProvider
Min: 384
Max: 16384

System.Security.Cryptography.ECDsaCng
Min: 256
Max: 384
Min: 521
Max: 521

我的意思是:有没有办法调整它以使用 2048 位密钥DSACryptoServiceProvider,或者我是否锁定在 512-1024 位范围内?

4

2 回答 2

4

.NET 4.6.2 添加了 DSACng,它是 DSA 的 FIPS-186-3 兼容实现。DSACryptoServiceProvider 仅限于 FIPS-186-1(具有 1024 位密钥限制)。

除了构造对象之外,您应该避免依赖具体类型,而应仅使用 DSA 基类上的成员。

using (DSA dsaPublicPrivate = new DSACng(2048))
using (DSA dsaPublic = new DSACng())
{
    dsaPublic.ImportParameters(dsaPublicPrivate.ExportParameters(false));

    byte[] signature = dsaPublicPrivate.SignData(data, HashAlgorithmName.SHA256);
    bool isValid = dsaPublic.VerifyData(data, signature, HashAlgorithmName.SHA256);

    ...
}
于 2016-07-01T00:33:03.540 回答
2

根据您发布的合法密钥大小输出,.NET 实现将无法使用超过 1024 位。

也许其他一些加密货币提供商会起作用?我之前使用过 Bouncycastle (www.bouncycastle.org) .NET 提供程序来处理 .NET 提供程序无法完成的事情。

于 2012-07-10T16:55:42.560 回答