2012-06-19 20 views
0

我試圖用DSACryptoServiceProvider生成密鑰對。DSACryptoServiceProvider.ToXmlString拋出'指定的無效標誌'異常

下面的代碼:

 var cspParameters = new CspParameters(); 
     cspParameters.Flags = CspProviderFlags.CreateEphemeralKey; 
     cspParameters.KeyContainerName = Guid.NewGuid().ToString(); 

     DSA dsa = new DSACryptoServiceProvider(2048, cspParameters); // Generate a new 2048 bit RSA key 

     string publicPrivateKeyXML = dsa.ToXmlString(true); 
     string publicOnlyKeyXML = dsa.ToXmlString(false); 

dsa.ToXmlString(true);我得到以下異常:無效標誌指定。怎麼了?

回答

0

最大密鑰大小屬性爲1024,請參見本文:「這算法支持從512位到64位的增量1024位的密鑰長度」 DSACryptoServiceProvider.KeySize Property

+0

錯誤答案。看起來你是正確的選擇使用太大的大小,但改變大小爲1024,它仍然是摔得痛。 – Joshua

0

問題1:您必須要求一個支持DH的加密容器。

問題2:密鑰大小不能大於1024(Windows是愚蠢的)。

var cspParameters = new CspParameters(13); // 13 = PROV_DSS_DH which is not exported 
    cspParameters.Flags = CspProviderFlags.CreateEphemeralKey; 

    DSA dsa = new DSACryptoServiceProvider(1024, cspParameters); // Generate a new 2048 bit RSA key 

    string publicPrivateKeyXML = dsa.ToXmlString(true); 
    string publicOnlyKeyXML = dsa.ToXmlString(false); 

Howevre上測試此,你會發現問題3:

問題3:CreateEphemeralKey正在悄然通過DSACryptoProvider忽略。

如果你想要一個可以工作的,可以從Mono獲得DSAManaged的副本。

0

這裏有幾個問題。

  1. (「無效標誌」的來源)您請求了一個臨時密鑰,但隨後將其命名。命名一個鍵將其標記爲持久;所以你要求一個持久的臨時密鑰,而且這個系統很混亂。
  2. DSACryptoServiceProvider不支持DSA的FIPS-186-3更新。您需要使用DSA-1024或升級到.NET 4.6.2並使用DSACng,它支持FIPS-186-3(增加密鑰大小和SHA-2(SHA256,SHA384,SHA512)哈希)。對象有ProviderType = 24,這是RSA。你需要使用13,這是DSA。 wincrypt.h中的神奇數字不太神奇(PROV_RSA_AES = 24,PROV_DSS_DH = 13)。
  3. 如果你想要一個短暫的DSACryptoServiceProvider,最簡單的方法是不指定CspParameters對象,並讓它使用默認值。

任何這些工作:

{ 
    const int PROV_DSS_DH = 13; 
    var cspParameters = new CspParameters(PROV_DSS_DH); 
    DSA dsa = new DSACryptoServiceProvider(1024, cspParameters); 

    string publicPrivateKeyXML = dsa.ToXmlString(true); 
    string publicOnlyKeyXML = dsa.ToXmlString(false); 
} 

{ 
    const int PROV_DSS_DH = 13; 
    var cspParameters = new CspParameters(PROV_DSS_DH); 
    cspParameters.Flags = CspProviderFlags.CreateEphemeralKey; 

    DSA dsa = new DSACryptoServiceProvider(1024, cspParameters); 

    string publicPrivateKeyXML = dsa.ToXmlString(true); 
    string publicOnlyKeyXML = dsa.ToXmlString(false); 
} 

{ 
    DSA dsa = new DSACryptoServiceProvider(1024); 

    string publicPrivateKeyXML = dsa.ToXmlString(true); 
    string publicOnlyKeyXML = dsa.ToXmlString(false); 
}