C#的DES文件加解密工具类-创新互联

using System;

十年的防城港网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网整合营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整防城港建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“防城港网站设计”,“防城港网站推广”以来,每个客户项目都认真落实执行。

using System.Collections.Generic;

using System.Text;

using System.Security.Cryptography;

using System.IO;

namespace www.xinduofen.com

{

    class FileDES

    {

        ///

        /// 加密文件随机数生成

        ///

        private static RandomNumberGenerator rand = new RNGCryptoServiceProvider();

        private const ulong FC_TAG = 0xFC010203040506CF;

        private const int BUFFER_SIZE = 32 * 1024;

        ///

        /// 异常内部处理类

        ///

        private class CryptoHelpException : ApplicationException

        {

            public CryptoHelpException(string msg) : base(msg) { }

        }

        ///

        /// 加密文件,此方法不对异常进行处理,需要调用方进行捕获

        ///

        /// 待加密文件

        /// 加密后输出文件

        /// 加密密码

        /// 方法未产生任何异常 - 成功

        public static void EncryptFile(string inFile, string outFile, string password)

        {

            using (FileStream fin = File.OpenRead(inFile),

                fout = File.OpenWrite(outFile))

            {

                // 获取IV和salt

                byte[] IV = GenerateRandomBytes(16);

                byte[] salt = GenerateRandomBytes(16);

                // 创建加密对象

                SymmetricAlgorithm sma = FileDES.CreateRijndael(password, salt);

                sma.IV = IV;

                // 在输出文件开始部分写入IV和salt

                fout.Write(IV, 0, IV.Length);

                fout.Write(salt, 0, salt.Length);

                // 创建散列加密

                HashAlgorithm hasher = SHA256.Create();

                long lSize = fin.Length; // 输入文件长度

                byte[] bytes = new byte[BUFFER_SIZE]; // 缓存

                int read = -1; // 输入文件读取数量

                int value = 0;

                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 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 = FileDES.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("文件大小不匹配");

            }

        }

        ///

        /// 创建加密对象

        ///

        /// 密码

        /// 密钥salt

        /// 加密对象

        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;

        }

        ///

        /// 检验两个Byte数组是否相同

        ///

        /// Byte数组

        /// Byte数组

        /// true-相等

        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;

        }

        ///

        /// 生成指定长度的随机Byte数组

        ///

        /// Byte数组长度

        /// 随机Byte数组

        private static byte[] GenerateRandomBytes(int count)

        {

            byte[] bytes = new byte[count];

            rand.GetBytes(bytes);

            return bytes;

        }

    }

}

文章出自:越康体育

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前标题:C#的DES文件加解密工具类-创新互联
当前网址:http://myzitong.com/article/dspeci.html