C# 加密解密字符串文件

最近由於項目的原因,接觸到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編碼字符串

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章