我是一名新的 Windows 8 开发人员,我有一些专为 Linux 设计的代码,但只要安装了 GTK#,我也可以在 Windows 上运行。
我目前正在将该应用程序作为现代 UI (Metro) 应用程序移植到 Windows 8。它进展顺利,但当我尝试导入我的密钥派生代码(它获取用户的密码并从中派生一个 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;
}
}