开发手册 欢迎您!
软件开发者资料库

.NET(C#) DES(Data Encryption Standard)加解密实现代码

DES(Data Encryption Standard)是对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。本文主要介绍.NET(C#) DES(Data Encryption Standard)加解密实现代码。

1、DES加密简介

美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。加密算法要达到的目的(通常称为DES 密码算法要求)主要为以下四点: 1)提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;

2)具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握;

3)DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础;

4)实现经济,运行有效,并且适用于多种完全不同的应用。

DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。

  DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。

  通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。

2、DES加解密实现代码

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication{    class Program    {        static void Main(string[] args)        {            //可逆对称加密            //数据传输   加密速度快密钥的安全是问题            string desEn = DesEncrypt.Encrypt("url=https://www.wonhero.com");            Console.WriteLine("desEn = " + desEn);            string desDe = DesEncrypt.Decrypt(desEn);            Console.WriteLine("desDe = " + desDe);            string desEn1 = DesEncrypt.Encrypt(".net程序员");            Console.WriteLine("desEn1 = " + desEn1);            string desDe1 = DesEncrypt.Decrypt(desEn1);            Console.WriteLine("desDe1 = " + desDe1);            Console.ReadKey();        }    }    ///     /// DES AES Blowfish    ///  对称加密算法的优点是速度快,    ///  缺点是密钥管理不方便,要求共享密钥。    /// 可逆对称加密  密钥长度8    ///     public class DesEncrypt    {        private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes("wonheroe");        private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes("wwonhero");        ///         /// DES 加密        ///         /// 需要加密的值        /// 加密后的结果        public static string Encrypt(string text)        {            DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();            using (MemoryStream memStream = new MemoryStream())            {                CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);                StreamWriter sWriter = new StreamWriter(crypStream);                sWriter.Write(text);                sWriter.Flush();                crypStream.FlushFinalBlock();                memStream.Flush();                return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);            }        }        ///         /// DES解密        ///         ///         /// 解密后的结果        public static string Decrypt(string encryptText)        {            DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();            byte[] buffer = Convert.FromBase64String(encryptText);            using (MemoryStream memStream = new MemoryStream())            {                CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);                crypStream.Write(buffer, 0, buffer.Length);                crypStream.FlushFinalBlock();                return ASCIIEncoding.UTF8.GetString(memStream.ToArray());            }        }    }}