2012-05-03 37 views
1

我目前正在開發一個需要文件加密的城域應用程序(C#/ XAML)。 在WinForms和WPF的,我只需要編寫WinRT中的文件加密

System.IO.File.Encrypt("file.txt"); 

如何做相同的WinRT的?

回答

1

據我所知,WinRT是爲在沙箱中運行並且沒有直接文件系統訪問的應用程序而設計的。

您可能需要一個非WinRT(例如Win32/.NET桌面API)服務才能進行直接文件系統訪問,並讓WinRT應用程序與該服務進行通信。

0

不幸的是,這需要在WinRT中做更多的工作。由於大多數功能都是異步的,因此您需要更多的鍋爐板,並且您將在流和IBuffers上運行,而不是直接運行文件。加密類位於Windows.Security.Cryptography名稱空間中。

一個IBuffer的例子可以找到here

+2

這不會與文件系統以任何方式集成加密的文件,例如多用戶訪問,如果密碼被強制更改則撤銷訪問,並且恢復證書不起作用。 –

+0

這是真的,但OP沒有提到需要集成文件系統加密,只是對文件進行加密。這可以使用上述的API。您的文章確實提到了使用服務來訪問文件系統,這是公平的,並且如果文件系統集成是一項要求,則是正確的選擇。 – linuxuser27

+2

我想我解釋爲「使用相同的」作爲使用EFS的要求。 –

4

首先,我絕對不會使用System.IO.File.Encrypt來加密文件。
其次,我會看看下列文件:Windows Runtime API
三我會使用類似的mehod描述herehere

public MainWindow() 
{ 
    InitializeComponent(); 

    byte[] encryptedPassword; 

    // Create a new instance of the RijndaelManaged 
    // class. This generates a new key and initialization 
    // vector (IV). 
    using (var algorithm = new RijndaelManaged()) 
    { 
     algorithm.KeySize = 256; 
     algorithm.BlockSize = 128; 

     // Encrypt the string to an array of bytes. 
     encryptedPassword = Cryptology.EncryptStringToBytes("Password", 
                algorithm.Key, algorithm.IV); 
    } 

    string chars = encryptedPassword.Aggregate(string.Empty, 
             (current, b) => current + b.ToString()); 

Cryptology.EncryptFile(@"C:\Users\Ira\Downloads\test.txt", @"C:\Users\Ira\Downloads\encrypted_test.txt", chars); 

Cryptology.DecryptFile(@"C:\Users\Ira\Downloads\encrypted_test.txt", @"C:\Users\Ira\Downloads\unencyrpted_test.txt", chars); 
} 
+0

@ Kip9000 - 您的一些代碼更改無效,實際上更改了代碼。您的更改沒有改善任何內容,不確定更改的目的,格式是否正常。 –

+0

已將代碼格式化以使其不會顯示滾動條。更改了代碼以刪除長文件路徑,因爲它們是多餘的。長文件路徑不會向代碼中添加任何內容,也不會使其難以閱讀。 – Indy9000

+0

@ Kip9000 - 我不認爲它們是多餘的,我不同意這種改變。我寧願刪除答案,然後讓它改變。 –