Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a password protected file in C#

Tags:

c#

passwords

A bit complementary to, but no way the same as, this question.

How to create a password protected file?

like image 837
Peter Avatar asked Apr 11 '09 21:04

Peter


People also ask

How do I create a password protected file in C?

You can, on a POSIX system, use fcntl() along with the F_SETLK value for the command argument, and then set F_WRLCK (i.e, and exclusive lock) in the struct flock data-member l_type .

Can I password protect a single file?

Use encryption to password protect a folder or a file Right-click on the item, click Properties, then click Advanced. Check Encrypt contents to secure data. Click OK, then click Apply. Windows then asks if you want to encrypt only the file or its parent folder and all the files within that as well.


2 Answers

encrypt:

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
    }
  }
}

and decrypt:

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
  }
}
like image 193
tanascius Avatar answered Sep 21 '22 06:09

tanascius


Use the RijndaelManaged class for encryption and Rfc2898DeriveBytes to generate the key (and IV) for the crypto.

like image 34
JMD Avatar answered Sep 23 '22 06:09

JMD