LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 加解密之DES

admin
2023年2月27日 10:24 本文热度 459

   说完了对称加密中的AES,这一篇再来介绍下DES。

    加解密原理什么的就不介绍了,大家可以自行百度(主要我也不太明白,也不需要太明白),大致说一下两者的区别吧!

  1. 首先肯定是加密算法的不同,嗯,这一句完全是废话,不同的加密方式算法肯定不会一样。

  2. AES比DES的运算速度更快。

  3. 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;
}

实现效果:



该文章在 2023/2/27 10:24:45 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved