14

私は新しいWindows8開発者です。Linux用に設計されたコードがいくつかありますが、GTK#がインストールされている限りWindowsでも実行されます。

私は現在、そのアプリケーションをモダンUI(Metro)アプリとしてWindows8に移植しています。キー派生コード(ユーザーのパスワードを取得し、そこからキー256ビットキーを取得する)をインポートしようとすると、Visual Studio Ultimate 2013が認識しないことを示すことを除いて、問題はありませんusing System.Security.Cryptography

Windows 8開発者のWebサイトを調べたところ、新しいクラスWindows.Security.Cryptographyが利用可能であることがわかりましたが、VisualStudioでも認識されていないようです。

それで、あなたが背景を持っているので、私はいくつかの質問があります:

  1. System.Security.CryptographyはWindows8で利用できますか?もしそうなら、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 に答える