• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > Windows中使用C#为文件夹和文件编写密码锁的示例分享

Windows中使用C#为文件夹和文件编写密码锁的示例分享

作者:DebugLZQ 字体:[增加 减小] 来源:互联网 时间:2017-05-28

DebugLZQ 通过本文主要向大家介绍了怎样使用windows 10,windows10使用教程,windows10使用技巧,windows7使用详解,windows7使用教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C#文件夹加锁小工具
用C#语言实现一个文件夹锁的程序,网上类似的“xxx文件夹xxx”软件很多,但是基本上都是C/C++语言实现的,且都没有提供源码(这个可以理解,毕竟是加密程序,不应该泄露源码)。

程序的基本原理是:用C#语言重命名文件夹,通过重命名使之成为windows安全文件的类标识符。具体的方法是为文件夹添加拓展名“.{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}”

(.{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}是windows安全文件的类标识符),这时文件夹的图标就会变成一把锁,这样文件夹就被加锁了。

程序的主界面非常简洁,截图如下:

201637142947291.png (437×167)

程序中加密解密文件夹的核心代码如下:

    private void btnBrowseFolder_Click(object sender, EventArgs e)
    {
      
      status = lockType;//
      

      if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
      {
        DirectoryInfo d = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
        string selectedpath = d.Parent.FullName + d.Name;
        if (folderBrowserDialog1.SelectedPath.LastIndexOf(".{") == -1)//通过文件夹名称,判断加密
        {          
          SetPwd(folderBrowserDialog1.SelectedPath);
          if (!d.Root.Equals(d.Parent.FullName))
          {            
              d.MoveTo(d.Parent.FullName + "\\" + d.Name + status);//文件夹重命名
          }
          else d.MoveTo(d.Parent.FullName + d.Name + status);
          txtFolderPath.Text = folderBrowserDialog1.SelectedPath;
          
        }
        else//解密文件夹
        {
          status = GetStatus(status);
          bool s = CheckPwd();
          if (s)
          {
            File.Delete(folderBrowserDialog1.SelectedPath + "\\key.xml");
            string path = folderBrowserDialog1.SelectedPath.Substring(0, folderBrowserDialog1.SelectedPath.LastIndexOf("."));
            d.MoveTo(path);
            txtFolderPath.Text = path;
            
          }
        }
      }
    }

</div>

程序的运行效果如下:

以加密D盘下面的test文件夹为例,结果如下:

首先通过folderBrowserDialog选择相应的文件夹

201637143219500.png (338×324)

输入密码,加锁

201637143238232.png (290×179)

效果如下:

201637143302754.png (476×290)

此时双击文件夹已经无法打开。

选择加密后的test文件夹,输入加密时输入的密码,可解锁。

201637143409234.png (290×139)

test文件夹已经解密

201637143435509.png (468×204)

加密解密文件小工具

上面分享了一个文件夹加密小工具,该工具是操作文件夹名称的方法实现文件夹的一般加密,文件夹中的文件(视频、图片等)都原封不动的保存在那里。

在网上搜索相关文件加密的程序,发现给出的基本都是针对“字符创”、“文本”的加密与解密。对视频文件、图片等一般文件的加密解密程序少之又少,所以我们下面再来实现一个对一般文件进行加密的小工具。

程序的主要功能是:用户通过文件选择框选择要加密的文件-》输入密码进行加密;选择加密后的文件,输入密码进行解密。

程序的主界面如下:

201637143452275.png (458×181)

三个按钮的Click事件处理程序如下:

    private void btnSelectFile_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
      {
        txtFileName.Text = openFileDialog1.FileName ;
      }
    }

    private void btnEncryptFile_Click(object sender, EventArgs e)
    {
      string inFile=txtFileName.Text;
      string outFile = inFile + ".dat";
      string password=txtPassword.Text ;
      DESFile.DESFileClass.EncryptFile(inFile, outFile, password);//加密文件
      //删除加密前的文件
      File.Delete(inFile);
      txtFileName.Text = string.Empty;
      MessageBox.Show("加密成功");
    }

    private void btnDecryptFile_Click(object sender, EventArgs e)
    {
      string inFile = txtFileName.Text;
      string outFile = inFile.Substring(0,inFile.Length - 4);
      string password = txtPassword.Text;
      DESFile.DESFileClass.DecryptFile (inFile, outFile, password);//解密文件
      //删除解密前的文件
      File.Delete(inFile);
      txtFileName.Text = string.Empty;
      MessageBox.Show("解密成功");
    }

加密解密的Help文件源码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace DESFile
{
  /// <summary>
  /// 异常处理类
  /// </summary>
  public class CryptoHelpException : ApplicationException
  {
    public CryptoHelpException(string msg) : base(msg) { }
  }

  /// <summary>
  /// CryptHelp
  /// </summary>
  public class DESFileClass
  {
    private const ulong FC_TAG = 0xFC010203040506CF;

    private const int BUFFER_SIZE = 128 * 1024;

    /// <summary>
    /// 检验两个Byte数组是否相同
    /// </summary>
    /// <param name="b1">Byte数组</param>
    /// <param name="b2">Byte数组</param>
    /// <returns>true-相等</returns>
    private static bool CheckByteArrays(byte[] b1, byte[] b2)
    {
      if (b1.Length == b2.Length)
      {
        for (int i = 0; i < b1.Length; ++i)
        {
          if (b1[i] != b2[i])
            return false;
        }
        return true;
      }
      return false;
    }

    /// <summary>
    /// 创建DebugLZQ ,http://www.cnblogs.com/DebugLZQ
    /// </summary>
    /// <param name="password">密码</param>
    /// <param name="salt"></param>
    /// <returns>加密对象</returns>
    private static SymmetricAlgorithm CreateRijndael(string password, byte[] salt)
    {
      PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt, "SHA256", 1000);

      SymmetricAlgorithm sma = Rijndael.Create();
      sma.KeySize = 256;
      sma.Key = pdb.GetBytes(32);
      sma.Padding = PaddingMode.PKCS7;
      return sma;
    }

    /// <summary>
    /// 加密文件随机数生成
    /// </summary>
    private static RandomNumberGenerator rand = new RNGCryptoServiceProvider();

    /// <summary>
    /// 生成指定长度的随机Byte数组
    /// </summary>
    /// <param name="count">Byte数组长度</param>
    /// <returns>随机Byte数组</returns>
    private static byte[] GenerateRandomBytes(int count)
    {
      byte[] bytes = new byte[count];
      rand.GetBytes(bytes);
      return bytes;
    }

    /// <summary>
    /// 加密文件
    /// </summary>
    /// <param name="inFile">待加密文件</param>
    /// <param name="outFile">加密后输入文件</param>
    /// <param name="password">加密密码</param>
    public static void EncryptFile(string inFile, string outFile, string password)
    {
      using (FileStream fin = File.OpenRead(inFile),
        fout = File.OpenWrite(outFile))
      {
        long lSize = fin.Length; // 输入文件长度
        int size = (int)lSize;
        byte[] bytes = new byte[BUFFER_SIZE]; // 缓存
        int read = -1; // 输入文件读取数量
        int value = 0;

        // 获取IV和salt
        byte[] IV = GenerateRandomBytes(16);
        byte[] salt = GenerateRandomBytes(16);

        // 创建加密对象
        SymmetricAlgorithm sma = DESFi



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • windows中使用C# 调用 C语言生成的dll
  • Windows中使用C#为文件夹和文件编写密码锁的示例分享

相关文章

  • 2017-05-28C#实现客户端弹出消息框封装类实例
  • 2017-05-28c# 动态加载dll文件,并实现调用其中的方法(推荐)
  • 2017-05-28WinForm中DefWndProc、WndProc与IMessageFilter的区别
  • 2017-05-28C#实现txt定位指定行完整实例
  • 2017-08-30C# Dictionary根据Key排序
  • 2017-05-28C#操作EXCEL DataTable转换的实例代码
  • 2017-05-28C# 获取打印机当前状态的方法
  • 2017-05-28C#词法分析器之转换DFA详解
  • 2017-05-28C# 汉字转化拼音的简单实例代码
  • 2017-05-28c#实现万年历示例分享 万年历农历查询

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 再议C#中的装箱与拆箱的问题详解
    • c#在sql中存取图片image示例
    • C#中Html.RenderPartial与Html.RenderAction的区别分析
    • c#定时运行程序分享(定时程序)
    • C#创建临时文件的方法
    • .NET中的async和await关键字使用及Task异步调用实例
    • 浅谈C# 序列化与反序列化几种格式的转换
    • C#调用dos窗口获取相关信息的方法
    • 浅析C#中数组,ArrayList与List对象的区别
    • C# httpwebrequest访问HTTPS错误处理方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有