ホームページ >バックエンド開発 >Python チュートリアル >Pythonを使って検証コードをクラックする方法を詳しく解説 サンプルコード

Pythonを使って検証コードをクラックする方法を詳しく解説 サンプルコード

高洛峰
高洛峰オリジナル
2017-03-23 16:45:491659ブラウズ

1. はじめに
この実験では、簡単な例を通して 検証コード をクラッキングする原理を説明します。実践による次の知識ポイント: 下Python
基礎知識 Plasma PIL モジュール
2、例の説明

Pillow (Pil) ライブラリ: R

$ 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
e これは、実験で使用した検証コードcaptcha.gif



テキストを抽出Pythonを使って検証コードをクラックする方法を詳しく解説 サンプルコード画像
作業ディレクトリに新しいcrack.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]
Colorの各数値ヒストグラムは、画像内の対応する色を含むピクセルの数を表します。各ピクセルは 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


得られた結果:


単一の文字画像を抽出します


以下のジョブは、単一の文字のピクセル コレクションを取得することです。この例は比較的単純なので、垂直方向に切り取ります。

#-*- 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()
Pythonを使って検証コードをクラックする方法を詳しく解説 サンプルコード
各文字の開始列番号と終了列番号を取得します。 (上記の続き。コード)画像を切り取って、各文字が配置されている画像の部分を取得します
AIとベクトル空間画像認識


ここでは、文字認識に多くの機能を持つベクトル空間検索エンジンを使用します。利点:

大量のトレーニング反復が不要

オーバートレーニングがない
いつでも誤ったデータを追加/削除して効果を確認できる

理解しやすく、コーディングが簡単

階層的な結果が提供され、最も近い複数の一致を表示できる
用途認識できないもの 検索エンジンに追加するだけで、すぐに特定できるようになります
もちろん、分類速度がニューラルネットワークよりもはるかに遅い、問題を独自に解決する方法を見つけることができないなどの欠点もあります。
ベクトル空間検索エンジンの名前はとても高尚に聞こえますが、原理は実際には非常に単純です。 2 つのドキュメントで使用されている単語が多ければ多いほど、それらは類似しています。しかし、キーワードが多すぎる場合はどうなるでしょうか? 選択した単語はそれぞれの特徴とも呼ばれます。は空間内の次元 (x、y、z など) のようなもので、ベクトル間の角度を計算する限り、そのようなベクトルを取得できます。記事の類似性。 Python クラスを使用してベクトル空間を実装します:

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


2 つの Python 辞書タイプを比較し、その類似度 (0 から 1 までの数値で表されます) を出力します

前の内容をまとめます

大きな数値も取得しますコードは単一の文字画像をトレーニング セットとして抽出しますが、学生は上記をよく読んでいる限り、この作業の実行方法を確実に知っているため、ここでは省略します。提供されたトレーニング セットを直接使用して、次の操作を実行できます。
iconset ディレクトリにはトレーニング セットが含まれています。
最後に追加されたコンテンツ:
[(6, 14), (15, 25), (27, 35), (37, 46), (48, 56), (57, 67)]


結果を取得しますすべての準備が整ったので、コードを実行してみましょう:

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


出力
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))
は正解です。よくできました。

概要
上記がこの記事の全内容です。この記事の内容が皆さんの学習や仕事に少しでも役立つことを願っています。ご質問がある場合は、メッセージを残して連絡してください。



以上がPythonを使って検証コードをクラックする方法を詳しく解説 サンプルコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。