【问题标题】:How to create a password protected file in C#如何在 C# 中创建受密码保护的文件
【发布时间】:2010-10-18 22:57:57
【问题描述】:

this 问题有点互补,但绝不相同。

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

【问题讨论】:

  • 当您说“受密码保护的文件”时,您确实应该准确地说出您的意思。你的意思是当有人试图打开它时,会弹出一个“输入密码”对话框,还是什么?
  • 是的,我就是这个意思

标签: c# passwords


【解决方案1】:

加密:

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

【讨论】:

  • 如果您使用 CryptoStream 进行网络通信,您应该找到流密码。 Rijndael 通常用作分组密码。流密码最适合小块数据,这在聊天网络流中很常见。与分组密码相比,流密码更安全,尤其是当数据流不是块状时。分组密码需要填充和链接。流密码可以花费停机时间计算更多的伪随机密钥,然后使用非常有效的 XOR 进行实际的按需加密/解密操作。
  • 当我实现这个答案时,只要我提供除正确密码之外的任何密码,我都会得到System.Security.Cryptography.CryptographicException: Padding is invalid and cannot be removed.。这不是违背密码的目的吗? edit 不,这意味着您必须发现或暴力破解密码才能解密它,这正是密码的重点。德普。
  • 是否有检测用户是否输入错误密码的选项?
【解决方案2】:

使用 RijndaelManaged 类进行加密,使用 Rfc2898DeriveBytes 生成加密的密钥(和 IV)。

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多