Подтвердить что ты не робот

System.Security.Cryptography vs. Windows.Security.Cryptography

Я новый разработчик 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;
    }
}
4b9b3361

Ответ 2

1) System.Security.Cryptography недоступна в приложениях Windows Store, поэтому вам придется использовать Windows.Security.Cryptography. См. Ссылку ниже, чтобы получить хорошее объяснение повторного использования библиотек классов для разных целевых инфраструктур с помощью переносных библиотек .NET. При необходимости вы всегда можете вводить абстракцию, используя ваш любимый контейнер IoC.

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

2) Я не вижу реализации Rfc2898DeriveBytes в Windows.Security.Cryptography или что-то подобное. См. Ниже.

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

Ответ 3

Кто-нибудь знает, как загрузить "Windows.Security.Cryptography.Core.dll" и "Windows.dll", необходимые для кода?