2011-05-31 15 views
7

Mi producto debe ser capaz de generar archivos .snk (sin tener instalados SDK de Microsoft en el sistema). Puedo generar un archivo SNK en funcionamiento, pero parece que no puedo hacerlo funcionar cuando especifico una contraseña. ¿Alguien puede darme algunos consejos? Esto es lo que tengo hasta ahora:Cómo generar un archivo de clave SNK con nomenclatura para bibliotecas .net

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

Cuando 'contraseña' no es nulo, "provider.ExportCspBlob" genera el error "tipo especificado no válido" – Adam

Respuesta

2

El parámetro KeyPassword utiliza está destinado para otro fin que el que usted está tratando de utilizarlo. A partir de la documentación:

utilizar la propiedad KeyPassword para suministrar una contraseña para una llave inteligente tarjeta . Cuando especifica una contraseña usando esta propiedad, no se le presentará al usuario un cuadro de diálogo de contraseña .

Véase también la respuesta a esta pregunta: Simple use of RSACryptoServiceProvider KeyPassword fails

Además de esto, no parece que puede proteger .snk archivos con una contraseña. En este caso, lo que puede hacer es utilizar un archivo PKCS # 12 (.pfx) que puede usarse para firmar los ensamblajes y también puede protegerse mediante contraseña. Puede generar un archivo PKCS # 12 usando una biblioteca como BouncyCastle.NET. Existe una buena documentación sobre cómo hacer esto, así que no entraré en detalles aquí.

Véase, por ejemplo: Is it possible to programmatically generate an X509 certificate using only C#?

Cuestiones relacionadas