System.Security.Cryptography与Windows.Security.Cryptography

时间:2012-10-08 22:37:49

标签: c# encryption windows-8

我是一名新的Windows 8开发人员,我有一些专为Linux设计的代码,但只要安装了GTK#,就可以在Windows上运行。

我目前正在将该应用程序移植到Windows 8作为Modern UI(Metro)应用程序。它很顺利,除了当我尝试导入我的密钥派生代码(它获取用户的密码并从中获取密钥256位密钥)时,Visual Studio Ultimate 2013表明它无法识别using System.Security.Cryptography

在查看Windows 8开发人员网站后,我发现有一个新类Windows.Security.Cryptography可用,但是,Visual Studio似乎也无法识别它。

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

  1. Windows 8中是否提供System.Security.Cryptography?如果是这样,是否支持RT版本?如何让Visual Studio识别它?
  2. Windows.System.Security是如何不同的,是否有与Rfc2898DeriveBytes兼容的类/方法?通过兼容,我的意思是给出相同的密码和盐有一种方法来获得相同的密钥。
  3. 为了澄清我想做什么,我的密钥派生代码发布在下面:

    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;
        }
    }
    

2 个答案:

答案 0 :(得分:11)

1)Windows Store Apps上没有System.Security.Cryptography,因此您必须使用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

答案 1 :(得分:4)

Windows.Security.Cryptography及其子命名空间可能就是这样。

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