




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<%'-'圖片驗證碼'netdust'05-8-29 發(fā)布'以前的圖片驗證碼很容易被破解,所以在其基礎上進行改進,即使知道源代碼'也很難破解。'干擾次數每加一 -> 窮舉法的代價提高約100*100倍'適當設定雜點幾率可以有效降低軟件識別正確率'05-12-20 修正了一個錯誤'- Option Explicit Call Com_CreatValidCode("GetCode") Rem 生成驗
2、證碼圖片Sub Com_CreatValidCode(pSN)Const codeLen = 4 '驗證碼位數Const cOdds = 3 '雜點出現(xiàn)的機率Const dbtTimes = 1 '干擾次數(安全考慮,最好不要小于3) Const cAmount = 10 '字庫數量Const cCode = "0123456789" '字庫對應的字符Const UnitWidth = 16 '字寬(要為4的倍數)Const UnitHeight = 13 '字高Const DotsLimit = 5
3、9;每次刪除有效點的上限(避免無法人為識別)Const tryCount = 5 '避免刪除有效點超過上限的嘗試次數限制 '- RandomizeDim i, ii, iii ' 禁止緩存Response.Expires = -9999Response.AddHeader "Pragma","no-cache"Response.AddHeader "cache-ctrol","no-cache"Response.ContentType = "Image
4、/BMP" ' 顏色的數?字符,背景)Dim vColorData(1)vColorData(0) = ChrB(0) & ChrB(0) & ChrB(0) ' 藍0,綠0,紅0(黑色)vColorData(1) = ChrB(255) & ChrB(255) & ChrB(255) ' 藍250,綠236,紅211(淺藍色) ' 字符的數據(可以自己修改,如果修改了尺寸,記得把前面的設定也改了)Dim vNumberData(9)vNumberData(0) =
5、"1111000000001111111000000000011111100111111001111110011111100111111001111110011111100111111001111110011111100111111001111110011111100111111001111110011111100111111001111110011111100000000001111111000000001111"vNumberData(1) = "111111000111111111110000011111111110000001111111110011000
6、1111111111111000111111111111100011111111111110001111111111111000111111111111100011111111111110001111111111111000111111111100000000011111110000000001111"vNumberData(2) = "111111000001111111111000000011111111000111001111111000111100111111111111100111111111111100111111111111100111111111111100
7、1111111111111001111111111111001111001111111001111100111111100000000011111110000000001111"vNumberData(3) = "111110000001111111110000000011111110011111100111111001111100111111111111100111111111111000111111111111100011111111111111100111111111111111001111111001111110011111100111111001111111000
8、0000011111111100000011111"vNumberData(4) = "1111111100111111111110110011111111110011001111111111001100111111111001110011111111001111001111111000000000000011100000000000001111111111001111111111111100111111111111110011111111111111001111111111111100111111"vNumberData(5) = "111000000
9、0000111110011111111111111001111111111111100111111111111110011111111111111001100000011111100000111100111111111111110011111111111111001111111111111100111110011111110011111001111111001111110000000001111"vNumberData(6) = "111111000001111111111000000011111111001111100111111001111111111111100111
10、1111111111100100000111111110000000001111111000111110011111100111111001111110011111100111111001111110011111110000000011111111100000011111"vNumberData(7) = "111000000000011111100000000001111110011111100111111001111110011111111111110011111111111111001111111111111001111111111111001111111111111
11、1001111111111111100111111111111110011111111111111001111111111111100111111"vNumberData(8) = "111110000001111111110000000011111110011111100111111001111110011111100111111001111111000000001111111100000000111111110011110011111110011111100111111001111110011111100111111001111111000000001111111110
12、0000011111"vNumberData(9) = "1111100000011111111100000000111111100111111001111110011111100111111001111110011111110000000001111111000000100111111111111110011111111111111001111111111111100111111001111100111111110000000011111111100000011111" ' 隨機產生字符Dim vCodesReDim vCode(codeLen
13、-1)For i = 0 To codeLen-1 vCode(i) = Int(Rnd * cAmount) vCodes = vCodes & Mid(cCode, vCode(i) + 1, 1) vCode(i) = pcd_doubter(vNumberData(vCode(i),UnitWidth,UnitHeight,DotsLimit,tryCount,dbtTimes)Next Session(pSN) = vCodes '記錄入Session
14、' 輸出圖像文件頭Response.BinaryWrite ChrB(66) & ChrB(77) & Num2ChrB(54+UnitWidth*UnitHeight*CodeLen*3,4) & ChrB(0) & ChrB(0) &_ ChrB(0) & ChrB(0) & ChrB(54) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(40) & ChrB(0) &_ ChrB(0) & Ch
15、rB(0) & Num2ChrB(UnitWidth*CodeLen,4) & Num2ChrB(UnitHeight,4) &_ ChrB(1) & ChrB(0) ' 輸出圖像信息頭Response.BinaryWrite ChrB(24) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & Num2ChrB(UnitWidth*UnitHeight*CodeLen*3,4) &_ Ch
16、rB(18) & ChrB(11) & ChrB(0) & ChrB(0) & ChrB(18) & ChrB(11) &_ ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) &_ ChrB(0) & ChrB(0) For i = UnitHeight-1 To 0 Step -1
17、9; 歷經所有行 For ii = 0 To codeLen-1 ' 歷經所有字 For iii = 1 To UnitWidth ' 歷經所有像素 If Rnd * 99 + 1 >= cOdds Then ' 逐行、逐字、逐像素地輸出圖像數據 Response.BinaryWrite vColorData(Mid(vCo
18、de(ii), i * UnitWidth + iii, 1) Else ' 隨機生成雜點 Response.BinaryWrite vColorData(1-CInt(Mid(vCode(ii), i * UnitWidth + iii, 1) End If Next NextNextEnd Sub Rem 對單個字
19、的點陣進行干擾Rem 干擾思想:在點陣范圍內隨機產生2個端點,進行連線,以位移較大的一方做橫軸,先將連線上的點刪除,再將被刪除點的縱軸方向上方或下方的點(隨機確定)移向被刪除點,移動后的空白用背景色補充Function pcd_doubter(ByVal str,UnitWidth,UnitHeight,DotsLimit,tryCount,dbtTimes)RandomizeDim x1,x2,y1,y2,xOffSet,yOffSet,direction,flag,rows,step,yu,yuStr,i,ii,iii,f1,f2For f1=1 To dbtTimes '干擾次數
20、For f2=1 To tryCount '避免刪除有效點超過上限的嘗試次數限制'隨機確定2個端點x1 = int(Rnd*UnitWidth)x2 = int(Rnd*UnitWidth)y1 = int(Rnd*UnitHeight)y2 = int(Rnd*UnitHeight)'x,y位移量xOffSet = Abs(x2-x1)yOffSet = Abs(y2-y1)If xOffSet >= yOffSet Then '以位移量較大方做橫軸direction = "x"ReDim ary(xOffSet) '用來記錄
21、連線各點y值'x2,y2存儲x值較大的點If x2 < x1 Theni = x1x1 = x2x2 = ii = y1y1 = y2y2 = iEnd If'判斷從x1->x2在縱軸方向上是增是減If y2 >= y1 Thenflag = 1Elseflag = -1End If'下面計算連線上點的分布(先是平均分配各行的點,然后隨機分配剩余的點到各行)rows = yOffSet + 1 '所占行數step = (xOffSet+1) rows '各行平均分配的點yu = (xOffSet+1) Mod rows '剩余的
22、點數ReDim ary2(rows-1) '用來記錄剩余點的隨機分配While yu > 0i = int(Rnd*rows)ary2(i) = ary2(i)&"." '被分配到的行則加一個字符"."yu = yu - 1WEndiii = 0'將連線的點信息記錄到數組For i=0 To rows-1For ii=1 To step+Len(ary2(i)ary(iii) = y1 + i*flagiii = iii + 1NextNextii = 0'統(tǒng)計連線上有效點的數量For i=0 To xOff
23、SetIf pcd_getDot(x1+i,ary(i),str,UnitWidth) = "0" Then ii = ii + 1NextElse'這里是以y為橫軸,原理與x時相同direction = "y"ReDim ary(yOffSet)If y2 < y1 Theni = x1x1 = x2x2 = ii = y1y1 = y2y2 = iEnd IfIf x2 >= x1 Thenflag = 1Elseflag = -1End Ifrows = xOffSet + 1step = (yOffSet+1) rowsyu
24、= (yOffSet+1) Mod rowsReDim ary2(rows-1)While yu > 0i = int(Rnd*10)If i < rows Thenary2(i) = ary2(i)&"."yu = yu - 1End IfWEndiii = 0For i=0 To rows-1For ii=1 To step+Len(ary2(i)ary(iii) = x1 + i*flagiii = iii + 1NextNextii = 0For i=0 To yOffSetIf pcd_getDot(ary(i),y1+i,str,UnitWi
25、dth) = "0" Then ii = ii + 1NextEnd If'如未超過有效點上限則跳出循環(huán),執(zhí)行干擾If ii <= DotsLimit Then Exit ForNext If direction = "x" Then'隨機確定在縱軸方向上或下進行移動If int(Rnd*10) > 4 Then'變量連線上的點For i=0 To xOffSet'遍歷移動For ii=ary(i) To 1 Step -1Call pcd_setDot(x1+i,ii,str,pcd_getDot(
26、x1+i,ii-1,str,UnitWidth),UnitWidth)Next'添補空白Call pcd_setDot(x1+i,0,str,"1",UnitWidth)NextElseFor i=0 To xOffSetFor ii=ary(i) To UnitHeight-2Call pcd_setDot(x1+i,ii,str,pcd_getDot(x1+i,ii+1,str,UnitWidth),UnitWidth)NextCall pcd_setDot(x1+i,UnitHeight-1,str,"1",UnitWidth)NextEn
27、d IfElseIf int(Rnd*10) > 4 ThenFor i=0 To yOffSetFor ii=ary(i) To 1 Step -1Call pcd_setDot(ii,y1+i,str,pcd_getDot(ii-1,y1+i,str,UnitWidth),UnitWidth)NextCall pcd_setDot(0,y1+i,str,"1",UnitWidth)NextElseFor i=0 To yOffSetFor ii=ary(i) To UnitWidth-2Call pcd_setDot(ii,y1+i,str,pcd_getDot(
28、ii+1,y1+i,str,UnitWidth),UnitWidth)NextCall pcd_setDot(UnitWidth-1,y1+i,str,"1",UnitWidth)NextEnd IfEnd IfNextpcd_doubter = strEnd Function Rem 得到某點的字符Function pcd_getDot(x,y,str,UnitWidth)pcd_getDot = Mid(str,x+1+y*UnitWidth,1)End Function Rem 設置某點的字符Sub pcd_setDot(x,y,ByRef str,newDot,UnitWidth)str = Left(str,x+y*UnitWidth) & newDot & Right(str,Len(str)-x-y*UnitWidth-1)End Sub Rem 將數字轉為bmp需要的格式 lens是目標字節(jié)長度Function Num2ChrB(num,lens)Dim ret,iret = ""While (num>0)ret = ret & ChrB(num mod 256)num = num 256WEndFor i=Lenb(ret) To
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 下學期幼兒園小班美術教學計劃
- 出租水產攤位合同范本
- 書法班退費合同范本
- 廠房買斷合同范本
- 一冊拼音及一二三單元教案十五
- 農戶院落租賃合同范本
- 兒童玩偶租賃合同范本
- 醫(yī)療設備進貨合同范本
- 午托廚房合同范本
- 《荷花》教學反思三年級語文教學反思
- 2025年黑龍江生態(tài)工程職業(yè)學院單招職業(yè)傾向性測試題庫及答案一套
- 做最勇敢的自己
- 小學數學中巧用信息技術創(chuàng)造情境教學
- 安徽省歷年中考語文現(xiàn)代文閱讀之非連續(xù)性文本閱讀6篇(截至2024年)
- GB/T 23694-2024風險管理術語
- 公司員工生日會活動復盤
- 2024糖尿病酮癥酸中毒診斷和治療課件
- 貿易公司程序文件
- 計算書平原微丘區(qū)二級公路設計
- 常用洪水預報模型介紹
- 援外項目鋼結構運輸包裝作業(yè)指導書(共13頁)
評論
0/150
提交評論