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算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • C# 3DES加密详解

    最近一个项目中,因为服务端是用的java开发的,客户端是用的C#,由于通信部分采用到了3DES加密,所以做个记录,以备以后需要的时候直接用. 这是对方(java)的加密算法,和网上流传的代码也差不多(主密钥直接写死了,方便测试) package org.zwork.market.mina.msg; import java.security.spec.KeySpec; import javax.crypto.Cipher; import javax.crypto.SecretKey; import

  • C#编写DES加密、解密类

    这个C#类封装的DES加密解密,可以使用默认秘钥进行加密.解密,也可以自定义秘钥进行加密.解密,调用简单方便. 示例一: using System; using System.Security.Cryptography; using System.Text; namespace DotNet.Utilities { /// <summary> /// DES加密/解密类. /// </summary> public class DESEncrypt { public DESEncr

  • C#使用DES和AES实现加密解密功能示例

    本文实例讲述了C#使用DES和AES实现加密解密功能.分享给大家供大家参考,具体如下: using System; using System.Text; using System.Security.Cryptography; using System.IO; namespace MyCryptography { /// <summary> /// DES加密解密 /// </summary> public class DES { /// <summary> /// 获取

  • C# DES加密算法中向量的作用详细解析

    DES一共就有4个参数参与运作:明文.密文.密钥.向量.为了初学者容易理解,可以把4个参数的关系写成:密文=明文+密钥+向量:明文=密文-密钥-向量.为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复,那么这个词加上密钥形成的密文,仍然会重复,这给破解者有机可乘,破解者可以根据重复的内容,猜出是什么词,然而一旦猜对这个词,那么,他就能算出密钥,整篇文章就被破解了!加上向量这个参数以后,每块文字段都会依次加上一段值,这样,即使相同的文字,加密出来的密文,也是不一样的,算法的安全性大大提高!

  • C#的3DES加密解密算法实例代码

    C#类如下: 复制代码 代码如下: using System;using System.Collections.Generic;using System.Text;using System.Security.Cryptography;using System.IO; namespace ConsoleApplication1{    /// <summary>    /// 加解密类    /// </summary>    public class EncryptHelper  

  • des加密解密源码 C# key值问题分析

    公司协议安全需求.需要对传输内容做des.md5加密. 因为是新人.刚交给我这个任务的时候有点眩晕.就开始在网上找各种des加密的内容.因为不懂以为需要把原理也搞明白,最后误了时间.把自己也搞糊涂了.当然,逻辑能力强.有兴趣的朋友可以试着去搞搞. 先贴加密.解密的源码: 复制代码 代码如下: /// <summary> /// 加密数据 /// </summary> /// <param name="Text"></param> ///

  • C#实现简单的3DES加密解密功能示例

    本文实例讲述了C#实现简单的3DES加密解密功能.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Security.Cr

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

    目录 前言 实现功能 开发环境 实现代码 实现效果 前言 说完了对称加密中的AES,这一篇再来介绍下DES. 加解密原理什么的就不介绍了,大家可以自行百度(主要我也不太明白,也不需要太明白),大致说一下两者的区别吧! 首先肯定是加密算法的不同,嗯,这一句完全是废话,不同的加密方式算法肯定不会一样. AES比DES的运算速度更快. AES比DES破解难度高,相对比较安全. 代码实现的话其实AES和DES的写法是基本差不多的,但是这里有一个参数问题还是需要提一下.在上一篇AES中我们有介绍过密钥长度

  • C#加解密之AES算法的实现

    目录 实现功能 开发环境 实现代码 实现效果 从这一篇开始呢,写一下常用的一些加解密方式.一般我们来说呢,对于加密,我们分为可逆和不可逆.可逆加密又可分为对称加密(AES.DES等)和非对称加密(RSA),还有就是一些编码加密等(BASE64):不可逆的呢,大部分又都称为摘要算法(MD5.SHA). 其实上面扯这些也是白扯,对于一般用户来讲,我从明文能变成看不懂的密文就是加密了,管他叫什么,为什么要写这些,因为我发现很多人喜欢较真,拿MD5来说吧,专业点来讲,他确实是摘要算法而不是加密算法,但很

  • c#多种加解密示例(md5加密解密)

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Globalization;using System.IO;using System.Security.Cryptography;using System.Text; /// <summary>/// 加解密/// </summary>public static class CryptHelper{    #region RSA加密 /// &

  • Java实现DES加解密算法解析

    本文实例讲述了Java实现DES加解密算法解析.分享给大家供大家参考,具体如下: 简介: 数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常,自动取款机(Automated Teller Machine,ATM)都使用DEA.它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用费而

  • asp.net实现的MD5加密和DES加解密算法类完整示例

    本文实例讲述了asp.net实现的MD5加密和DES加解密算法类.分享给大家供大家参考,具体如下: #region MD5算法 public string md5(string str, int code) { if (code == 32) //32位加密 { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower(); } else /

  • Java实现与JS相同的Des加解密算法完整实例

    本文实例讲述了Java实现与JS相同的Des加解密算法.分享给大家供大家参考,具体如下: 这里演示java与js实现相同的des加解密算法,不多说,不废话,直接上代码 一.java实现 package com.lyz.base.des; import java.util.ArrayList; import java.util.List; /** * DES加密/解密 * * @Copyright Copyright (c) 2015 * @author liuyazhuang * @see DE

  • Javascript C#真正可以交互的DES加解密代码

    因项目需要,要用js加密后,提交给C#解密, 在网上找了半天,网上有无数个版本,却找不到一个能互相使用的 甚至就连都是js版本的,都不能互通,汗一个. 因为时间关系,没有去深究加密代码,就随便下载了一个JS版本的, 并把它改写成C#版本的 这样JS加密后的结果,C#也能解密 反之C#加密后的结果,JS也能解密 我把它发出来给大家共享吧 注:源代码是VS.Net2008版本创建的,里面包含js的加解密函数和C#的加解密函数 如果你找到什么bug,或有啥好建议,不妨联系一下俺,呵呵: btw:在改写

  • python des,aes,rsa加解密的实现

    AES加解密 AES 只是个基本算法,实现 AES 有几种模式,主要有 ECB.CBC.CFB 和 OFB  CTR,直接上代码,此处为AES加密中的CBC模式,EBC模式与CBC模式相比,不需要iv. import base64from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex     unpad = lambda s: s[:-ord(s[len(s) - 1:])] class AES3: def __in

  • 详细分析JAVA加解密算法

    加解密算法分析 日常开发中,无论你是使用什么语言,都应该遇到过使用加解密的使用场景,比如接口数据需要加密传给前端保证数据传输的安全:HTTPS使用证书的方式首先进行非对称加密,将客户端的私匙传递给服务端,然后双方后面的通信都使用该私匙进行对称加密传输:使用MD5进行文件一致性校验,等等很多的场景都使用到了加解密技术. 很多时候我们对于什么时候要使用什么样的加解密方式是很懵的.因为可用的加解密方案实在是太多,大家对加解密技术的类型可能不是很清楚,今天这篇文章就来梳理一下目前主流的加解密技术,本篇文

  • Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例

    关于非对称加密算法我就不过多介绍了,本文着重于python3对RSA算法的实现. from Crypto.PublicKey import RSA import Crypto.Signature.PKCS1_v1_5 as sign_PKCS1_v1_5 #用于签名/验签 from Crypto.Cipher import PKCS1_v1_5 #用于加密 from Crypto import Random from Crypto import Hash x = RSA.generate(204

随机推荐