2011-05-31 276 views
7

我的產品需要能夠生成.snk文件(不需要在系統上安裝Microsoft SDK)。 我可以生成一個工作SNK文件,但我似乎無法讓它在指定密碼時起作用。 任何人都可以給我一些指針? 這是我到目前爲止有:如何使用.net庫生成強名稱SNK密鑰文件

internal static void CreateKeyPairFile(string fileName, int keySize, string password) 
    { 
     if ((keySize % 8) != 0) 
     { 
      throw new CryptographicException("Invalid key size. Valid size is 384 to 16384 mod 8. Default 1024."); 
     } 

     CspParameters parms = new CspParameters(); 
     parms.KeyNumber = 2; 
     if (null != password) 
     { 
      var passwordString = new System.Security.SecureString(); 

      foreach (char c in password) 
      { 
       passwordString.AppendChar(c); 
      } 
      parms.Flags = CspProviderFlags.UseUserProtectedKey; 
      parms.KeyPassword = passwordString; 
     } 
     RSACryptoServiceProvider provider = new RSACryptoServiceProvider(keySize, parms); 

     byte[] array = provider.ExportCspBlob(!provider.PublicOnly); 

     using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) 
     { 
      fs.Write(array, 0, array.Length); 
     } 
    } 
+0

當「密碼」不爲空,「provider.ExportCspBlob」生成錯誤「指定了無效的類型」 – Adam 2011-05-31 04:36:42

回答

2

您使用的KeyPassword參數是用於其他用途比你要使用它的一個。從文檔:

使用KeyPassword屬性爲智能卡 密鑰提供密碼。當您使用此屬性指定密碼時,密碼 對話框將不會呈現給用戶。

又見這個問題的答案:Simple use of RSACryptoServiceProvider KeyPassword fails

除此之外,它似乎並不像你可以保護.SNK文件密碼保護。在這種情況下,您可以執行的操作是使用PKCS#12文件(.pfx),它可用於簽署程序集並且也可以使用密碼保護。您可以使用庫如BouncyCastle.NET生成PKCS#12文件。關於如何做到這一點,有很好的文檔,所以我不會在這裏詳細介紹。

參見例如:Is it possible to programmatically generate an X509 certificate using only C#?