简单验证码的c#

第一次在CSDN写博客,还希望能有前辈多多指教,谢谢;
在登陆网页或者APP时,经常会遇到一些验证码要求输入,一般是数字和字母的组合或者一组汉字,本文简单介绍如何用c#来实现。
首先介绍一种生成数字和字母组合的方法:
自定义方法creatnum生成一个长度为count的字符串,为了避免生成重复的随机数,通过变量来记录随机数结果,如果出现与上次重复的数值则调用函数本身,以保证生成不同的随机数,代码如下:

private string createrandnum(int num)
         {
             string allchar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
             string[] allcharary = allchar.Split(',');
             string randnum = "";
             //  int temp = -1;
             Random rand = new Random();
             for (int i = 0; i < num; i++)
             {
                if (temp != -1)
                    {
                        rand = new Random(i*temp*((int)DateTime.Now.Ticks))}
                    int t = rand.Next(35);
                    if (temp == t)
                    {
                        return createrandnum(num);
                    }
        int t = rand.Next(35);
        // temp = t;
        randnum += allcharary[t];
    }
    return randnum;
}

上面的方法中我们把所要添加的元素先定义为字符串,再拆分成数组,似乎过程有些麻烦,那么如何更简单的添加元素呢?数字元素的添加可以直接使用一个for循环添加即可,字母的添加可以通过转换字母所对应的ASCII码来实现,那么代码如下:

  public string creatnum(int numc)
        {
            string str = "";
            int temp = -1;
            Random ra = new Random();
            var arr = new List<string> { };
            for (int i = 0; i < 9; i++)
            {
                arr.Add(i.ToString());
            }
            for (int i = 65; i < 91; i++)
            {
                arr.Add(Encoding.GetEncoding("ASCII").GetString(new byte[] { (byte)i }));
            }
            for (int i = 0; i < numc; i++)
            {
                var r = ra.Next(35);
                str += arr[r];
               
            }
            return str;
        }```
其中使用GetString方法将指定数组解码为字符串得到ASCII码对应的字母元素。
下面介绍如何制作中文验证码的方法:
生成中文验证码的思路是首先要获取随机生成的汉字的区位码,然后根据区位码来获取对应的汉字,这里还是用到了E你coding的GetString方法,语法如下:

```csharp
public virtual string GetString(bytr[]bytrs)

具体实现代码如下:

private void CreateImage()
{
   Encoding gb = Encoding.GetEncoding("gb2312");                             //获取GB2312编码页(表)
   object[] bytes = CreateCode(4);                                               //调用函数产生4个随机中文汉字编码
   //根据汉字编码的字节数组解码出中文汉字 
   string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
   string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
   string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
   string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
   txt = str1 + str2 + str3 + str4;                                                         //获取随机生成的四个汉字
  }
  

生成了数字字母组合或者是汉字的验证码字符串之后,下面将其生成图形验证码,并为了进一步确保安全性,增加一些噪声干扰,代码如下:

private void creatimage(string varnum)
{
    if (varnum == null || varnum.Trim() == string.Empty)
        return;
   System.Drawing.Bitmap image = new System.Drawing.Bitmap(varnum.Length * 12 + 10, 22);//生成画布
    Graphics g = Graphics.FromImage(image);
    try
    {
        Random ra=new Random();
        g.Clear(Color.White);
        for(int i=0;i<25;i++)//绘制背景噪音线
        {
            int x1=ra.Next(image.Width);
             int x2=ra.Next(image.Width);
             int y1=ra.Next(image.Height);
             int y2=ra.Next(image.Height);
            g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);
        }
        Font font=new System.Drawing.Font("Arial",12,(System.Drawing.FontStyle.Bold|System.Drawing.FontStyle.Italic));
        System.Drawing.Drawing2D.LinearGradientBrush brush=new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height),Color.Blue,Color.DarkRed,1.2f,true);
        g.DrawString(varnum,font,brush,2,2);
        //绘制前景噪声点
        for (int i = 0; i < 100; i++)
        {
            int x = ra.Next(image.Width);
            int y = ra.Next(image.Height);
            image.SetPixel(x, y, Color.FromArgb(ra.Next()));
        }
        //绘制边框线
        g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
        finally
    {
        g.Dispose();
        image.Dispose();
    }
}

最后将生成的图片绑定到picturebox控件或者网页显示:
代码分别如下:

pictureBox1.Image=image;//绑定到控件
System.IO.MemoryStream ms=new System.IO.MemoryStream()
image.Save(ms,System.Drawing.Imaging.ImageFormat.jpeg);//将图像保存至数据流
Response.ClearContent();
Response.ContentType="image/jpeg";
Response.BinaryWrite(ms.ToString());
``


猜你喜欢

转载自blog.csdn.net/weixin_42672765/article/details/82846300