DES加密

1 DES算法是对称可逆加密算法,DES是一个分组加密算法,典型的DES以64位为分组对数据加密。
2 DES常见的有ECB模式和CBC模式。ECB模式是JAVA封装的DES算法的默认模式, CBC模式是.NET封装的DES算法的默认模式。
  3.1 ECB是不推荐的方式,只要Key相同时,相同的明文在不同的时候产生相同的明文,容易遭到字典攻击;
  3.2 CBC由于加入了向量参数,一定程度上抵御了字典工具,但缺点也随之而来,一旦中间一个数据出错或丢失,后面的数据将受到影响;
  3.3 CFB与CBC类似,好处是明文和密文不用是8bit的整数倍,中间一个数据出错,只影响后面的几个块的数据;
  3.4 OFB比CFB方式,一旦一个数据出错,不会影响后面的数据,但安全性降低;

4 PKCS7填充方式:为.NET和JAVA的默认填充方式,对加密数据字节长度对8取余为r,如r大于0,则补8-r个字节,字节为8-r的值;如果r等于0,则补8个字节8。

源码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace Cryp
{
    public static class DES
    {
        /// <summary>  
        /// DES加密
        /// </summary>  
        /// <param name="data">要加密的字符串</param>  
        /// <param name="key">密钥,且Length必须为8位</param>  
        /// <param name="keyEncoding">密钥编码方式</param>  
        /// <param name="dataEncoding">要加密字符串加载时编码方式</param>  
        /// <param name="cipherMode">对称算法的运算模式</param>  
        /// <param name="paddingMode">对称算法中使用的填充模式</param>  
        /// <returns>64位编码字符串</returns>  
        public static string DESEncrypt(string data, string key, Encoding keyEncoding, Encoding dataEncoding, CipherMode cipherMode = CipherMode.CBC, PaddingMode paddingMode = PaddingMode.PKCS7)
        {
            return Convert.ToBase64String(DESEncrypt(dataEncoding.GetBytes(data), key, keyEncoding, cipherMode, paddingMode));
        }

        /// <summary>  
        /// DES加密
        /// </summary>  
        /// <param name="data">要加密字节流</param>  
        /// <param name="key">密钥,且Length必须为8位</param> 
        /// <param name="keyEncoding">密钥编码方式</param>   
        /// <param name="cipherMode">对称算法的运算模式</param> 
        /// <param name="paddingMode">对称算法中使用的填充模式</param>  
        /// <returns></returns>  
        public static byte[] DESEncrypt(byte[] data, string key, Encoding keyEncoding, CipherMode cipherMode, PaddingMode paddingMode = PaddingMode.PKCS7)
        {
            using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
            {
                des.Key = keyEncoding.GetBytes(key);
                des.IV = keyEncoding.GetBytes(key);
                des.Mode = cipherMode;
                des.Padding = paddingMode;
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(data, 0, data.Length);
                        cs.FlushFinalBlock();
                    }
                    byte[] str = ms.ToArray();
                    return str;
                }
            }
        }

        /// <summary>  
        /// DES解密  
        /// </summary>  
        /// <param name="data">要解密的字符串</param>  
        /// <param name="key">密钥,且Length必须为8位</param>  
        /// <param name="keyEncoding">密钥编码方式</param>  
        /// <param name="dataEncoding">要解密字符串加载时编码方式</param> 
        /// <param name="cipherMode">对称算法的运算模式</param>  
        /// <param name="paddingMode">对称算法中使用的填充模式</param>  
        /// <returns></returns>  
        public static string DESUnEncrypt(string data, string key, Encoding keyEncoding, Encoding dataEncoding, CipherMode cipherMode, PaddingMode paddingMode = PaddingMode.PKCS7)
        {
            return dataEncoding.GetString(DESUnEncrypt(Convert.FromBase64String(data), key, keyEncoding, cipherMode, paddingMode));
        }

        /// <summary>  
        /// DES解密。  
        /// </summary>  
        /// <param name="data">要解密字节流</param>  
        /// <param name="key">密钥,且Length必须为8位</param>  
        /// <param name="keyEncoding">密钥编码方式</param>  
        /// <param name="cipherMode">对称算法的运算模式</param>  
        /// <param name="paddingMode">对称算法中使用的填充模式</param>  
        /// <returns></returns>  
        public static byte[] DESUnEncrypt(byte[] data, string key, Encoding keyEncoding, CipherMode cipherMode, PaddingMode paddingMode = PaddingMode.PKCS7)
        {
            using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
            {
                des.Key = keyEncoding.GetBytes(key);
                des.IV = keyEncoding.GetBytes(key);
                des.Mode = cipherMode;
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(data, 0, data.Length);
                        cs.FlushFinalBlock();
                    }
                    byte[] str = ms.ToArray();
                    return str;
                }
            }
        }

    }
}

 

posted @ 2019-04-11 14:29  唧唧复唧唧木兰当户织  阅读(746)  评论(0编辑  收藏  举报