文档介绍:网络投票系统验证码识别技术原理
来源:八方刷票公司
以如下网络投票系统验证码为例对验证码识别技术原理做一个简单的分析:
原理
对于简单的验证码,使用的原理也相当的简单。
现在有两个长度一致的二进制的数字,11**********和10**********,比较他们的相似度可以使用XOR运算!
11********** XOR 10********** = 0100000000001
结果中,1的数目越小,相似度越高。现在比较两张单色的图片,也可以使用这样的方法。这两张图必须是规格相同的,
把两张单色的图片进行Xor,结果残留下来的白点越小,表示相似度越高!!!
view plaincopy to clipboardprint?
for y in range(h):
for x in range(w):
((x,y), ((x,y)) ^ ((x,y)))
()
for y in range(h):
for x in range(w):
((x,y), ((x,y)) ^ ((x,y)))
()
上面两个1的进行XOR运算,得到了不同像素点的个数。如上图所示,一共有3个。
同时,我们把右图的1跟其他字符或数字的模板进行比较,看看相差多大。
XOR统计结果比较字模
3 1
12 I
15 T
25 Y
30 2
34 Z
37 0
38 L
38 X
39 E
40 3
40 7
40 C
40 J
41 S
42 F
43 4
43 G
43 V
44 9
44 A
44 K
45 5
47 6
47 8
47 O
47 P
48 Q
51 M
52 N
54 D
54 R
55 B
55 U
56 W
60 H
相差最大的是H,比较相似的是I,的确1和I是有点类似的,但是差距还是比较明显的。所以识别率会很高!
准备
1.
2. 接入互联网
获取样本
从网站上得到获取的验证码地址为
http://xxx /2010/vote/
图片浏览器设置一下不要平滑图片,放大图片之后,就可以看到小小的验证码图片是由一大堆像素点拼凑而成的。
获取样本无非是为了找规律,样本越多对我们分析越好。
因为这个验证码的规律很明显,我们暂且就获取50张吧,当然不是自己一个一个去下载,写个简单的脚本来处理!
view plaincopy to clipboardprint?
import urllib, random
for i in range(50):
url = 'http://xxx /2010/vote/'
print "download", i
file("./code/%" % (10000), "wb").write(
(url).read())i
import