2012-07-10 106 views
1

我想使用2048位DSA密钥,并且我正在使用.NET DSACryptoServiceProvider。我是有麻烦的关键参数装载到.NET DSAParameters对象,所以我写下面的代码输出有效密钥大小为DSACryptoServiceProvider.NET 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位密钥不是一个选项。

----编辑-----

我所列举的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 

我的意思问是:是否有办法来调整这个使用DSACryptoServiceProvider使用2048位的密钥,还是我锁在512-1024位范围?

回答

2

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

也许一些其他的加密提供者会工作?我以前使用Bouncycastle(www.bouncycastle.org).NET提供程序来处理.NET提供程序无法执行的操作。

+0

由@bartonjs发布,.NET Framework 4.6.2增加了对FIPS 186-3数字签名算法(DSA)的支持。 (请参阅https://blogs.msdn.microsoft.com/dotnet/2016/08/02/announcing-net-framework-4-6-2/) – David 2016-08-05 12:15:46

1

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

    ... 
}