14

我是一名新的 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 似乎也无法识别它。

所以,既然你有了背景,我有几个问题:

  1. System.Security.Cryptography 在 Windows 8 中可用吗?如果支持,是否支持 RT 版本?如何让 Visual Studio 识别它?
  2. 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;
    }
}
4

2 回答 2

11

1) System.Security.Cryptography 在 Windows 应用商店应用中不可用,因此您必须使用 Windows.Security.Cryptography。有关使用 .NET 可移植库为不同目标框架重用类库的详细说明,请参阅下面的链接。如果需要,您始终可以使用您最喜欢的 IoC 容器注入抽象。

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

2) 我在 Windows.Security.Cryptography 或类似的东西中看不到 Rfc2898DeriveBytes 的实现。见下文。

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

于 2013-01-25T20:08:31.673 回答
4

Windows.Security.Cryptography 及其子命名空间可能是要走的路。

请参阅http://msdn.microsoft.com/en-us/library/windows/apps/windows.security.cryptography.core.cryptographicengine.derivekeymaterial.aspx了解使用多种算法派生密钥材料的方法。

于 2012-11-11T17:47:57.540 回答