2012-10-08 26 views
12

Tôi là một nhà phát triển Windows 8 mới, tôi có một số mã được thiết kế cho Linux nhưng cũng chạy trên Windows miễn là GTK # đã được cài đặt.System.Security.Cryptography so với Windows.Security.Cryptography

Tôi hiện đang chuyển ứng dụng đó sang Windows 8 làm ứng dụng Giao diện người dùng hiện đại (Metro). Nó đang diễn ra tốt, ngoại trừ, khi tôi cố gắng nhập mã dẫn xuất quan trọng của mình (lấy mật khẩu của người dùng và lấy khóa chính 256 bit từ nó), Visual Studio Ultimate 2013 cho biết rằng nó không nhận ra using System.Security.Cryptography.

Sau khi xem xét trang web dành cho nhà phát triển Windows 8, tôi thấy rằng một lớp mới, Windows.Security.Cryptography có sẵn, tuy nhiên, dường như nó không được công nhận bởi Visual Studio.

Vì vậy, bây giờ mà bạn có nền, tôi có một vài câu hỏi:

  1. là System.Security.Cryptography có sẵn trong Windows 8? Nếu vậy, phiên bản RT có được hỗ trợ không? Làm thế nào tôi có thể làm cho Visual Studio nhận ra nó?
  2. Windows.System.Security khác nhau như thế nào và có lớp/phương thức tương thích với Rfc2898DeriveBytes không? Bằng cách tương thích, tôi có nghĩa là cho cùng một mật khẩu và muối là có một cách để có được cùng một khóa như một kết quả.

Để làm rõ như những gì tôi muốn làm, mã nguồn gốc chính của tôi được đăng dưới đây:

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

'Windows.Security.Cryptography' dường như chỉ có ba lớp học, hay như vậy, không phải những gì bạn đang sau khi tôi giả sử. Tôi thấy không có lý do tại sao 'System.Security.Cryptography' không phải là một phần của Windows 8. Đó là trong khuôn khổ .NET, vậy tại sao sẽ không được? Tôi nghĩ rằng bạn đang bị một vấn đề tham chiếu còn thiếu. –

+0

Tham chiếu có phải được thêm thủ công cho một số lớp không? – Razick

+1

có, bạn sẽ cần phải thêm tham chiếu đến System.Security và sau đó System.Security.Cryptography sẽ giải quyết nhưng đối với Windows 8 ứng dụng máy tính để bàn không chỉ Windows Store (nee Metro). –

Trả lời

4

Các Windows.Security.Cryptography và tiểu không gian tên của nó có lẽ là con đường để đi.

Xem http://msdn.microsoft.com/en-us/library/windows/apps/windows.security.cryptography.core.cryptographicengine.derivekeymaterial.aspx để biết cách lấy tài liệu chính bằng cách sử dụng một vài thuật toán khác nhau.

+0

Tôi thực sự ghét làm thế nào MSDN là không rõ ràng những gì flippin 'tham khảo tôi cần phải thêm để kích hoạt này' sử dụng '. –

11

1) System.Security.Cryptography không có sẵn trên Windows Store Apps, vì vậy bạn sẽ phải sử dụng Windows.Security.Cryptography. Xem liên kết bên dưới để có giải thích tốt về việc sử dụng lại thư viện lớp cho các khung mục tiêu khác nhau với thư viện di động .NET. Nếu cần thiết, bạn luôn có thể tiêm một trừu tượng bằng cách sử dụng container IoC yêu thích của bạn.

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

2) Tôi không thấy một thực hiện Rfc2898DeriveBytes trong Windows.Security.Cryptography hoặc một cái gì đó tương tự. Xem bên dưới.

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

Các vấn đề liên quan