2012-07-10 91 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); 

    ... 
}