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

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

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

  程序的主界面如下:

  三个按钮的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和saltbyte[] IV = GenerateRandomBytes(16);byte[] salt = GenerateRandomBytes(16);// 创建加密对象SymmetricAlgorithm sma = DESFileClass.CreateRijndael(password, salt);sma.IV = IV;// 在输出文件开始部分写入IV和saltfout.Write(IV, 0, IV.Length);fout.Write(salt, 0, salt.Length);// 创建散列加密HashAlgorithm hasher = SHA256.Create();using (CryptoStream cout = new CryptoStream(fout, sma.CreateEncryptor(), CryptoStreamMode.Write),chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write)){BinaryWriter bw = new BinaryWriter(cout);bw.Write(lSize);bw.Write(FC_TAG);// 读写字节块到加密流缓冲区while ((read = fin.Read(bytes, 0, bytes.Length)) != 0){cout.Write(bytes, 0, read);chash.Write(bytes, 0, read);value += read;}// 关闭加密流
                    chash.Flush();chash.Close();// 读取散列byte[] hash = hasher.Hash;// 输入文件写入散列cout.Write(hash, 0, hash.Length);// 关闭文件流
                    cout.Flush();cout.Close();}}}/// <summary>/// 解密文件/// </summary>/// <param name="inFile">待解密文件</param>/// <param name="outFile">解密后输出文件</param>/// <param name="password">解密密码</param>public static void DecryptFile(string inFile, string outFile, string password){// 创建打开文件流using (FileStream fin = File.OpenRead(inFile),fout = File.OpenWrite(outFile)){int size = (int)fin.Length;byte[] bytes = new byte[BUFFER_SIZE];int read = -1;int value = 0;int outValue = 0;byte[] IV = new byte[16];fin.Read(IV, 0, 16);byte[] salt = new byte[16];fin.Read(salt, 0, 16);SymmetricAlgorithm sma = DESFileClass.CreateRijndael(password, salt);sma.IV = IV;value = 32;long lSize = -1;// 创建散列对象, 校验文件HashAlgorithm hasher = SHA256.Create();using (CryptoStream cin = new CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read),chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write)){// 读取文件长度BinaryReader br = new BinaryReader(cin);lSize = br.ReadInt64();ulong tag = br.ReadUInt64();if (FC_TAG != tag)throw new CryptoHelpException("文件被破坏");long numReads = lSize / BUFFER_SIZE;long slack = (long)lSize % BUFFER_SIZE;for (int i = 0; i < numReads; ++i){read = cin.Read(bytes, 0, bytes.Length);fout.Write(bytes, 0, read);chash.Write(bytes, 0, read);value += read;outValue += read;}if (slack > 0){read = cin.Read(bytes, 0, (int)slack);fout.Write(bytes, 0, read);chash.Write(bytes, 0, read);value += read;outValue += read;}chash.Flush();chash.Close();fout.Flush();fout.Close();byte[] curHash = hasher.Hash;// 获取比较和旧的散列对象byte[] oldHash = new byte[hasher.HashSize / 8];read = cin.Read(oldHash, 0, oldHash.Length);if ((oldHash.Length != read) || (!CheckByteArrays(oldHash, curHash)))throw new CryptoHelpException("文件被破坏");}if (outValue != lSize)throw new CryptoHelpException("文件大小不匹配");}}}
}

加密/解密结果:

以加密D盘下的1.avi为例,加密后的文件为1.avi.dat,即使重命名回1.avi文件依然无法打开(文件被加密)。

输入密码进行解密后,文件恢复解密,可以顺利打开~

【C#文件锁】C#加密解密文件小工具相关推荐

  1. C#加密解密文件小工具实现代码

    一个文件夹加密小工具,该工具是操作文件夹名称的方法实现文件夹的一般加密,文件夹中的文件(视频.图片等)都原封不动的保存在那里DebugLZQ在网上搜索相关文件加密的程序,发现给出的基本都是针对&quo ...

  2. C# 学习笔记(12)hex文件转bin文件小工具

    C# 学习笔记(12)hex文件转bin文件小工具 hex文件格式 hex文件格式网上有很多 我这里参考HEX文件格式详解https://blog.csdn.net/weixin_39752827/a ...

  3. C 使用异或(xor)加密/解密文件

    C 使用异或(XOR)加密/解密文件 之前写过一篇<php 使用异或(XOR)加密/解密文件>,但php执行的速度很慢,因此这次使用C重写,速度有很大的提高. xor_encrypt.c ...

  4. C#编程实现加密解密文件夹核心代码

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

  5. aes加密算法c#语言实现,C#编程实现加密解密文件夹核心代码

    类型:加密解密大小:296KB语言:中文 评分:8.0 标签: 立即下载 用C#语言实现一个文件夹锁的程序,网上类似的"xxx文件夹xxx"软件很多,但是基本上都是C/C++语言实 ...

  6. java rsa 文件加密解密_RSA 加密、解密(自己生成加密解密文件)

    本文是自己阅读了网上的高人们的文章之后,实现功能后总结出来的,方便自己方便他人,不喜勿喷 加密解密需要生成公钥.私钥文件步骤 1.打开终端 输入 openssl 5F88AA4A-3913-4CBC- ...

  7. VC++2010基于windows Sdk for windows7 开发CrytoAPI应用--加密解密文件

    windows Sdk for windows7 开发CrytoAPI是微软推出的安全应用调用函数,用很小的代码就可以实现复杂的安全信息加密.下面演示文件加密解密,详情请见代码. #include & ...

  8. 七牛上传文件小工具v0.1

    为什么80%的码农都做不了架构师?>>>    非常喜欢 七牛的存储,但是七牛也没有论坛,想找个小工具都很难.而官方的windows下的上传工具 qrsync虽然很强大,但是对于经常 ...

  9. 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版

    技术背景 KML,是标记语言(Keyhole Markup Language)的缩写,最初由Keyhole公司开发,是一种基于XML 语法与格式的.用于描述和保存地理信息(如点.线.图像.多边形和模型 ...

最新文章

  1. WCDMA系统中的扰码规划
  2. java中que_重写java Eques()方法-不工作吗?
  3. wxWidgets:wxGraphicsRenderer类用法
  4. sparkstreaming直接从kafka消费数据
  5. 3月6日云栖精选夜读:如何实现32.5万笔/秒的交易峰值?阿里交易系统TMF2.0技术揭秘...
  6. javascript Dom总结
  7. oracle 创建视图、修改视图、删除视图、利用视图操作基本表
  8. Retrofit+Rxjava服务器IP轮询重试机制实现
  9. 实战MongoDB-Replication之Master-Slave
  10. Spring Boot 2.x 切换 Servlet 嵌入式容器 Tomcat、Jetty、Undertow
  11. 玉渊潭赏樱花有感:从无到有写一个jQuery开源插件
  12. 小程序提示:downloadFile:fail 发生了 SSL 错误,无法建立与该服务器的安全连接
  13. 视频文件(任意文件)二进制读写
  14. vue 下载文件流和捕获后端返回的状态码和错误信息的方法
  15. 学会向上管理,4个提问技巧,让你事半功倍
  16. 网易七鱼客服对接记录以及Vue项目里使用
  17. 区块链100讲:16进制数据的编码/解码算法
  18. C#IEnumerator.MoveNext 方法 ()
  19. go基础之map-增和改(二)
  20. P1786 帮贡排序c++良心题解

热门文章

  1. jbpm 4.4 表结构
  2. python从入门到实践笔记_Python编程从入门到实践二至七章笔记
  3. hdu 3721 树的最小直径
  4. 【数字信号处理】基本序列 ( 基本序列列举 | 单位脉冲序列 | 单位脉冲函数 | 离散单位脉冲函数 | 单位脉冲函数 与 离散单位脉冲函数的区别 )
  5. 【Groovy】集合遍历 ( 使用集合的 eachWithIndex 方法进行遍历 | 代码示例 )
  6. 【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 )
  7. 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )
  8. Float浮点数的使用和条件
  9. oracle去重等基础问题
  10. MagicalRecord使用中的注意事项