加密算法C#实现:DES

4.1 原理介绍

  DES(数据加密标准,Data Encryption Standard),出自IBM的研究,后被美国政府正式采用,密钥长度56位,以现代的计算能力可在24h以内被暴力破解。算法设计原理参考这篇博客。

  顺便说一下3DES(Triple DES),它是DES向AES过渡的加密算法,使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。 .

4.2 C#代码

  C#中提供封装好的DES加解密方法,直接调用即可。

// DES(数据加密标准,Data Encryption Standard)

public sealed class DES

{

    /* DES相关

       ecb、ctr模式不需要初始化向量

       cbc、ofc、cfb需要初始化向量

       初始化向量的长度:DES/3DES为8byte;AES为16byte。加解密使用的IV相同。

    */

 

    /// <summary>

    /// DES加密

    /// </summary>

    /// <param name="plaintext">明文</param>

    /// <param name="key">密钥,长度8byte</param>

    /// <param name="iv">初始化向量,长度8byte</param>

    /// <returns>返回密文</returns>

    public static string DESEncrypt(string plaintext, string key, string iv)

    {

        try

        {

            byte[] btKey = Encoding.UTF8.GetBytes(key);

            byte[] btIV = Encoding.UTF8.GetBytes(iv);

            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            using (MemoryStream ms = new MemoryStream())

            {

                byte[] inData = Encoding.UTF8.GetBytes(plaintext);

                try

                {

                    using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))

                    {

                        cs.Write(inData, 0, inData.Length);

                        cs.FlushFinalBlock();

                    }

                    return Convert.ToBase64String(ms.ToArray());

                }

                catch

                {

                    return plaintext;

                }

            }

        }

        catch { }

        return "DES加密出错";

    }

 

    /// <summary>

    /// DES解密

    /// </summary>

    /// <param name="ciphertext">密文</param>

    /// <param name="key">密钥,长度8byte</param>

    /// <param name="iv">初始化向量,长度8byte</param>

    /// <returns>返回明文</returns>

    public static string DESDecrypt(string ciphertext, string key, string iv)

    {

        if (ciphertext == "") return "";

        try

        {

            byte[] btKey = Encoding.UTF8.GetBytes(key);

            byte[] btIV = Encoding.UTF8.GetBytes(iv);

            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            using (MemoryStream ms = new MemoryStream())

            {

                byte[] inData = Convert.FromBase64String(ciphertext);

                try

                {

                    using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write))

                    {

                        cs.Write(inData, 0, inData.Length);

                        cs.FlushFinalBlock();

                    }

                    return Encoding.UTF8.GetString(ms.ToArray());

                }

                catch

                {

                    return ciphertext;

                }

            }

        }

        catch { }

        return "DES解密出错";

    }

}