我想使用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位范围内?
答案 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);
...
}