最近由于项目的原因,接触到DES加密解密,结合网上的例子整合了一个单例模式的加密解密帮助类,希望对大家有帮助,欢迎多交流。

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Security;

using System.Security.Cryptography;

 

namespace Controller

{

    class DESHelper

    {

        string iv = "1234的yzo"; //可以改成读取配置文件

        string key = "123在yzo"; 

 

        private static DESHelper instance = null;

        private DESHelper() { }

        public static DESHelper getInstance()

        {

            if (instance == null)

            {

                instance = new DESHelper();

            }

            return instance;

        }

 

 

        /// <summary>

        /// DES加密偏移量,必须是>=8位长的字符串

        /// </summary>

        public string IV

        {

            get { return iv; }

            set { iv = value; }

        }

 

        /// <summary>

        /// DES加密的私钥,必须是8位长的字符串

        /// </summary>

        public string Key

        {

            get { return key; }

            set { key = value; }

        }

 

        /// <summary>

        /// 对字符串进行DES加密

        /// </summary>

        /// <param name="sourceString">待加密的字符串</param>

        /// <returns>加密后的BASE64编码的字符串</returns>

        public string Encrypt(string sourceString)

        {

            try

            {

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

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

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                using (MemoryStream ms = new MemoryStream())

                {

                    byte[] inData = Encoding.Default.GetBytes(sourceString);

 

                    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 (Exception ex)

            {

                Logger.error("加密异常!" + ex.ToString());

            }

            return sourceString;

        }

 

        /// <summary>

        /// 对DES加密后的字符串进行解密

        /// </summary>

        /// <param name="encryptedString">待解密的字符串</param>

        /// <returns>解密后的字符串</returns>

        public string Decrypt(string encryptedString)

        {

            try

            {

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

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

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

 

                using (MemoryStream ms = new MemoryStream())

                {

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

 

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

                    {

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

                        cs.FlushFinalBlock();

                    }

 

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

                }

            }

            catch (Exception ex)

            {

                Logger.error("解密异常!" + ex.ToString());

            }

            return encryptedString;

        }

 

        /// <summary>

        /// 对文件内容进行DES加密

        /// </summary>

        /// <param name="sourceFile">待加密的文件绝对路径</param>

        /// <param name="destFile">加密后的文件保存的绝对路径</param>

        public void EncryptFile(string sourceFile, string destFile)

        {

            if (!File.Exists(sourceFile)) throw new FileNotFoundException("指定的文件路径不存在!", sourceFile);

 

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

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

            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            byte[] btFile = File.ReadAllBytes(sourceFile);

 

            using (FileStream fs = new FileStream(destFile, FileMode.Create, FileAccess.Write))

            {

                try

                {

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

                    {

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

                        cs.FlushFinalBlock();

                    }

                }

                catch

                {

                    throw;

                }

                finally

                {

                    fs.Close();

                }

            }

        }

 

        /// <summary>

        /// 对文件内容进行DES加密,加密后覆盖掉原来的文件

        /// </summary>

        /// <param name="sourceFile">待加密的文件的绝对路径</param>

        public void EncryptFile(string sourceFile)

        {

            EncryptFile(sourceFile, sourceFile);

        }

 

        /// <summary>

        /// 对文件内容进行DES解密

        /// </summary>

        /// <param name="sourceFile">待解密的文件绝对路径</param>

        /// <param name="destFile">解密后的文件保存的绝对路径</param>

        public void DecryptFile(string sourceFile, string destFile)

        {

            if (!File.Exists(sourceFile)) throw new FileNotFoundException("指定的文件路径不存在!", sourceFile);

 

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

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

            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            byte[] btFile = File.ReadAllBytes(sourceFile);

 

            using (FileStream fs = new FileStream(destFile, FileMode.Create, FileAccess.Write))

            {

                try

                {

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

                    {

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

                        cs.FlushFinalBlock();

                    }

                }

                catch

                {

                    throw;

                }

                finally

                {

                    fs.Close();

                }

            }

        }

 

        /// <summary>

        /// 对文件内容进行DES解密,加密后覆盖掉原来的文件

        /// </summary>

        /// <param name="sourceFile">待解密的文件的绝对路径</param>

        public void DecryptFile(string sourceFile)

        {

            DecryptFile(sourceFile, sourceFile);

        }

 

    }

}

 

使用例子:

string es = DESHelper.getInstance().Encrypt("在");

    Console.WriteLine(es);

    Console.Write(DESHelper.getInstance().Decrypt(es));

 

    DESHelper.getInstance().EncryptFile(@"d:\a.txt", @"d:\b.txt");

DESHelper.getInstance().DecryptFile(@"d:\b.txt");

 

C# DES 加密/解密类库,支持文件和中文/UNICODE字符,返回BASE64编码字符串