zoukankan      html  css  js  c++  java
  • DES加解密算法

    一、什么是DES

      数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法。这个算法因为包含一些机密设计元素,相对短的密钥长度以及被怀疑内含美国国家安全局(NSA)的后门而在开始时是有争议的,因此DES因此受到了强烈的学院派式的审查,并以此推动了现代的块密码及其密码分析的发展。DES现在已经不被视为一种安全的加密算法,主要因为它使用的56位密钥过短。1999年1月,distributed.net与电子前哨基金会合作,在22小时15分钟内即公开破解了一个DES密钥。也有一些分析报告提出了该算法的理论上的弱点,虽然在实际中难以得到应用。为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,虽然3DES也存在理论上的攻击方法。在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。另外,DES已经不再作为国家标准科技协会(前国家标准局)的一个标准。在某些文献中,作为算法的DES被称为DEA(Data Encryption Algorithm,数据加密算法),以与作为标准的DES区分开来(详情:DES说明)。

      PS:对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性至关重要。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。

     二、C#中的DES加密

      .NET Framework 类库提供了System.Security 命名空间,System.Security 命名空间提供公共语言运行时安全系统的基础结构,包括权限的基类,而该命名空间下提供了DESCryptoServiceProvider类执行DES算法的对称加密和解密。

    代码如下:

    /// <summary>
    /// 随机生成KEY
    /// </summary>
    /// <returns></returns>
    public string GenerateKey()
    {
        int _len = 8;
        Random random = new Random(DateTime.Now.Millisecond);
        byte[] keybyte = new byte[_len];
        for (int i = 0; i < _len; i++)
        {
            keybyte[i] = (byte)random.Next(65, 122);
        }
        return ASCIIEncoding.ASCII.GetString(keybyte);
    }
    
    /// <summary>
    /// DES 加密过程
    /// </summary>
    /// <param name="dataToEncrypt">待加密数据</param>
    /// <param name="DESKey"></param>
    /// <returns></returns>
    public string Encrypt(string dataToEncrypt, string DESKey)
    {
        using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
        {
            byte[] inputByteArray = Encoding.Default.GetBytes(dataToEncrypt);//把字符串放到byte数组中
            des.Key = ASCIIEncoding.ASCII.GetBytes(DESKey); //建立加密对象的密钥和偏移量
            des.IV = ASCIIEncoding.ASCII.GetBytes(DESKey);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    StringBuilder ret = new StringBuilder();
                    foreach (byte b in ms.ToArray())
                    {
                        ret.AppendFormat("{0:x2}", b);
                    }
                    return ret.ToString();
                }
            }
        }
    }
    
    /// <summary>
    /// DES 解密过程
    /// </summary>
    /// <param name="dataToDecrypt">待解密数据</param>
    /// <param name="DESKey"></param>
    /// <returns></returns>
    public string Decrypt(string dataToDecrypt, string DESKey)
    {
        using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
        {
            byte[] inputByteArray = new byte[dataToDecrypt.Length / 2];
            for (int x = 0; x < dataToDecrypt.Length / 2; x++)
            {
                int i = (Convert.ToInt32(dataToDecrypt.Substring(x * 2, 2), 16));
                inputByteArray[x] = (byte)i;
            }
            des.Key = ASCIIEncoding.ASCII.GetBytes(DESKey); //建立加密对象的密钥和偏移量,此值重要,不能修改
            des.IV = ASCIIEncoding.ASCII.GetBytes(DESKey);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    return System.Text.Encoding.Default.GetString(ms.ToArray());
                }
            }
        }
    }

     Demo下载:DESCrypto.rar

     

    参考资料:

    http://zh.wikipedia.org/wiki/DES

    http://baike.baidu.com/view/7591.htm

  • 相关阅读:
    LINQ学习心得分享(一)LINQ简介和基础学习
    线程实用解析(三)线程的同步
    线程实用解析(一)线程初识
    线程实用解析(四)异步操作
    Serialization全解析
    常用排序算法解析
    正则表达式全解析+常用示例
    线程实用解析(二)创建调用有参函数的线程和线程池简介
    线程实用解析(五)BackgroundWorker和Timer
    metro 拖动元素 元素 GIS
  • 原文地址:https://www.cnblogs.com/chenyt/p/2714747.html
Copyright © 2011-2022 走看看