2009-04-11 108 views
4

有點互補,但沒有辦法像this一樣問。如何在C#中創建受密碼保護的文件

如何創建受密碼保護的文件?

+0

你真的應該說什麼時候你說, 「密碼保護的文件」 你的意思。你的意思是當有人試圖打開它時,彈出一個「輸入密碼」對話框,或者是什麼? – 2009-04-11 23:14:44

+0

是的,這的確是我的意思 – Peter 2009-04-12 01:09:54

回答

9

加密:

private const int SaltSize = 8; 

public static void Encrypt(FileInfo targetFile, string password) 
{ 
    var keyGenerator = new Rfc2898DeriveBytes(password, SaltSize); 
    var rijndael = Rijndael.Create(); 

    // BlockSize, KeySize in bit --> divide by 8 
    rijndael.IV = keyGenerator.GetBytes(rijndael.BlockSize/8); 
    rijndael.Key = keyGenerator.GetBytes(rijndael.KeySize/8); 

    using(var fileStream = targetFile.Create()) 
    { 
    // write random salt 
    fileStream.Write(keyGenerator.Salt, 0, SaltSize); 

    using(var cryptoStream = new CryptoStream(fileStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write)) 
    { 
     // write data 
    } 
    } 
} 

和解密:

public static void Decrypt(FileInfo sourceFile, string password) 
{ 
    // read salt 
    var fileStream = sourceFile.OpenRead(); 
    var salt = new byte[SaltSize]; 
    fileStream.Read(salt, 0, SaltSize); 

    // initialize algorithm with salt 
    var keyGenerator = new Rfc2898DeriveBytes(password, salt); 
    var rijndael = Rijndael.Create(); 
    rijndael.IV = keyGenerator.GetBytes(rijndael.BlockSize/8); 
    rijndael.Key = keyGenerator.GetBytes(rijndael.KeySize/8); 

    // decrypt 
    using(var cryptoStream = new CryptoStream(fileStream, rijndael.CreateDecryptor(), CryptoStreamMode.Read)) 
    { 
    // read data 
    } 
} 
+0

在寫入和讀取數據時使用哪個對象? – writeToBhuwan 2013-05-06 11:31:23

+0

如果您使用CryptoStream進行網絡通信,您應該找到一個流密碼。 Rijndael通常用作分組密碼。流密碼適用於小塊數據,這在聊天網絡流中是典型的。與分組密碼相比,流密碼可以更安全,特別是當數據流不是塊狀時。分組密碼需要填充和鏈接。流密碼可以花費停機時間來計算更多的僞隨機密鑰,然後使用非常有效的XOR進行實際的加密/解密操作。 – Todd 2017-02-24 06:13:49

2

使用RijndaelManaged類進行加密,並使用Rfc2898DeriveBytes生成密碼的密鑰(和IV)。

相關問題