C#加解密之DES算法的实现

 更新时间:2022年08月23日 11:21:42   作者:Csharp小记  
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准。本文将用C#语言实现DES算法,文中的示例代码讲解详细,感兴趣的可以了解一下

前言

说完了对称加密中的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算法的资料请关注脚本之家其它相关文章!

相关文章

  • C#获取动态生成的CheckBox值

    C#获取动态生成的CheckBox值

    checkbox是VS2012的常用控件之一,可以方便的为某些功能取消或启用,下面教你如何简单使用checkbox。本文通过两种方法给大家介绍,需要的朋友一起看看吧
    2015-09-09
  • C# 关于AppDomain的一些总结

    C# 关于AppDomain的一些总结

    这篇文章主要介绍了C# 关于AppDomain的一些总结,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • 使用C#程序验证系统登录用户与目录权限

    使用C#程序验证系统登录用户与目录权限

    这篇文章主要介绍了使用C#程序验证系统登录用户与目录权限,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • c#异步读取数据库与异步更新ui的代码实现

    c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧
    2013-12-12
  • C#自定义事件及用法实例

    C#自定义事件及用法实例

    这篇文章主要介绍了C#自定义事件及用法,实例分析了C#中自定义事件的定义与使用技巧,需要的朋友可以参考下
    2015-05-05
  • C#实现洗牌算法

    C#实现洗牌算法

    洗牌算法的要求是这样的:将N个数乱序后输出.由于和扑克牌的洗牌过程比较相似所以我也就称为洗牌算法了.很多地方都不自觉的需要这个算法的支持.也可以将这个算法扩展为从N个数中取出M个不重复的数(0<M<=N).今天我们看下如何用C#来实现
    2015-03-03
  • WPF InkCanvas绘制矩形和椭圆

    WPF InkCanvas绘制矩形和椭圆

    这篇文章主要为大家详细介绍了WPF InkCanvas绘制矩形和椭圆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Unity3D使用UGUI开发原生虚拟摇杆

    Unity3D使用UGUI开发原生虚拟摇杆

    这篇文章主要为大家详细介绍了Unity3D使用UGUI开发原生虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Unity实现全屏截图以及QQ截图

    Unity实现全屏截图以及QQ截图

    这篇文章主要为大家详细介绍了Unity实现全屏截图以及QQ截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#判断一个字符串是否包含另一个字符串的方法

    C#判断一个字符串是否包含另一个字符串的方法

    这篇文章主要介绍了C#判断一个字符串是否包含另一个字符串的方法,涉及C#中IndexOf方法的使用技巧,非常简单实用,需要的朋友可以参考下
    2015-04-04

最新评论