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:
- ¿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?
- ¿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;
}
}
'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. –
¿Deben agregarse referencias manualmente para algunas clases? – Razick
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). –