亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

天等县| 成都市| 哈巴河县| 天水市| 达州市| 轮台县| 大同市| 安徽省| 迁安市| 延安市| 固镇县| 台北县| 新乡市| 丹阳市| 宜宾县| 邵阳市| 保定市| 即墨市| 旬阳县| 尉犁县| 静乐县| 东源县| 聂拉木县| 荆州市| 贡觉县| 泗水县| 沐川县| 梅河口市| 平塘县| 湖南省| 陆良县| 大安市| 定襄县| 麻阳| 黄陵县| 达孜县| 永州市| 彰武县| 洮南市| 广西| 贡嘎县|