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

来源:互联网 发布:hifi播放器软件 编辑:程序博客网 时间:2024/06/18 11:12

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

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("文件大小不匹配");            }        }    } }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅族mx4pro玩王者荣耀卡怎么办 魅蓝5s玩游戏卡怎么办 魅蓝s6玩游戏卡怎么办 OPPO王者荣耀对局闪退怎么办 魅族手机太慢怎么办 魅蓝5信号不好怎么办 魅蓝数据网速慢怎么办 魅族联通网速慢怎么办 魅族手机wifi信号弱怎么办 魅蓝e2信号差怎么办 魅蓝e2gps信号弱怎么办 魅族网络信号差怎么办 魅族手机gps信号弱怎么办 魅族手机突然没有信号怎么办 魅族手机流量信号不好怎么办 魅族手机wifi信号差怎么办 魅族5s信号不好怎么办 魅族mx5的双击不亮屏怎么办 魅族mx5返回键失灵怎么办 电信苹果3g网速慢怎么办 魅蓝6开不了机怎么办 手机应用被锁了怎么办 魅族电池不耐用怎么办 魅族mx6现在很卡怎么办 魅族e2手机屏幕背景黑色怎么办 魅族x6手机锁了怎么办 360n5返回键失灵怎么办 360n5返回键不好用怎么办 魅族手机锁屏怎么办 魅族手机锁住了怎么办 手机己锁定怎么办魅族 魅蓝u10触屏没反应怎么办 魅蓝e2手机锁定怎么办 苹果手机声音键坏了怎么办 一加6的屏幕问题怎么办 魅蓝note6卡顿怎么办 苹果4s内屏坏了怎么办 魅族mx6一直重启怎么办 魅族充电慢了怎么办啊 笔记本玩游戏掉帧怎么办 psv玩游戏掉帧怎么办