Я новый разработчик Windows 8, у меня есть код, предназначенный для Linux, но также работающий под Windows, пока установлен GTK #.
В настоящее время я переношу это приложение в Windows 8 как приложение современного интерфейса (Metro). Это происходит хорошо, за исключением того, что когда я пытаюсь импортировать код вывода ключа (который берет пароль пользователя и извлекает из него ключ с 256-битным ключом), Visual Studio Ultimate 2013 указывает, что он не распознает using System.Security.Cryptography
.
Изучив сайт разработчика Windows 8, я обнаружил, что доступен новый класс Windows.Security.Cryptography
, однако он, похоже, не распознается также Visual Studio.
Итак, теперь, когда у вас есть фон, у меня есть несколько вопросов:
- Доступна ли System.Security.Cryptography в Windows 8? Если да, поддерживается ли версия RT? Как я могу заставить Visual Studio распознать его?
- Как Windows.System.Security отличается, и есть ли совместимый класс/метод для Rfc2898DeriveBytes? Под совместимостью, я имею в виду, учитывая тот же пароль и соль, есть способ получить тот же ключ в результате.
Для уточнения того, что я хочу сделать, мой код деривации ключа размещен ниже:
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;
}
}