如何在C#中创建受密码保护的文件

Pet*_*ter 4 c# passwords

这个问题有点补充,但不一样.

如何创建受密码保护的文件?

tan*_*ius 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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

并解密:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 拥有完整的答案将非常有用,而不仅仅是一些“//写入数据”和“//读取数据”不完整的部分。就像有一个字符串“Hello World”,将其加密到一个文件并将加密的文件读回字符串中。 (2认同)