首頁 > 軟體

C#加解密之DES演演算法的實現

2022-08-23 14:01:29

前言

說完了對稱加密中的AES,這一篇再來介紹下DES。

加解密原理什麼的就不介紹了,大家可以自行百度(主要我也不太明白,也不需要太明白),大致說一下兩者的區別吧!

  • 首先肯定是加密演演算法的不同,嗯,這一句完全是廢話,不同的加密方式演演算法肯定不會一樣。
  • AES比DES的運算速度更快。
  • AES比DES破解難度高,相對比較安全。

程式碼實現的話其實AES和DES的寫法是基本差不多的,但是這裡有一個引數問題還是需要提一下。在上一篇AES中我們有介紹過金鑰長度只能是16、24、32;在DES中的話,金鑰(Key)的長度是8(由於金鑰的長度問題,所以這裡如果使用暴力破解的話,還是有很高的概率可以還原資料),有向量(IV)的話,長度一般也是8;然後就是在AES中我們採用的是Rijndael,在這裡我們換成DESCryptoServiceProvider;兩個加密的實現程式碼主要就是這裡的不同,其他基本一模一樣,所以稍微改一下即可。

實現功能

使用DES加密方式加解密文字資料

開發環境

開發工具:Visual Studio 2013

.NET Framework版本:4.5

實現程式碼

 public class DesUtil
    {
        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="desModel"></param>
        /// <returns></returns>
        public static byte[] Encrypt(DesModel desModel)
        {
            //使用8位元金鑰
            byte[] key8 = new byte[8];
            //如果我們的金鑰不是8為,則自動補全到8位元
            byte[] byteKey = Encoding.UTF8.GetBytes(desModel.Key.PadRight(key8.Length));
            //複製金鑰
            Array.Copy(byteKey, key8, key8.Length);

            //使用8位元向量
            byte[] iv8 = new byte[8];
            //如果我們的向量不是8為,則自動補全到8位元
            byte[] byteIv = Encoding.UTF8.GetBytes(desModel.IV.PadRight(iv8.Length));
            //複製向量
            Array.Copy(byteIv, iv8, iv8.Length);

            // 建立加密物件
            DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
            desProvider.Mode = desModel.Mode;
            desProvider.Padding = desModel.Padding;
            desProvider.Key = key8;
            desProvider.IV = iv8;
            byte[] result = null;
            try
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream EncryptStream = new CryptoStream(ms, desProvider.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        EncryptStream.Write(desModel.Data, 0, desModel.Data.Length);
                        EncryptStream.FlushFinalBlock();
                        result = ms.ToArray();
                    }
                }
            }
            catch { }
            return result;
        }

        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="desModel"></param>
        /// <returns></returns>
        public static byte[] Decrypt(DesModel desModel)
        {
            //使用8位元金鑰
            byte[] key8 = new byte[8];
            //如果我們的金鑰不是8為,則自動補全到8位元
            byte[] byteKey = Encoding.UTF8.GetBytes(desModel.Key.PadRight(key8.Length));
            //複製金鑰
            Array.Copy(byteKey, key8, key8.Length);

            //使用8位元向量
            byte[] iv8 = new byte[8];
            //如果我們的向量不是8為,則自動補全到8位元
            byte[] byteIv = Encoding.UTF8.GetBytes(desModel.IV.PadRight(iv8.Length));
            //複製向量
            Array.Copy(byteIv, iv8, iv8.Length);

            // 建立解密物件
            DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
            desProvider.Mode = desModel.Mode;
            desProvider.Padding = desModel.Padding;
            desProvider.Key = key8;
            desProvider.IV = iv8;
            byte[] result = null;
            try
            {
                using (MemoryStream ms = new MemoryStream(desModel.Data))
                {
                    using (CryptoStream DecryptStream = new CryptoStream(ms, desProvider.CreateDecryptor(), CryptoStreamMode.Read))
                    {
                        using (MemoryStream msResult = new MemoryStream())
                        {
                            byte[] temp = new byte[1024 * 1024];
                            int len = 0;
                            while ((len = DecryptStream.Read(temp, 0, temp.Length)) > 0)
                            {
                                msResult.Write(temp, 0, len);
                            }

                            result = msResult.ToArray();
                        }
                    }
                }
            }
            catch { }
            return result;
        }

        /// <summary>
        /// DES加密字串
        /// </summary>
        /// <param name="data"></param>
        /// <param name="key"></param>
        /// <param name="iv"></param>
        /// <returns></returns>
        public static string Encrypt(string data, string key, string iv = "")
        {
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            byte[] result = Encrypt(new DesModel
            {
                Data = bytes,
                Key = key,
                IV = iv,
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            });
            if (result == null)
            {
                return "";
            }
            return Convert.ToBase64String(result);
        }

        /// <summary>
        /// DES解密字串
        /// </summary>
        /// <param name="data"></param>
        /// <param name="key"></param>
        /// <param name="iv"></param>
        /// <returns></returns>
        public static string Decrypt(string data, string key, string iv = "")
        {
            byte[] bytes = Convert.FromBase64String(data);
            byte[] result = Decrypt(new DesModel
            {
                Data = bytes,
                Key = key,
                IV = iv,
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            });
            if (result == null)
            {
                return "";
            }
            return Encoding.UTF8.GetString(result);
        }


        public class DesModel
        {
            /// <summary>
            /// 需要加密/解密的資料
            /// </summary>
            public byte[] Data { get; set; }

            /// <summary>
            /// 金鑰
            /// </summary>
            public string Key { get; set; }

            /// <summary>
            /// 向量
            /// </summary>
            public string IV { get; set; }

            /// <summary>
            /// 加密模式
            /// </summary>
            public CipherMode Mode { get; set; }

            /// <summary>
            /// 填充模式
            /// </summary>
            public PaddingMode Padding { get; set; }
        }
    }
 private void btn_Des_Encrypt_Click(object sender, EventArgs e)
        {
            string result = DesUtil.Encrypt(textBox1.Text, "12345678900987654321");
            textBox2.Text = result;
        }

        private void btn_Des_Decrypt_Click(object sender, EventArgs e)
        {
            string result = DesUtil.Decrypt(textBox2.Text, "12345678900987654321");
            textBox1.Text = result;

        }

實現效果

以上就是C#加解密之DES演演算法的實現的詳細內容,更多關於C# DES演演算法的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com