全栈工程师开发手册 (作者:栾鹏)

c#教程全解

c#使用SHA256算法实现对文件的加密和解密

将当期目录的test.txt加密成文件test1.txt,再将加密后的test1.txt文件解密成test2.txt。

测试代码


static void Main()
{MyEncrypt.SHA_Encrypt("test.txt", "test1.txt", "123456");  //文件加密MyEncrypt.SHA_Dencrypt("test1.txt", "test2.txt", "123456");  //文件解密
}

加密解密工具类的实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace util
{public class MyEncrypt{private const ulong FC_TAG = 0xFC010203040506CF;private const int BUFFER_SIZE = 128 * 1024;//检验两个Byte数组是否相同 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;}/// <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;}// 加密文件随机数生成 private static RandomNumberGenerator rand = new RNGCryptoServiceProvider();// 生成指定长度的随机Byte数组 private static byte[] GenerateRandomBytes(int count){byte[] bytes = new byte[count];rand.GetBytes(bytes);return bytes;}// 加密文件 public static void SHA_Encrypt(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 = CreateRijndael(password, salt);sma.IV = IV;// 在输出文件开始部分写入IV和salt fout.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();}}}// 解密文件 public static void SHA_Dencrypt(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 = 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 Exception("文件被破坏");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 Exception("文件被破坏");}if (outValue != lSize)throw new Exception("文件大小不匹配");}}}
}

c#使用SHA256算法实现对文件的加密和解密相关推荐

  1. python输出字体的大小_Python密码学编程:文件的加密与解密

    在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的.但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符. 本章要点 open()方法. ...

  2. 服务器文件加密解密,刀片加密服务器的文件如何加密和解密

    为了解决信息传输到信息存储过程中的存在的信息安全问题,我们应用到了一种刀片加密服务器,那么什么是刀片加密服务器,刀片加密服务器中的文件如何加密和解密,我们今天就来看一下. 一.刀片加密服务器 1.刀片 ...

  3. c语言程序存为bin程序,对文件进行加密与解密(c语言)-bin文件打开

    操作界面 加密前的文件: 加密后的文件 将加密后的文件解密后即可还原 初始密码为:hujing 开发环境:vc6.0 操作系统:windows 源代码 /*********************** ...

  4. 对文件进行加密和解密

    在Solaris10上,可以使用encrypt和decrypt命令对文件进行加密和解密.文件加密可以防止其它用户看到敏感信息.如:存储用户名和密码的文件. 以下是示例: 1. 把用户名和密码信息存储在 ...

  5. php dse加密,dse-src 这个极其小巧(9k)的加密程序对文件进行加密及解密的速度与资 联合开发网 - pudn.com...

    dse-src 所属分类:加密解密 开发工具:C/C++ 文件大小:20KB 下载次数:1 上传日期:2009-05-04 15:11:23 上 传 者:自由民 说明:  这个极其小巧(9k)的加密程 ...

  6. android 文件加密解决方法,一种Android平台的文件快速加密以及解密方法与流程

    本发明属于数据安全领域,具体涉及一种Android平台的文件快速加密以及解密方法. 背景技术: 目前移动办公系统极大地提升了企.事业单位的工作效率,而带装有办公应用的智能设备中会存储一些较高机密性的文 ...

  7. linux 加密文件,如何运用OpenSSL 对文件进行加密和解密

    导读 我们在平时的 Linux 运维管理的时候,经常会进行各种数据备份任务.将数据导出然后打包.通常在安全性要求比较高的环境下,我们可以借助 OpenSSL 工具对打包后的数据进行加密,这样能进一步的 ...

  8. linux配置文件密码加密工具,Linux下利用openssl对文件进行加密和解密

    转载地址:http://hi.baidu.com/edeed/item/99206a096b62d0e1ff240db8 --建立文件test.txt, 特意写入中英文# cd /tmp # echo ...

  9. Android 文件的加密及解密

    文件加密及解密 1. 保护隐私数据不被未授权访问: 什么是加密 1. 保护隐私数据不被未授权访问: 2. 用于隐藏真实数据,进行安全的数据传递: 3. 避免数据被第三方截获: 2. 用于隐藏真实数据, ...

最新文章

  1. LeetCode刷题记录4——67. Add Binary(easy)
  2. 圣诞日记2010-12-25:认清形势,看清方向,正确选择,努力拼搏(更新 )
  3. mysql使用数据库预处理_php中对MYSQL操作之预处理技术(2)数据库dql查询语句
  4. Leetcode 54 螺旋矩阵 (每日一题 20210729)
  5. 详解android gatekeeper/fingerprint中的authToken
  6. 安装Discuz!论坛
  7. 在内存中读取函数的ShellCode并执行
  8. 初谈Git(本机克隆项目远程仓库)
  9. dede 鼠标移到标题处显示完整标题
  10. 计算机图形学(一)——数据压缩:道格拉斯普克法
  11. jQuery+bootstrap实现美化警告/确认/提示对话框插件
  12. 【深度】揭穿QQ偷窥6亿用户隐私的三大阳谋
  13. 魔方怎么更改计算机名,软媒魔方怎么通过设置向导进行设置
  14. 机器人学领域的顶级期刊和会议
  15. Python3 读取word中的表格,根据表格第一行标题行查找想要的表格
  16. 光纤测试之常见光纤端面问题
  17. github rust 项目Travis ci配置
  18. 5GgNB和ng-eNB的主要功能
  19. .net之微信企业号开发(二) 企业号人员身份认证与开发
  20. Vue.js+ECharts:切换图表类型(图表工具栏)

热门文章

  1. 语音识别结合应用场景 各位大咖也有一些精彩论点
  2. vue jsx webpack报错_从零开始,使用webpack高效搭建react工作流
  3. x264源代码简单分析:滤波(Filter)部分
  4. akamai:与看视频广告等待相比,用户更不能忍受缓冲等待
  5. 数据库操作 linq php,.NET_asp.net使用LINQ to SQL连接数据库及SQL操作语句用法分析,本文实例讲述了asp.net使用LINQ t - phpStudy...
  6. 蓝牙模块耳机做蓝牙透传_WiFi、蓝牙在工业领域的数据透传应用_SKYLAB 无线模块...
  7. 盒子模型的各种高度记录
  8. sock 文件方式控制宿主机_基于嵌入式Linux系统实现YAFFS2文件系统存储方案的设计...
  9. Python pip install修改默认下载路径
  10. idea在Sonar中点击exclude后恢复