中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#的DES文件加解密工具類

發布時間:2020-04-07 23:20:59 來源:網絡 閱讀:910 作者:tjxyrjxl 欄目:編程語言

using System;

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;

        }

    }

}

文章出自:越康體育

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台前县| 海伦市| 保定市| 河间市| 墨玉县| 万安县| 贡嘎县| 五寨县| 雅安市| 石河子市| 昌吉市| 绩溪县| 新闻| 临安市| 云阳县| 忻州市| 建湖县| 长岛县| 襄樊市| 开封市| 临沂市| 安国市| 张北县| 普安县| 鹿邑县| 五原县| 横山县| 莆田市| 合作市| 金华市| 英超| 九江县| 吴堡县| 丹阳市| 大洼县| 大英县| 长乐市| 获嘉县| 雷山县| 云林县| 吕梁市|