用到的一个加密方法和一个解密算法
public class H
{
private string key;
public H()
{
this.key = "hhhhhhh1";
}
/// <summary>
/// H
/// </summary>
/// <param name="key">加密密钥,要求为8位</param>
public H(string key)
{
this.key = key;
}
/// <summary>
/// DES解密字符串
/// </summary>
/// <param name="s">待解密的字符串</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
public string Decrypt(string s)
{
return this.Decrypt(s, this.key);
}
private string Decrypt(string pToDecrypt, string sKey)
{
try
{
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
byte[] buffer = new byte[pToDecrypt.Length / 2];
for (int i = 0; i < (pToDecrypt.Length / 2); i++)
{
int num2 = Convert.ToInt32(pToDecrypt.Substring(i * 2, 2), 0x10);
buffer[i] = (byte)num2;
}
provider.Key = Encoding.ASCII.GetBytes(sKey);
provider.IV = Encoding.ASCII.GetBytes(sKey);
MemoryStream stream = new MemoryStream();
CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write);
stream2.Write(buffer, 0, buffer.Length);
stream2.FlushFinalBlock();
new StringBuilder();
return Encoding.Default.GetString(stream.ToArray());
}
catch
{
return pToDecrypt;
}
}
/// <summary>
/// DES加密字符串
/// </summary>
/// <param name="s">待加密的字符串</param>
/// <returns>返回加密后的字符串,失败返回源串</returns>
public string Encrypt(string s)
{
return this.Encrypt(s, this.key);
}
private string Encrypt(string pToEncrypt, string sKey)
{
try
{
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
byte[] bytes = Encoding.Default.GetBytes(pToEncrypt);
provider.Key = Encoding.ASCII.GetBytes(sKey);
provider.IV = Encoding.ASCII.GetBytes(sKey);
MemoryStream stream = new MemoryStream();
CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
stream2.Write(bytes, 0, bytes.Length);
stream2.FlushFinalBlock();
StringBuilder builder = new StringBuilder();
foreach (byte num in stream.ToArray())
{
builder.AppendFormat("{0:X2}", num);
}
builder.ToString();
return builder.ToString();
}
catch
{
return pToEncrypt;
}
}
}
对了还需要一个随机生成验证字符串的方法
/// <summary>
/// 生成随机字母字符串(数字字母混和)
/// </summary>
/// <param name="codeCount">待生成的位数</param>
/// <param name="rep">初始可更改参数,调用需要加关键词ref</param>
/// <returns>生成的字母字符串</returns>
public static string GenerateCheckCode(int codeCount, ref int rep)
{
string str = string.Empty;
long num2 = DateTime.Now.Ticks + rep;
rep++;
Random random = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> rep)));
for (int i = 0; i < codeCount; i++)
{
char ch;
int num = random.Next();
if ((num % 2) == 0)
{
ch = (char)(0x30 + ((ushort)(num % 10)));
}
else
{
ch = (char)(0x41 + ((ushort)(num % 0x1a)));
}
str = str + ch.ToString();
}
return str;
}
一:用一般处理程序返回一张验证码图片
创建getCheckCode.ashx
<%@ WebHandler Language="C#" Class="getCheckCode" %>
using System;
using System.Web;
using System.Text;
using System.Drawing;
using System.IO;
using System.Drawing.Drawing2D;
using Controls;
public class getCheckCode : IHttpHandler,System.Web.SessionState.IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
String data = context.Request["vCode"];
H h = new H();
string decode = h.Decrypt(data);//解密
//string _code = GenerateCheckCodes(6);
System.Drawing.Image image = CreateCheckCodeImage(decode);
System.IO.MemoryStream MStream = new System.IO.MemoryStream();
image.Save(MStream, System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ClearContent();
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(MStream.ToArray());
MStream.Dispose();
context.Response.Flush();
context.Response.End();
}
public string GenerateCheckCodes(int iCount)
{
int number;
string checkCode = String.Empty;
int iSeed = DateTime.Now.Millisecond;
System.Random random = new Random(iSeed);
for (int i = 0; i < iCount; i++)
{
number = random.Next(10);
checkCode += number.ToString();
}
return checkCode;
}
private Image CreateCheckCodeImage(string checkCode)
{
//Image image1;
//if (string.IsNullOrEmpty(checkCode)) return image1;
int iWordWidth = 15;
int iImageWidth = checkCode.Length * iWordWidth;
Bitmap image = new Bitmap(iImageWidth, 20);
Graphics g = Graphics.FromImage(image);
//生成随机生成器
Random random = new Random();
//清空图片背景色
g.Clear(Color.White);
//画图片的背景噪音点
for (int i = 0; i < 20; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
//画图片的背景噪音线
for (int i = 0; i < 2; i++)
{
int x1 = 0;
int x2 = image.Width;
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
if (i == 0)
{
g.DrawLine(new Pen(Color.Gray, 2), x1, y1, x2, y2);
}
}
for (int i = 0; i < checkCode.Length; i++)
{
string Code = checkCode[i].ToString();
int xLeft = iWordWidth * (i);
random = new Random(xLeft);
int iSeed = DateTime.Now.Millisecond;
int iValue = random.Next(iSeed) % 4;
if (iValue == 0)
{
Font font = new Font("Arial", 13, (FontStyle.Bold | System.Drawing.FontStyle.Italic));
Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height);
LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.Red, 1.5f, true);
g.DrawString(Code, font, brush, xLeft, 2);
}
else if (iValue == 1)
{
Font font = new System.Drawing.Font("楷体", 13, (FontStyle.Bold));
Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height);
LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.DarkRed, 1.3f, true);
g.DrawString(Code, font, brush, xLeft, 2);
}
else if (iValue == 2)
{
Font font = new System.Drawing.Font("宋体", 13, (System.Drawing.FontStyle.Bold));
Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height);
LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Green, Color.Blue, 1.2f, true);
g.DrawString(Code, font, brush, xLeft, 2);
}
else if (iValue == 3)
{
Font font = new System.Drawing.Font("黑体", 13, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Bold));
Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height);
LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.Green, 1.8f, true);
g.DrawString(Code, font, brush, xLeft, 2);
}
}
//画图片的前景噪音点
//for (int i = 0; i < 8; i++)
//{
// int x = random.Next(image.Width);
// int y = random.Next(image.Height);
// image.SetPixel(x, y, Color.FromArgb(random.Next()));
//}
//画图片的边框线
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
return image;
}
public bool IsReusable {
get {
return false;
}
}
}
写一个.aspx页面调用这个.ashx页面
页面需要一个图片控件
<asp:Image ID="imgCheck" runat="server" />
后台.aspx.cs代码
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
int aa = 23;//任意值
string vcode = GenerateCheckCode(4, ref aa);
H h = new H();
string encode = h.Encrypt(vcode);//加密
//string decode = h.Decrypt(encode);//解密
imgCheck.ImageUrl = "getCheckCode.ashx?vCode=" + encode;
}
}
二:一维码,39码
一般处理程序.ashx
<%@ WebHandler Language="C#" Class="GetCode" %>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Collections;
using System.Drawing;
public class GetCode : IHttpHandler {
public void ProcessRequest(HttpContext context)
{
string _codeText = string.Empty;
string _Magnify = string.Empty;
string _height = string.Empty;
if (context.Request["vCode"] != null) _codeText = context.Request["vCode"].ToString().Trim();
if (context.Request["m"] != null) _Magnify = context.Request["m"].ToString();
if (context.Request["h"] != null) _height = context.Request["h"].ToString();
_codeText = string.IsNullOrEmpty(_codeText) ? "123ABC4567890FWF" : _codeText;
_Magnify = string.IsNullOrEmpty(_Magnify) ? "0" : _Magnify;
_height = string.IsNullOrEmpty(_height) ? "60" : _height;
this.Height = int.Parse(_height);
this.Magnify = byte.Parse(_Magnify);
this.ViewFont = new Font("宋体", 10);
Code39();
//输出img
System.Drawing.Image _CodeImage = this.GetCodeImage(_codeText, Code39Model.Code39Normal, true);
System.IO.MemoryStream _Stream = new System.IO.MemoryStream();
context.Response.ContentType = "image/jpeg";
_CodeImage.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
public bool IsReusable
{
get
{
return false;
}
}
private Hashtable m_Code39 = new Hashtable();
private byte m_Magnify = 0;
/// <summary>
/// 放大倍数
/// </summary>
public byte Magnify { get { return m_Magnify; } set { m_Magnify = value; } }
private int m_Height = 40;
/// <summary>
/// 图形高
/// </summary>
public int Height { get { return m_Height; } set { m_Height = value; } }
private Font m_ViewFont = null;
/// <summary>
/// 字体大小
/// </summary>
public Font ViewFont { get { return m_ViewFont; } set { m_ViewFont = value; } }
public void Code39()
{
m_Code39.Add("A", "1101010010110");
m_Code39.Add("B", "1011010010110");
m_Code39.Add("C", "1101101001010");
m_Code39.Add("D", "1010110010110");
m_Code39.Add("E", "1101011001010");
m_Code39.Add("F", "1011011001010");
m_Code39.Add("G", "1010100110110");
m_Code39.Add("H", "1101010011010");
m_Code39.Add("I", "1011010011010");
m_Code39.Add("J", "1010110011010");
m_Code39.Add("K", "1101010100110");
m_Code39.Add("L", "1011010100110");
m_Code39.Add("M", "1101101010010");
m_Code39.Add("N", "1010110100110");
m_Code39.Add("O", "1101011010010");
m_Code39.Add("P", "1011011010010");
m_Code39.Add("Q", "1010101100110");
m_Code39.Add("R", "1101010110010");
m_Code39.Add("S", "1011010110010");
m_Code39.Add("T", "1010110110010");
m_Code39.Add("U", "1100101010110");
m_Code39.Add("V", "1001101010110");
m_Code39.Add("W", "1100110101010");
m_Code39.Add("X", "1001011010110");
m_Code39.Add("Y", "1100101101010");
m_Code39.Add("Z", "1001101101010");
m_Code39.Add("0", "1010011011010");
m_Code39.Add("1", "1101001010110");
m_Code39.Add("2", "1011001010110");
m_Code39.Add("3", "1101100101010");
m_Code39.Add("4", "1010011010110");
m_Code39.Add("5", "1101001101010");
m_Code39.Add("6", "1011001101010");
m_Code39.Add("7", "1010010110110");
m_Code39.Add("8", "1101001011010");
m_Code39.Add("9", "1011001011010");
m_Code39.Add("+", "1001010010010");
m_Code39.Add("-", "1001010110110");
m_Code39.Add("*", "1001011011010");
m_Code39.Add("/", "1001001010010");
m_Code39.Add("%", "1010010010010");
//m_Code39.Add("contentquot", "1001001001010");
m_Code39.Add(".", "1100101011010");
m_Code39.Add(" ", "1001101011010");
}
public enum Code39Model
{
/// <summary>
/// 基本类别 1234567890ABC
/// </summary>
Code39Normal,
/// <summary>
/// 全ASCII方式 +A+B 来表示小写
/// </summary>
Code39FullAscII
}
/// <summary>
/// 获得条码图形
/// </summary>
/// <param name="p_Text">文字信息</param>
/// <param name="p_Model">类别</param>
/// <param name="p_StarChar">是否增加前后*号</param>
/// <returns>图形</returns>
public Bitmap GetCodeImage(string p_Text, Code39Model p_Model, bool p_StarChar)
{
string _ValueText = "";
string _CodeText = "";
char[] _ValueChar = null;
switch (p_Model)
{
case Code39Model.Code39Normal:
_ValueText = p_Text.ToUpper();
break;
default:
_ValueChar = p_Text.ToCharArray();
for (int i = 0; i != _ValueChar.Length; i++)
{
if ((int)_ValueChar[i] >= 97 && (int)_ValueChar[i] <= 122)
{
_ValueText += "+" + _ValueChar[i].ToString().ToUpper();
}
else
{
_ValueText += _ValueChar[i].ToString();
}
}
break;
}
_ValueChar = _ValueText.ToCharArray();
if (p_StarChar == true) _CodeText += m_Code39["*"];
for (int i = 0; i != _ValueChar.Length; i++)
{
if (p_StarChar == true && _ValueChar[i] == '*') throw new Exception("带有起始符号不能出现*");
object _CharCode = m_Code39[_ValueChar[i].ToString()];
if (_CharCode == null) throw new Exception("不可用的字符" + _ValueChar[i].ToString());
_CodeText += _CharCode.ToString();
}
if (p_StarChar == true) _CodeText += m_Code39["*"];
Bitmap _CodeBmp = GetImage(_CodeText);
GetViewImage(_CodeBmp, p_Text);
return _CodeBmp;
}
/// <summary>
/// 绘制编码图形
/// </summary>
/// <param name="p_Text">编码</param>
/// <returns>图形</returns>
private Bitmap GetImage(string p_Text)
{
char[] _Value = p_Text.ToCharArray();
//宽 == 需要绘制的数量*放大倍数 + 两个字的宽
Bitmap _CodeImage = new Bitmap(_Value.Length * ((int)m_Magnify + 1), (int)m_Height);
Graphics _Garphics = Graphics.FromImage(_CodeImage);
_Garphics.FillRectangle(Brushes.White, new Rectangle(0, 0, _CodeImage.Width, _CodeImage.Height));
int _LenEx = 0;
for (int i = 0; i != _Value.Length; i++)
{
int _DrawWidth = m_Magnify + 1;
if (_Value[i] == '1')
{
_Garphics.FillRectangle(Brushes.Black, new Rectangle(_LenEx, 0, _DrawWidth, m_Height));
}
else
{
_Garphics.FillRectangle(Brushes.White, new Rectangle(_LenEx, 0, _DrawWidth, m_Height));
}
_LenEx += _DrawWidth;
}
_Garphics.Dispose();
return _CodeImage;
}
/// <summary>
/// 绘制文字
/// </summary>
/// <param name="p_CodeImage">图形</param>
/// <param name="p_Text">文字</param>
private void GetViewImage(Bitmap p_CodeImage, string p_Text)
{
if (m_ViewFont == null) return;
Graphics _Graphics = Graphics.FromImage(p_CodeImage);
SizeF _FontSize = _Graphics.MeasureString(p_Text, m_ViewFont);
if (_FontSize.Width > p_CodeImage.Width || _FontSize.Height > p_CodeImage.Height - 20)
{
_Graphics.Dispose();
return;
}
int _StarHeight = p_CodeImage.Height - (int)_FontSize.Height;
_Graphics.FillRectangle(Brushes.White, new Rectangle(0, _StarHeight, p_CodeImage.Width, (int)_FontSize.Height));
int _StarWidth = (p_CodeImage.Width - (int)_FontSize.Width) / 2;
_Graphics.DrawString(p_Text, m_ViewFont, Brushes.Black, _StarWidth, _StarHeight);
_Graphics.Dispose();
}
}
调用时候和验证码调用类似,用一个图片控件接收,后台代码
imgCode.ImageUrl = "getCode.ashx?m=0&h=60&vCode=" + encode;
三:生成二维码
用到一个类库ThoughtWorks.QRCode.dll
网上下载一个引用进去就可以了
using ThoughtWorks.QRCode.Codec;
using ThoughtWorks.QRCode.Codec.Data;
using ThoughtWorks.QRCode.Codec.Util;
1,普通不带图片的二维码
一般处理程序代码
<%@ WebHandler Language="C#" Class="getQRCode1" %>
using System;
using System.Web;
using ThoughtWorks.QRCode.Codec;
using ThoughtWorks.QRCode.Codec.Data;
using ThoughtWorks.QRCode.Codec.Util;
using System.IO;
using System.Text;
using System.Drawing;
public class getQRCode1 : IHttpHandler {
public void ProcessRequest (HttpContext context) {
String data = context.Request["CodeText"];
String size = context.Request["s"];
if (!string.IsNullOrEmpty(data))
{
size = !string.IsNullOrEmpty(data) ? size : "4";
System.Drawing.Image image = GetCodeImage(data, int.Parse(size));
System.IO.MemoryStream MStream = new System.IO.MemoryStream();
image.Save(MStream, System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ClearContent();
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(MStream.ToArray());
MStream.Dispose();
}
context.Response.Flush();
context.Response.End();
}
public Image GetCodeImage(string code, int size)
{
//创建二维码生成类
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
//设置编码模式
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
//设置编码测量度
qrCodeEncoder.QRCodeScale = (size>0&&size<40)?size:4;
//设置编码版本
qrCodeEncoder.QRCodeVersion = 8;
//设置编码错误纠正
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
//生成二维码图片
System.Drawing.Image image = qrCodeEncoder.Encode(code, Encoding.UTF8);
return image;
}
public bool IsReusable
{
get
{
return false;
}
}
}
页面调用
前台
</div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1"
runat="server" Text="Button" οnclick="Button1_Click" />
</div>
<div>
<asp:Image ID="imgCheck" runat="server" /><br />
</div>
后台
protected void Button1_Click(object sender, EventArgs e)
{
imgCheck.ImageUrl = "getQRCode1.ashx?s=4&CodeText=" + TextBox1.Text.Trim();
}
2,带图片的二维码
一般处理程序
<%@ WebHandler Language="C#" Class="getQRCode" %>
using System;
using System.Web;
using ThoughtWorks.QRCode.Codec;
using ThoughtWorks.QRCode.Codec.Data;
using ThoughtWorks.QRCode.Codec.Util;
using System.IO;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
public class getQRCode : IHttpHandler {
public void ProcessRequest(HttpContext context)
{
String data = context.Request["CodeText"];
if (!string.IsNullOrEmpty(data))
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
qrCodeEncoder.QRCodeScale = 4;
qrCodeEncoder.QRCodeVersion = 8;
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
//data = Server.UrlEncode(data);
System.Drawing.Image image = qrCodeEncoder.Encode(data, Encoding.UTF8);
System.IO.MemoryStream MStream = new System.IO.MemoryStream();
image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png);
System.IO.MemoryStream MStream1 = new System.IO.MemoryStream();
CombinImage(image, context.Server.MapPath("../images/logo.jpg")).Save(MStream1, System.Drawing.Imaging.ImageFormat.Png);
context.Response.ClearContent();
context.Response.ContentType = "image/png";
context.Response.BinaryWrite(MStream1.ToArray());
//image.Dispose();
MStream.Dispose();
MStream1.Dispose();
}
context.Response.Flush();
context.Response.End();
}
/// <summary>
/// 调用此函数后使此两种图片合并,类似相册,有个
/// 背景图,中间贴自己的目标图片
/// </summary>
/// <param name="imgBack">粘贴的源图片</param>
/// <param name="destImg">粘贴的目标图片</param>
public static Image CombinImage(Image imgBack, string destImg)
{
Image img = Image.FromFile(destImg); //照片图片
if (img.Height != 65 || img.Width != 65)
{
img = KiResizeImage(img, 65, 65, 0);
}
Graphics g = Graphics.FromImage(imgBack);
g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height); //g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);
//g.FillRectangle(System.Drawing.Brushes.White, imgBack.Width / 2 - img.Width / 2 - 1, imgBack.Width / 2 - img.Width / 2 - 1,1,1);//相片四周刷一层黑色边框
//g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);
g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Width / 2 - img.Width / 2, img.Width, img.Height);
GC.Collect();
return imgBack;
}
/// <summary>
/// Resize图片
/// </summary>
/// <param name="bmp">原始Bitmap</param>
/// <param name="newW">新的宽度</param>
/// <param name="newH">新的高度</param>
/// <param name="Mode">保留着,暂时未用</param>
/// <returns>处理以后的图片</returns>
public static Image KiResizeImage(Image bmp, int newW, int newH, int Mode)
{
try
{
Image b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值算法的质量
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();
return b;
}
catch
{
return null;
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
页面调用
前台
</div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1"
runat="server" Text="Button" οnclick="Button1_Click" />
</div>
<div>
<asp:Image ID="imgCheck" runat="server" /><br />
</div>
后台
protected void Button1_Click(object sender, EventArgs e)
{
imgCheck.ImageUrl = "getQRCode.ashx?CodeText=" + TextBox1.Text.Trim();
}