参考多方代码,修改后适合自己用的,拿来与大家分享,可以对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");第一个参数是传入需要加入的字符串,第二个参数为加密密钥,解密时也需要密钥对应才行。