程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 加密,解密功能函數

加密,解密功能函數

編輯:C#基礎知識
using System;
using System.IO;
using System.Text;
using System.Security;
using System.Security.Cryptography;

namespace Common
{
    /**//**/
    /**//// <summary>
    /// 加密,解密功能函數
    /// </summary> 
    public class EncryptionUtil
    {
        public EncryptionUtil()
        {
            //
            // TODO: Add constructor logic here
            // 

        }

        static private Byte[] m_Key = new Byte[8];
        static private Byte[] m_IV = new Byte[8];

        //為了安全,直接將key寫死在文件中,你也可以用一個屬性來實現 
        public string key = "(@jhtchina@)";

        /**//**/
        /**/////////////////////////// 
        //加密函數 
        public string EncryptData(String strKey, String strData)
        {
            string strResult; //Return Result

            //1. 字符大小不能超過 90Kb. 否則, 緩存容易溢出(看第3點) 
            if (strData.Length > 92160)
            {
                strResult = "Error. Data String too large. Keep within 90Kb.";
                return strResult;
            }

            //2. 生成key 
            if (!InitKey(strKey))
            {
                strResult = "Error. Fail to generate key for encryption";
                return strResult;
            }

            //3. 准備處理的字符串
            //字符串的前5個字節用來存儲數據的長度
            //用這個簡單的方法來記住數據的初始大小,沒有用太復雜的方法 
            strData = String.Format("{0,5:00000}" + strData, strData.Length);


            //4. 加密數據 
            byte[] rbData = new byte[strData.Length];
            ASCIIEncoding aEnc = new ASCIIEncoding();
            aEnc.GetBytes(strData, 0, strData.Length, rbData, 0);
            //加密功能實現的主要類 
            DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();

            ICryptoTransform desEncrypt = descsp.CreateEncryptor(m_Key, m_IV);


            //5. 准備stream
            // mOut是輸出流.
            // mStream是輸入流
            // cs為轉換流 
            MemoryStream mStream = new MemoryStream(rbData);
            CryptoStream cs = new CryptoStream(mStream, desEncrypt, CryptoStreamMode.Read);
            MemoryStream mOut = new MemoryStream();

            //6. 開始加密 
            int bytesRead;
            byte[] output = new byte[1024];
            do
            {
                bytesRead = cs.Read(output, 0, 1024);
                if (bytesRead != 0)
                    mOut.Write(output, 0, bytesRead);
            } while (bytesRead > 0);

            //7. 返回加密結果
            //因為是一個web項目,在這裡轉換為base64,因此在http上是不會出錯的 
            if (mOut.Length == 0)
                strResult = "";
            else
                strResult = Convert.ToBase64String(mOut.GetBuffer(), 0, (int)mOut.Length);

            return strResult;
        }

        /**//**/
        /**/////////////////////////// 
        //解密函數 
        public string DecryptData(String strKey, String strData)
        {
            string strResult;

            //1. 生成解密key 
            if (!InitKey(strKey))
            {
                strResult = "Error. Fail to generate key for decryption";
                return strResult;
            }

            //2. 初始化解密的主要類 
            int nReturn = 0;
            DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();
            ICryptoTransform desDecrypt = descsp.CreateDecryptor(m_Key, m_IV);

            //3. 准備stream
            // mOut為輸出流
            // cs為轉換流 
            MemoryStream mOut = new MemoryStream();
            CryptoStream cs = new CryptoStream(mOut, desDecrypt, CryptoStreamMode.Write);

            byte[] bPlain = new byte[strData.Length];
            try
            {
                bPlain = Convert.FromBase64CharArray(strData.ToCharArray(), 0, strData.Length);
            }
            catch (Exception)
            {
                strResult = "Error. Input Data is not base64 encoded.";
                return strResult;
            }

            long lRead = 0;
            long lTotal = strData.Length;

            try
            {
                //5. 完成解密 
                while (lTotal >= lRead)
                {
                    cs.Write(bPlain, 0, (int)bPlain.Length);
                    lRead = mOut.Length + Convert.ToUInt32(((bPlain.Length / descsp.BlockSize) * descsp.BlockSize));
                };

                ASCIIEncoding aEnc = new ASCIIEncoding();
                strResult = aEnc.GetString(mOut.GetBuffer(), 0, (int)mOut.Length);

                //6.去處存儲長度的前5個字節的數據 
                String strLen = strResult.Substring(0, 5);
                int nLen = Convert.ToInt32(strLen);
                strResult = strResult.Substring(5, nLen);
                nReturn = (int)mOut.Length;

                return strResult;
            }
            catch (Exception)
            {
                strResult = "Error. Decryption Failed. Possibly due to incorrect Key or corrputed data";
                return strResult;
            }
        }

        /**//**/
        /**////////////////////////////////////////////////////////////// 
        //生成key的函數 
        static private bool InitKey(String strKey)
        {
            try
            {
                // 轉換key為字節流 
                byte[] bp = new byte[strKey.Length];
                ASCIIEncoding aEnc = new ASCIIEncoding();
                aEnc.GetBytes(strKey, 0, strKey.Length, bp, 0);

                SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
                byte[] bpHash = sha.ComputeHash(bp);

                int i;
                // 生成初始化DESCryptoServiceProvider的參數 
                for (i = 0; i < 8; i++)
                    m_Key[i] = bpHash[i];

                for (i = 8; i < 16; i++)
                    m_IV[i - 8] = bpHash[i];

                return true;
            }
            catch (Exception)
            {
                //錯誤處理 
                return false;
            }
        }
    }
}



/**//*
      using System;
using System.Collections.Generic;
using System.Text;

using NUnit.Framework;

namespace test11
{
    [TestFixture]
    public class Class1
    {
        
        public string test111(string currentValue)
        {
            //Console.Out.Write("11");
            EncryptionUtil EU = new EncryptionUtil();
            //int count = Convert.ToInt32(EU.DecryptData(EU.key, currentValue));
            return EU.DecryptData(EU.key, EU.DecryptData(EU.key, currentValue));
        }

        public string test222(string currentValue)
        {
           
            EncryptionUtil EU = new EncryptionUtil();
            return EU.EncryptData(EU.key, EU.EncryptData(EU.key, currentValue));
        }

        [Test]
        public void test_Main()
        {
            string str_Pass = test222("0123456789");
            Console.Out.WriteLine(str_Pass);
            string str_Number = test111(str_Pass);
            Console.Out.WriteLine(str_Number);
        }
    }
}

*/
//
//
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved