一、什么是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

 posted on 2012-10-10 10:47  john chen  阅读(21908)  评论(0编辑  收藏  举报