最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中實現(xiàn)AES算法加密解讀

 更新時間:2023年02月26日 14:30:03   作者:yangzm996  
這篇文章主要介紹了C#中實現(xiàn)AES算法加密實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

先上效果圖

文件和加密文件之間的轉換。

先添加輔助類

 public class AES_EnorDecrypt
    {
        //定義默認密鑰
        private static byte[] _aesKeyByte = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
        private static string _aesKeyStr = Encoding.UTF8.GetString(_aesKeyByte);

        /// <summary>
        /// 隨機生成密鑰,默認密鑰長度為32,不足在加密時自動填充空格
        /// </summary>
        /// <param name="n">密鑰長度</param>
        /// <returns></returns>
        public static string GetIv(int n)
        {
            string s = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            char[] arrChar = new char[s.Length];
            for (int i = 0; i < s.Length; i++)
            {
                arrChar[i] = Convert.ToChar(s.Substring(i, 1));
            }
            StringBuilder num = new StringBuilder();
            Random rnd = new Random(DateTime.Now.Millisecond);
            for (int i = 0; i < n; i++)
            {
                num.Append(arrChar[rnd.Next(0, arrChar.Length)].ToString());
            }
            _aesKeyByte = Encoding.UTF8.GetBytes(num.ToString());
            return _aesKeyStr = Encoding.UTF8.GetString(_aesKeyByte);
        }

        /// <summary>
        /// AES加密,針對文本類文件
        /// </summary>
        /// <param name="Data">被加密的明文</param>
        /// <param name="Key">密鑰</param>
        /// <param name="Vector">密鑰向量</param>
        /// <returns>密文</returns>
        public static string AESEncrypt(string Data, string Key, string Vector)
        {
            byte[] plainBytes = Encoding.UTF8.GetBytes(Data);
            byte[] bKey = new byte[32];
            Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
            byte[] bVector = new byte[16];
            Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);
            byte[] Cryptograph = null;//加密后的密文
            Rijndael Aes = Rijndael.Create();
            try
            {
                using (MemoryStream Memory = new MemoryStream())
                {
                    //把內存流對象包裝成加密流對象
                    using (CryptoStream Encryptor = new CryptoStream(Memory, Aes.CreateEncryptor(bKey, bVector), CryptoStreamMode.Write))
                    {
                        Encryptor.Write(plainBytes, 0, plainBytes.Length);
                        Encryptor.FlushFinalBlock();
                        Cryptograph = Memory.ToArray();
                    }
                }
            }
            catch
            {
                Cryptograph = null;
            }
            return Convert.ToBase64String(Cryptograph);
        }

        /// <summary>
        /// AES加密,任意文件
        /// </summary>
        /// <param name="Data">被加密的明文</param>
        /// <param name="Key">密鑰</param>
        /// <param name="Vector">密鑰向量</param>
        /// <returns>密文</returns>
        public static byte[] AESEncrypt(byte[] Data, string Key, string Vector)
        {
            byte[] bKey = new byte[32];
            Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
            byte[] bVector = new byte[16];
            Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);
            byte[] Cryptograph = null;//加密后的密文
            Rijndael Aes = Rijndael.Create();
            try
            {
                using (MemoryStream Memory = new MemoryStream())
                {
                    //把內存流對象包裝成加密流對象
                    using (CryptoStream Encryptor = new CryptoStream(Memory, Aes.CreateEncryptor(bKey, bVector), CryptoStreamMode.Write))
                    {
                        Encryptor.Write(Data, 0, Data.Length);
                        Encryptor.FlushFinalBlock();
                        Cryptograph = Memory.ToArray();
                    }
                }
            }
            catch
            {
                Cryptograph = null;
            }
            return Cryptograph;
        }

        /// <summary>
        /// AES解密,針對文本文件
        /// </summary>
        /// <param name="Data">被解密的密文</param>
        /// <param name="Key">密鑰</param>
        /// <param name="Vector">密鑰向量</param>
        /// <returns>明文</returns>
        public static string AESDecrypt(string Data, string Key, string Vector)
        {
            byte[] encryptedBytes = Convert.FromBase64String(Data);
            byte[] bKey = new byte[32];
            Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
            byte[] bVector = new byte[16];
            Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);
            byte[] original = null;//解密后的明文
            Rijndael Aes = Rijndael.Create();
            try
            {
                using (MemoryStream Memory = new MemoryStream(encryptedBytes))
                {
                    //把內存流對象包裝成加密對象
                    using (CryptoStream Decryptor = new CryptoStream(Memory, Aes.CreateDecryptor(bKey, bVector), CryptoStreamMode.Read))
                    {
                        //明文存儲區(qū)
                        using (MemoryStream originalMemory = new MemoryStream())
                        {
                            byte[] Buffer = new byte[1024];
                            int readBytes = 0;
                            while ((readBytes = Decryptor.Read(Buffer, 0, Buffer.Length)) > 0)
                            {
                                originalMemory.Write(Buffer, 0, readBytes);
                            }
                            original = originalMemory.ToArray();
                        }
                    }
                }
            }
            catch
            {
                original = null;
            }
            return Encoding.UTF8.GetString(original);
        }

        /// <summary>
        /// AES解密,任意文件
        /// </summary>
        /// <param name="Data">被解密的密文</param>
        /// <param name="Key">密鑰</param>
        /// <param name="Vector">密鑰向量</param>
        /// <returns>明文</returns>
        public static byte[] AESDecrypt(byte[] Data, string Key, string Vector)
        {
            byte[] bKey = new byte[32];
            Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
            byte[] bVector = new byte[16];
            Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);
            byte[] original = null;//解密后的明文
            Rijndael Aes = Rijndael.Create();
            try
            {
                using (MemoryStream Memory = new MemoryStream(Data))
                {
                    //把內存流對象包裝成加密對象
                    using (CryptoStream Decryptor = new CryptoStream(Memory, Aes.CreateDecryptor(bKey, bVector), CryptoStreamMode.Read))
                    {
                        //明文存儲區(qū)
                        using (MemoryStream originalMemory = new MemoryStream())
                        {
                            byte[] Buffer = new byte[1024];
                            int readBytes = 0;
                            while ((readBytes = Decryptor.Read(Buffer, 0, Buffer.Length)) > 0)
                            {
                                originalMemory.Write(Buffer, 0, readBytes);
                            }
                            original = originalMemory.ToArray();
                        }
                    }
                }
            }
            catch
            {
                original = null;
            }
            return original;
        }
    }

AES是塊加密,塊的長度是16字節(jié),如果原文不到16的字節(jié),就會進行填充至16個字節(jié)。

開始實現(xiàn)

界面布局

textbox1為文件位置,textbox2為密碼。

設置好后

public partial class FormAes : Form
    {
        #region 屬性
        private static string _aesKeyVector = "q2T_=R/*33vc";
        #endregion

        public FormAes()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 選擇文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void textBox1_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Multiselect = true;//該值確定是否可以選擇多個文件
            dialog.Title = "請選擇文件夾";
            dialog.Filter = "所有文件(*.*)|*.*";
            if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                textBox1.Text = dialog.FileName;
            }
        }

        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(textBox1.Text.Trim()) || string.IsNullOrWhiteSpace(textBox2.Text.Trim()))
                return;
            backgroundWorker1.RunWorkerAsync();
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(textBox1.Text.Trim()) || string.IsNullOrWhiteSpace(textBox2.Text.Trim()))
                return;
            backgroundWorker2.RunWorkerAsync();
        }


        /// <summary>
        /// 后臺線程執(zhí)行的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
           
            string KeyVector = _aesKeyVector;//密鑰向量
            string path = Path.GetDirectoryName(textBox1.Text);
            string name = Path.GetFileName(textBox1.Text);
            name += ".En";
            #region   加密
            FileStream sr = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read);
            FileStream sw = new FileStream(path + "\\" + name, FileMode.Create, FileAccess.Write);

            if (sr.Length > 50 * 1024 * 1024)//如果文件大于50M,采取分塊加密,按50MB讀寫
            {
                byte[] mybyte = new byte[52428800];//每50MB加密一次                  
                int numBytesRead = 52428800;//每次加密的流大小
                long leftBytes = sr.Length;//剩余需要加密的流大小
                long readBytes = 0;//已經(jīng)讀取的流大小
                //每50MB加密后會變成50MB+16B
                byte[] encrpy = new byte[52428816];
                while (true)
                {
                    if (leftBytes > numBytesRead)
                    {
                        sr.Read(mybyte, 0, mybyte.Length);
                        encrpy = AES_EnorDecrypt.AESEncrypt(mybyte, textBox2.Text, KeyVector);
                        sw.Write(encrpy, 0, encrpy.Length);
                        leftBytes -= numBytesRead;
                        readBytes += numBytesRead;
                        backgroundWorker1.ReportProgress((int)(readBytes * 100 / sr.Length));
                    }
                    else//重新設定讀取流大小,避免最后多余空值
                    {
                        byte[] newByte = new byte[leftBytes];
                        sr.Read(newByte, 0, newByte.Length);
                        byte[] newWriteByte;
                        newWriteByte = AES_EnorDecrypt.AESEncrypt(newByte, textBox2.Text, KeyVector);
                        sw.Write(newWriteByte, 0, newWriteByte.Length);
                        readBytes += leftBytes;
                        backgroundWorker1.ReportProgress((int)(readBytes * 100 / sr.Length));
                        break;
                    }
                }
            }
            else
            {
                byte[] mybyte = new byte[sr.Length];
                sr.Read(mybyte, 0, (int)sr.Length);
                mybyte = AES_EnorDecrypt.AESEncrypt(mybyte, textBox2.Text, KeyVector);
                sw.Write(mybyte, 0, mybyte.Length);
                backgroundWorker1.ReportProgress(100);
            }

            sr.Close();
            sw.Close();

            #endregion
        }
       
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        /// <summary>
        /// 執(zhí)行完成時觸發(fā)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("加密成功!");
        }

        /// <summary>
        /// 后臺線程執(zhí)行的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                string KeyVector = _aesKeyVector;//密鑰向量
                string path = Path.GetDirectoryName(textBox1.Text);
                string name = Path.GetFileName(textBox1.Text);
                if (name.EndsWith(".En"))
                {
                    name = name.Remove(name.Length - 3, 3);
                }

                #region  解密
                FileStream sr = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read);
                FileStream sw = new FileStream(path + "\\" + name, FileMode.Create, FileAccess.Write);

                if (sr.Length > 50 * 1024 * 1024)//如果文件大于50M,采取分塊解密,按50MB讀寫
                {
                    byte[] mybyte = new byte[52428816];//解密緩沖區(qū)50MB+16B
                    byte[] decrpt = new byte[52428800];//解密后的50MB
                    int numBytesRead = 52428816;//每次解密的流大小
                    long leftBytes = sr.Length;//剩余需要解密的流大小
                    long readBytes = 0;//已經(jīng)讀取的流大小
                    try
                    {
                        while (true)
                        {
                            if (leftBytes > numBytesRead)
                            {
                                sr.Read(mybyte, 0, mybyte.Length);
                                decrpt = AES_EnorDecrypt.AESDecrypt(mybyte, textBox2.Text, KeyVector);
                                sw.Write(decrpt, 0, decrpt.Length);
                                leftBytes -= numBytesRead;
                                readBytes += numBytesRead;
                                backgroundWorker2.ReportProgress((int)(readBytes * 100 / sr.Length));
                            }
                            else//重新設定讀取流大小,避免最后多余空值
                            {
                                byte[] newByte = new byte[leftBytes];
                                sr.Read(newByte, 0, newByte.Length);
                                byte[] newWriteByte;
                                newWriteByte = AES_EnorDecrypt.AESDecrypt(newByte, textBox2.Text, KeyVector);
                                sw.Write(newWriteByte, 0, newWriteByte.Length);
                                readBytes += leftBytes;
                                backgroundWorker2.ReportProgress((int)(readBytes * 100 / sr.Length));
                                break;
                            }
                        }
                    }
                    catch
                    {
                        sr.Close();
                        sw.Close();
                        File.Delete(path + "\\" + name);
                        e.Cancel = true;
                    }
                    sr.Close();
                    sw.Close();
                }
                else
                {
                    byte[] mybyte = new byte[(int)sr.Length];
                    sr.Read(mybyte, 0, (int)sr.Length);
                    try
                    {
                        mybyte = AES_EnorDecrypt.AESDecrypt(mybyte, textBox2.Text, KeyVector);
                        sw.Write(mybyte, 0, mybyte.Length);
                        backgroundWorker2.ReportProgress(100);
                    }
                    catch
                    {
                        sr.Close();
                        sw.Close();
                        File.Delete(path + "\\" + name);
                        e.Cancel = true;
                    }
                    sr.Close();
                    sw.Close();
                }
                #endregion
            }
            catch
            {
                e.Cancel = true;
            }
        }

        private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
           progressBar1.Value = e.ProgressPercentage;
        }

        /// <summary>
        /// 執(zhí)行完成時觸發(fā)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
               MessageBox.Show("解密失敗\n密碼錯誤或加密文件被篡改,無法解密");                
            }
            else
            {
                MessageBox.Show("解密成功!");
            }
        }   
    }

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C#泛型實例詳解

    C#泛型實例詳解

    這篇文章主要介紹了C#泛型,對于C#初學者來說是有必要牢固掌握的內容,需要的朋友可以參考下
    2014-08-08
  • C#中的擴展方法詳解

    C#中的擴展方法詳解

    “擴展方法使您能夠向現(xiàn)有類型“添加”方法,而無需創(chuàng)建新的派生類型、重新編譯或以其他方式修改原始類型?!边@是msdn上說的,也就是你可以對String,Int,DataRow,DataTable等這些類型的基礎上增加一個或多個方法,使用時不需要去修改或編譯類型本身的代碼。
    2014-09-09
  • C#利用遞歸算法解決漢諾塔問題

    C#利用遞歸算法解決漢諾塔問題

    這篇文章主要為大家介紹了C#如何利用遞歸算法解決經(jīng)典的漢諾塔問題,文中的示例代碼講解詳細,對我們學習C#有一定幫助,需要的可以參考一下
    2022-04-04
  • .NET使用C#實現(xiàn)將Word文檔轉換為HTML格式

    .NET使用C#實現(xiàn)將Word文檔轉換為HTML格式

    這篇文章主要為大家詳細介紹了如何在.NET平臺使用C#將Word文檔轉換為HTML文件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-01-01
  • C#中PuppeteerSharp庫的應用詳解

    C#中PuppeteerSharp庫的應用詳解

    PuppeteerSharp是一個針對Google Chrome瀏覽器的高級API庫,這篇文章主要為大家詳細介紹了PuppeteerSharp庫在C#中的具體應用,需要的小伙伴可以了解下
    2024-01-01
  • C# Guid.NewGuid獲得隨機數(shù)

    C# Guid.NewGuid獲得隨機數(shù)

    根據(jù)GUID獲得種子,然后獲得隨機數(shù),這個是完全隨機的
    2013-04-04
  • c#防止多次運行代碼收集分享

    c#防止多次運行代碼收集分享

    原文:經(jīng)過我的測試,還比較好用,但是有個問題,如果不注銷,用另一個用戶進入,則程序不能判斷出已運行。所以只限于用在單用戶環(huán)境,還是不太完美
    2013-09-09
  • C#連接mariadb(MYSQL分支)代碼示例分享

    C#連接mariadb(MYSQL分支)代碼示例分享

    這篇文章主要介紹了C#連接mariadb的方法,和MySQL連接方式差不多,大家參考使用吧
    2013-11-11
  • c#實現(xiàn)圖片二值化例子(黑白效果)

    c#實現(xiàn)圖片二值化例子(黑白效果)

    這篇文章主要介紹了c#實現(xiàn)圖片二值化例子,圖像二值化就是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現(xiàn)出明顯的黑白效果,需要的朋友可以參考下
    2014-08-08
  • C#創(chuàng)建dll類庫的圖文步驟

    C#創(chuàng)建dll類庫的圖文步驟

    類庫讓我們的代碼可復用,我們只需要在類庫中聲明變量一次,就能在接下來的過程中無數(shù)次地使用,而無需在每次使用前都要聲明它。這樣一來,就節(jié)省了我們的內存空間,需要的朋友可以參考下
    2017-01-01

最新評論

卢龙县| 息烽县| 白沙| 蓝山县| 广德县| 蕲春县| 金寨县| 平利县| 黎平县| 开远市| 泗洪县| 泊头市| 芦山县| 沈丘县| 清镇市| 彩票| 县级市| 南涧| 靖宇县| 合肥市| 清涧县| 玉林市| 汕尾市| 柘城县| 鄢陵县| 睢宁县| 青铜峡市| 景洪市| 乌拉特前旗| 顺平县| 吉林省| 晋城| 磐石市| 五莲县| 乌拉特前旗| 青冈县| 介休市| 廊坊市| 镇远县| 伊金霍洛旗| 榆树市|