.NET DSACryptoServiceProvider密钥大小

时间:2012-07-10 15:16:47

标签: c# .net security public-key-encryption public-key

我想使用2048位DSA密钥,而我使用的是.NET DSACryptoServiceProvider。我在将关键参数加载到.NET DSAParameters对象时遇到问题,因此我编写了以下代码来输出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

有没有办法使用DSACryptoServiceProvider获得2048位密钥?使用1024位密钥不是一种选择。

---- ----- EDIT

我列举了处理数字签名的所有.NET LegalKeySizes类的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

我想问的是:有没有办法调整它以使用DSACryptoServiceProvider使用2048位密钥,还是我锁定在512-1024位范围内?

2 个答案:

答案 0 :(得分:2)

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

也许其他一些加密提供程序可行?我之前使用过Bouncycastle(www.bouncycastle.org).NET提供程序来处理.NET提供程序无法做到的事情。

答案 1 :(得分:2)

.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);

    ...
}