2012-10-08 40 views
12

Soy un nuevo desarrollador de Windows 8, tengo un código que fue diseñado para Linux pero también se ejecutó en Windows, siempre que se instaló GTK #.System.Security.Cryptography vs. Windows.Security.Cryptography

Actualmente estoy transfiriendo esa aplicación a Windows 8 como una aplicación de interfaz de usuario moderna (Metro). Está yendo bien, excepto cuando trato de importar mi código de derivación de clave (que toma la contraseña del usuario y deriva una clave clave de 256 bits), Visual Studio Ultimate 2013 indica que no reconoce using System.Security.Cryptography.

Después de buscar en el sitio web para desarrolladores de Windows 8, encontré que está disponible una nueva clase, Windows.Security.Cryptography, sin embargo, tampoco parece ser reconocida por Visual Studio.

Así que, ahora que tiene el fondo, tengo algunas preguntas:

  1. ¿Es System.Security.Cryptography disponible en Windows 8? Si es así, ¿es compatible la versión RT? ¿Cómo puedo hacer que Visual Studio lo reconozca?
  2. ¿En qué se diferencia Windows.System.Security y existe una clase/método compatible con Rfc2898DeriveBytes? Por compatible, quiero decir que con la misma contraseña y sal, hay una forma de obtener la misma clave como resultado.

Para mayor claridad en cuanto a lo que quiero hacer, mi código de derivación de claves se publican a continuación:

public class GetKey 
{ 
    // constructor 
    public GetKey (bool use=true, string password="none") 
    { if (use == true) 
     { 
      this.genSalt(); 
      byte[] salt = this.salt; 
      Rfc2898DeriveBytes pwdKey = new Rfc2898DeriveBytes(password, salt, 4000); 
      this.key = pwdKey.GetBytes(32); 
      this.iv = pwdKey.GetBytes(16); 
     } 
    } 

    // properties 
    private byte[] key; 
    private byte[] iv; 
    private byte[] salt; 

    // methods 
    public void retrieveKey(string password) 
    { 
     try 
     { 
      byte[] salt = this.salt; 
      Rfc2898DeriveBytes pwdKey = new Rfc2898DeriveBytes(password, salt, 4000); 
      this.key = pwdKey.GetBytes(32); 
      this.iv = pwdKey.GetBytes(16); 
     } 
     catch (Exception e) 
     { 
      GenericDialog win = new GenericDialog("Unknown Error: " + e.Message, "Error Notice", "Unknown Error"); 
      win.Show(); 
     } 
    } 

    public void genSalt() 
    { 
     string sSalt = UtilityClass.randString(16); 
     byte[] salt = UtilityClass.ToByteArray(sSalt); 
     this.salt = salt; 
    } 

    public byte[] returnKey() 
    { 
     return this.key; 
    } 

    public byte[] returnIv() 
    { 
     return this.iv; 
    } 

    public byte[] returnSalt() 
    { 
     return this.salt; 
    } 
    public bool setSalt(string salt) 
    { 
     try 
     { 
      this.salt = Convert.FromBase64String(salt); 
     } 
     catch 
     { 
      GenericDialog win = new GenericDialog("Decryption failed because the salt was invalid.", "Error Notice", "Invalid Salt"); 
      win.Show(); 
      return false; 
     } 
     return true; 
    } 
} 
+0

'Windows.Security.Cryptography' sólo parece contener tres clases más o menos, no lo que está buscando, supongo. No veo ninguna razón por la cual 'System.Security.Cryptography' no debe ser parte de Windows 8. Está en .NET framework, entonces ¿por qué no? Creo que estás sufriendo de un problema de referencia faltante. –

+0

¿Deben agregarse referencias manualmente para algunas clases? – Razick

+1

sí, deberá agregar la referencia a System.Security y luego System.Security.Cryptography se resolverá, pero para las aplicaciones de escritorio de Windows 8, no solo Windows Store (nee Metro). –

Respuesta

11

1) System.Security.Cryptography no está disponible en Windows Store Apps, por lo que deberá usar Windows.Security.Cryptography. Consulte el enlace a continuación para obtener una buena explicación sobre la reutilización de bibliotecas de clases para diferentes marcos de destino con bibliotecas portátiles .NET. Si es necesario, siempre puede inyectar una abstracción usando su contenedor IoC favorito.

http://www.hanselman.com/blog/HiddenGemsInVisualStudio11BetaNETPortableClassLibraries.aspx

2) No veo una implementación de Rfc2898DeriveBytes en Windows.Security.Cryptography o algo similar. Vea abajo.

http://msdn.microsoft.com/en-us/library/windows/apps/windows.security.cryptography.core.symmetricalgorithmnames.aspx

Cuestiones relacionadas