>백엔드 개발 >파이썬 튜토리얼 >Python을 사용하여 검증 코드 예제 코드를 크랙하는 방법에 대한 자세한 설명

Python을 사용하여 검증 코드 예제 코드를 크랙하는 방법에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-03-23 16:45:491652검색

1. 서문
이번 실험에서는 간단한 예를 통해 크래킹을 설명합니다인증코드의 원리, 다음 지식 포인트를 배우고 실습하게 됩니다.
Python기본 지식
PIL 모듈 사용
2. 자세한 설명 예제
베개(PIL) 라이브러리 설치:

$ sudo apt-get update
$ sudo apt-get install python-dev
$ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev \
libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
$ sudo pip install pillow


실험용 파일 다운로드:

$ wget http://labfile.oss.aliyuncs.com/courses/364/python_captcha.zip $ unzip python_captcha.zip
$ cd python_captcha


실험에 사용한 인증코드 captcha.gif입니다
Python을 사용하여 검증 코드 예제 코드를 크랙하는 방법에 대한 자세한 설명
텍스트 추출사진
작업 디렉터리 .py 파일에 새 크랙을 만들고 편집하세요.

#-*- coding:utf8 -*-
from PIL import Image
im = Image.open("captcha.gif")
#(将图片转换为8位像素模式)
im = im.convert("P")
#打印颜色直方图
print im.histogram()


출력:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0 , 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 0, 1, 0, 0, 1, 0, 2, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 3, 1, 3, 3, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 132, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 15, 0 , 1, 0, 1, 0, 0, 8, 1, 0, 0, 0, 0, 1, 6, 0, 2, 0, 0, 0, 0, 18, 1, 1, 1, 1, 1, 2, 365, 115, 0, 1, 0, 0, 0, 135, 186, 0, 0, 1, 0, 0, 0, 116, 3, 0, 0, 0, 0, 0, 21, 1, 1, 0, 0, 0, 2, 10, 2, 0, 0, 0, 0, 2, 10, 0, 0, 0, 0, 1, 0, 625]


색상 히스토그램의 각 숫자는 다음을 나타냅니다. 이미지에 포함된 값입니다.
각 픽셀은 256가지 색상을 나타낼 수 있습니다. 흰색 점이 가장 많은 것을 알 수 있습니다(흰색 숫자 255의 위치). 마지막 자리에는 625개의 흰색 점이 있음을 알 수 있습니다. 빨간색 픽셀은 약 200입니다.

his = im.histogram()
values = {}
for i in range(256):
 values[i] = his[i]
for j,k in sorted(values.items(),key=lambda x:x[1],reverse = True)[:10]:
 print j,k


정렬하면 유용한 색상을 얻을 수 있습니다. 색상 중 220과 227이 우리에게 필요한 빨간색과 회색이며, 이 정보를 사용하여 흑백 이진 이미지

255 625
212 365
220 186
219 135
169 132
227 116
213 115
234 21
205 18
184 15


결과는 다음과 같습니다.

<.>
단일 문자 이미지 추출
Python을 사용하여 검증 코드 예제 코드를 크랙하는 방법에 대한 자세한 설명다음 단계는 단일 문자의 픽셀 컬렉션을 가져오는 것입니다. 예제는 비교적 간단하므로 세로로 자릅니다.

#-*- coding:utf8 -*-
from PIL import Image
im = Image.open("captcha.gif")
im = im.convert("P")
im2 = Image.new("P",im.size,255)
for x in range(im.size[1]):
 for y in range(im.size[0]):
  pix = im.getpixel((y,x))
  if pix == 220 or pix == 227: # these are the numbers to get
   im2.putpixel((y,x),0)
im2.show()
출력:
inletter = False
foundletter=False
start = 0
end = 0
letters = []
for y in range(im2.size[0]): 
 for x in range(im2.size[1]):
  pix = im2.getpixel((y,x))
  if pix != 255:
   inletter = True
 if foundletter == False and inletter == True:
  foundletter = True
  start = y
 if foundletter == True and inletter == False:
  foundletter = False
  end = y
  letters.append((start,end))
 inletter=False
print letters

각 문자의 시작 및 끝 열 번호를 가져옵니다.

[(6, 14), (15, 25), (27, 35), (37, 46), (48, 56), (57, 67)]

(위 코드 계속)
각 문자를 가져오려면 이미지를 잘라냅니다. 문자.

AI 및 벡터 공간 이미지 인식

여기서는 문자 인식을 위해 벡터 공간 검색 엔진을 사용하는데, 이는 많은 장점이 있습니다.
많은 학습 반복이 필요하지 않음 오버 트레이닝 없음 잘못된 데이터를 추가/제거하여 언제든지 효과 확인 가능
이해하기 쉽고 코딩하기 쉬움
계층적 결과 제공, 가장 가까운 다중 일치
인식할 수 없는 것들은 검색 엔진에 추가하기만 하면 바로 인식됩니다.
물론 신경망에 비해 분류 속도가 훨씬 느린 단점도 있습니다. , 문제 해결 방법 등을 스스로 찾을 수 없습니다.
벡터 공간 검색 엔진의 이름은 매우 화려해 보이지만 그 원리는 매우 간단합니다. 기사의 예를 들어보세요.
3개의 문서가 있는데, 이들 간의 유사성을 어떻게 계산합니까? 두 문서에서 공통적으로 사용하는 단어가 많을수록 유사성이 높아집니다! 하지만 단어가 너무 많으면 몇 가지 핵심 단어를 선택하는 것이 중요합니다. 선택한 단어를 특성이라고도 합니다. 각 특성은 공간(x, y, z 등)의 차원과 같습니다. 특징 세트는 벡터이므로 모든 문서에 대해 이러한 벡터를 얻을 수 있습니다. 벡터 사이의 각도를 계산하면 기사의 유사성을 얻을 수 있습니다.
Python 클래스를 사용하여 벡터 공간 구현:

import hashlib
import time
count = 0
for letter in letters:
 m = hashlib.md5()
 im3 = im2.crop(( letter[0] , 0, letter[1],im2.size[1] ))
 m.update("%s%s"%(time.time(),count))
 im3.save("./%s.gif"%(m.hexdigest()))
 count += 1


두 Python 사전 유형을 비교하고 유사성(0에서 1까지의 숫자로 표시)을 출력합니다.
이전 내용을 함께


단일 문자 이미지를 훈련 세트로 추출하기 위해 다수의 인증 코드를 추출하는 작업도 있지만, 위의 내용을 주의 깊게 읽어본 학생들이라면 이러한 작업을 수행하는 방법을 알 수 있을 것입니다. , 여기서는 생략했습니다. 제공된 훈련 세트를 직접 사용하여 다음 작업을 수행할 수 있습니다.
iconset 디렉토리에는 훈련 세트가 포함되어 있습니다. 마지막으로 추가된 콘텐츠:

import math
class VectorCompare:
 #计算矢量大小
 def magnitude(self,concordance):
  total = 0
  for word,count in concordance.iteritems():
   total += count ** 2
  return math.sqrt(total)
 #计算矢量之间的 cos 值
 def relation(self,concordance1, concordance2):
  relevance = 0
  topvalue = 0
  for word, count in concordance1.iteritems():
   if concordance2.has_key(word):
    topvalue += count * concordance2[word]
  return topvalue / (self.magnitude(concordance1) * self.magnitude(concordance2))


결과 가져오기
모든 것이 준비되었습니다. 코드를 실행해 보세요.
#将图片转换为矢量
def buildvector(im):
 d1 = {}
 count = 0
 for i in im.getdata():
  d1[count] = i
  count += 1
 return d1
v = VectorCompare()
iconset = ['0','1','2','3','4','5','6','7','8','9','0','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']
#加载训练集
imageset = []
for letter in iconset:
 for img in os.listdir('./iconset/%s/'%(letter)):
  temp = []
  if img != "Thumbs.db" and img != ".DS_Store":
   temp.append(buildvector(Image.open("./iconset/%s/%s"%(letter,img))))
  imageset.append({letter:temp})
count = 0
#对验证码图片进行切割
for letter in letters:
 m = hashlib.md5()
 im3 = im2.crop(( letter[0] , 0, letter[1],im2.size[1] ))
 guess = []
 #将切割得到的验证码小片段与每个训练片段进行比较
 for image in imageset:
  for x,y in image.iteritems():
   if len(y) != 0:
    guess.append( ( v.relation(y[0],buildvector(im3)),x) )
 guess.sort(reverse=True)
 print "",guess[0]
 count += 1


출력

python crack.py
정답이군요, 수고하셨습니다.


요약

이 글의 내용이 모두의 공부나 업무에 조금이라도 도움이 되었으면 좋겠습니다. 소통하라는 메시지.

위 내용은 Python을 사용하여 검증 코드 예제 코드를 크랙하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.