2009-04-11 120 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)。