加密,解密功能函数

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, 01024);
                
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(05);
                
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);
        }
    }
}

*/

//
//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值