对称加密解密类

参考多方代码,修改后适合自己用的,拿来与大家分享,可以对url或者是url参数进行加密解密。
using System;
using System.Collections.Generic;
using System.Web;
using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Web.UI;

namespace witpon
{
    /// <summary>
    ///CryptoHelper 的摘要说明
    ///对称加密解密帮助类   可以对url进行加密解密
    /// </summary>
    public class CryptoHelper : Page
    {
      


        private ICryptoTransform encryptor;//加密器对象
        private ICryptoTransform decryptor;//解密器对象
        private const int BufferSize = 100;//缓冲区大小

        /// <summary>
        /// 对称加密解密类构造函数  两个参数  可自定义指定算法名称 algorithmName
        /// </summary>
        /// <param name="algorithmName">对称算法名称</param>
        /// <param name="key">对称算法Key</param>
        public CryptoHelper(string algorithmName,string key) {
            //对称算法类
            SymmetricAlgorithm provider = SymmetricAlgorithm.Create(algorithmName);
            //对称算法密钥
            provider.Key = Encoding.UTF8.GetBytes(key);
            //对称算法的初始化向量   偏移量
            provider.IV = new byte[] {0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};

            encryptor = provider.CreateEncryptor();//创建对称加密器对象
            decryptor = provider.CreateDecryptor();//创建对称解密器对象

        }


        /// <summary>
        /// 对称加密解密类构造函数  一个参数  会默认对称算法名称为:TripleDES
        /// </summary>
        /// <param name="key">加密Key</param>
        public CryptoHelper(string key) : this("TripleDES", key) { }

        /// <summary>
        /// 加密算法
        /// </summary>
        /// <param name="clearText">需要加密的字符串</param>
        /// <returns>返回加密后的字符串</returns>
        public string Encrypt(string clearText) { 
        //创建明文流
            byte[] clearBuffer = Encoding.UTF8.GetBytes(clearText);
            MemoryStream clearStream = new MemoryStream(clearBuffer);

            //创建空的密文流
            MemoryStream encryptedStream = new MemoryStream();

            CryptoStream cryptoStream = new CryptoStream(encryptedStream,encryptor,CryptoStreamMode.Write);

            //将明文流写入到Buffer中
            //将buffer中的数据写入到cryptoStream中
            int bytesRead = 0;
            byte[] buffer=new byte[BufferSize];
            do{
                bytesRead = clearStream.Read(buffer,0,BufferSize);
                cryptoStream.Write(buffer,0,bytesRead);
            }while(bytesRead>0);


            cryptoStream.FlushFinalBlock();

            //获取加密后的文本
            buffer = encryptedStream.ToArray();
            string encryptedText = Convert.ToBase64String(buffer);
            return encryptedText;

        }

        /// <summary>
        /// 解密算法
        /// </summary>
        /// <param name="encryptedText">需要解密的字符串</param>
        /// <returns>返回解密后的字符串</returns>
        public string Decrypt(string encryptedText) {
            //加密后会有+号,在url中会把+号转化为空格,如果不进行替换就会解密不出来
            encryptedText = encryptedText.Replace(" ","+");
            byte[] encryptedBuffer =Convert.FromBase64String(encryptedText);
            Stream encryptedStream = new MemoryStream(encryptedBuffer);

            MemoryStream clearStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(encryptedStream,decryptor,CryptoStreamMode.Read);
            int bytesRead = 0;
            byte[] buffer = new byte[BufferSize];
            do{
                bytesRead = cryptoStream.Read(buffer,0,BufferSize);
                clearStream.Write(buffer,0,bytesRead);
            }while(bytesRead>0);
            buffer = clearStream.GetBuffer();
            string clearText = Encoding.UTF8.GetString(buffer,0,(int)clearStream.Length);
            return clearText;

            

        }


        /// <summary>
        /// 加密方法
        /// </summary>
        /// <param name="clearText">需要加密的字符串</param>
        /// <param name="key">加密Key</param>
        /// <returns>返回加密后的字符串</returns>
        public static string Encrypt(string clearText,string key) {

            CryptoHelper helper = new CryptoHelper(key);
            return helper.Encrypt(clearText);
        }


        /// <summary>
        /// 解密方法
        /// </summary>
        /// <param name="encryptedText">需要解密的字符串</param>
        /// <param name="key">解密所依据的Key</param>
        /// <returns>返回解密后的字符串</returns>
        public static string Decrypt(string encryptedText,string key) {
            CryptoHelper helper = new CryptoHelper(key);
            return helper.Decrypt(encryptedText);
        }

      
    }
}


页面上调用此类中的方法时,先引入命名空间。调用时可以先实例化也可以直接通过类名调用静态方法。

需要注意的是加密后有的会有 “+”号,传输时会成为 “ ”空格,在解密时需要转换处理一下这个“ ”空格为“+”号才好。

 string UserNo = CryptoHelper.Encrypt("MAXIN", "ABCDEFGHIJKLMNOP");第一个参数是传入需要加入的字符串,第二个参数为加密密钥,解密时也需要密钥对应才行。


欢迎加入.net技术交流群.Net技术交流

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值