teratail header banner
teratail header banner
質問するログイン新規登録
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

565閲覧

処理が途中で終わってしまう。

aoihello

総合スコア31

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/26 07:52

編集2022/11/26 08:07

0

0

前提

エラーなしで実行が止まってしまいます。
pythonの勉強を兼ねてプログラムを書いている中で興味があったので、ブルートフォースアッタクについてインターネットで調べながら書いて解読しているので、完璧にコードが理解できている訳ではありません。

実現したいこと

こちらで用意したpdfファイルのパスワードを特定したいです。

発生している問題・エラーメッセージ

エラーが発生していません。

該当のソースコード

Python

1import PyPDF2 2import itertools 3from multiprocessing import Pool 4import datetime 5 6def FileOpen(pw, file_pass): 7 pdf_file = open(file_pass, 'rb') 8 pw = ''.join(pw) 9 try: 10 open(pdf_file, password=pw) 11 print('パスワードは『{}』です'.format(pw)) 12 return True 13 except: 14 pass 15 16 def BruteForceAttack(fill_pass, num_p, alphanumeric, pass_num): 17 p = Pool(num_p) 18 dt_now = datetime.datetime.now() 19 print(dt_now, ",処理開始") 20 for i in pass_num: 21 dt_now = datetime.datetime.now() 22 print(dt_now, ", ", i, "文字開始") 23 24 cnt = 1 25 26 for passlist in itertools.product(alphanumeric, repeat=i): 27 if cnt <= 1: 28 start = datetime.datetime.now() 29 result = p.apply_async(FileOpen, (passlist, file_pass)) 30 result.wait() 31 elif 1 < cnt <= 100: 32 result = p.apply_async(FileOpen, (passlist, file_pass)) 33 result.wait() 34 else: 35 result - p.apply_async(FileOpen, (passlist, file_pass)) 36 37 if cnt == 100: 38 end = datetime.datetime.now() 39 start2end = end - start 40 wait = start2end.total_second() / 100 41 waitspan = 1 42 43 if cnt > 100 and cnt % waitspan == 0: 44 result.wait() 45 46 if result.get() == True: 47 break 48 49 cnt = cnt + 1 50 51 result.wait() 52 dt_now = datetime.datetime.now() 53 print(dt_now, ", ", i, "文字終了") 54 55 if result.get() == True: 56 break 57 58 p.close() 59 p.join() 60 61 dt_now = datetime.datetime.now() 62 print(dt_now, ", 処理終了") 63 64 if __name__ == "__main__": 65 file_pass = "------/2022.pdf" 66 num_p = 2 67 alphanumeric = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 68 pass_num = [1, 2, 3, 4, 5, 6, 7, 8] 69 70 BruteForceAttack(fill_pass, num_p, alphanumeric, pass_num)

試したこと

同じようにブルートフォースアタックについて調べて出てきたプログラムと見比べてみたり他のプログラムを動かしてみたりしたのですが、当プログラムがなぜ途中で止まってしまうのかというのは分かりませんでした。

補足情報(FW/ツールのバージョンなど)

環境はmacです。
少し無理をしてパスワードは6桁にしたのですが、解読できずとも動けるコードが書きたいと思っています。
Pythonに関して全くの初心者なので、ご迷惑をおかけすることが多いかと思います。
上記のプログラムが書かれていたwebsiteです。
https://s6raming.blogspot.com/2021/08/pdf.html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryouuuuoyr

2022/11/26 08:05

Pythonのバージョンはいくつですか?
aoihello

2022/11/26 08:33

確認してみたところ、インストールできているつもりが確認不足でできていませんでした。
ryouuuuoyr

2022/11/26 08:37

インストールできていないとは? エディターとかも教えていただけますか?
aoihello

2022/11/26 08:46

pyenvまではインストールできていたのですがそこから、エラーが出ていて、pythonの環境構築でつまづいていました。 ただいま、インストールを行なっている状況です。
TakaiY

2022/11/26 09:10

質問に表示されているコードのインデントは、手元のコードのインデントと同じでしょうか?
aoihello

2022/11/26 09:12

はい、同じです。
meg_

2022/11/26 10:04

下記ご確認ください。 ・インデントが間違っているようです。 ・「fill_pass」が未定義です。
aoihello

2022/11/26 10:34

ありがとうございます。 インデントについては全くそのような言語とも知らずだったためそこから学び直したいと思います。 first_passについてはPCの情報だったため伏せさせていただきました。
meg_

2022/11/26 10:38 編集

> first_passについてはPCの情報だったため伏せさせていただきました そうではありません。file_passとfill_passの違いのことです。タイプミスでは?との指摘です。
aoihello

2022/11/26 10:42

大変申し訳ありませんでした。 ありがとうございます。 全く気が付きませんでした。タイプミスでした。
TakaiY

2022/11/26 10:42

質問の ・「fill_pass」が未定義です。 で指摘されているのは、 > BruteForceAttack(fill_pass, ... この引数のことです。 多分、file_pass のつづり間違えでしょう。 という指摘ですね。 こういう写し間違えも、動かない原因になるので注意が必要ですね。 ところで、元のコードの file_pass も file_path の間違えでしょうね。
aoihello

2022/11/26 10:48

そのような所でエラーが出ない言語なのですね。使いこなせばすごい言語な分より勉強したいと思います。 ご指摘またご教授いただき誠にありがとうございます。
meg_

2022/11/26 11:06

> そのような所でエラーが出ない言語なのですね。 質問のコードでもインデントを直せば、fill_passのところでちゃんと「NameError」が発生します。今回はそこまでコードが実行されていないということです。TakaiYさんのご指摘通り関数が定義されただけですので。
aoihello

2022/11/26 14:04

大変失礼いたしました。 そういったことだったのですね。 まずインデントを直してからエラーについても学んでいきたいと思います。 ありがとうございます。
guest

回答1

0

ベストアンサー

python はインデントでプログラムの構造を定義している言語です。なので、インデントが異なるとプログラムの意味が変ってしまうので動きません。
質問のコードの通りだとすると、このコードは関数を定義しているだけで起動していないので、実行しても何も起きません。
そのあたりのことがわからないうちは、質問にあるようなコードは手に負えないと思います。

それでも、興味があるのでやってみたいということなら。
■ まずはコードをそのまま移す
現在のコードは手で書き写したのでしょうか?
そうであれば、まずはそのままコピーして貼り付けてみましょう。 そして、インデントも含めて違いがないかどうかよく確かめます。
■ 実行環境を調える。
参照先のサイトの情報は必要な環境の調え方などは載っていませんので、必要なモジュールはimport文を見ればわかるはずなので、入れるなどします。
■実行する
たぶんエラーが出るでしょう。
問題を見つけて対処します。

投稿2022/11/26 10:02

TakaiY

総合スコア14545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aoihello

2022/11/26 10:32

ご回答ありがとうございます。 Pythonについてインデントも理解していなかったため、参照サイトのコピペとも見比べながら勉強してから行おうと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問