for文の勉強をしていたら、よく映画やドラマで見る4ケタの暗証番号を自動で割り出す機能の基礎となる部分を簡単に作れるのでは?と思ってしまったので、その内容について記します。あくまで初心者の発想なので、本当はもっと緻密なコードになっているかと思います。また、不正アクセスを助長するものではありません。不適切であれば非公開にしますので、コメント等頂ければと思います。
ブルートフォース(brute force)攻撃とは?
日本語でいうと「総当たり攻撃」と言われるものです。パスワードや暗証番号を割り出すために使われる不正アクセスの手法で、今回、例として取り上げた4ケタの暗証番号だと0000から始まって0001、0002、…、9999とパスワードに使われる可能性のある文字の組み合わせを全て試す攻撃になります。
Step1:全体のアルゴリズムを考える
もっとスマートなやり方はあると思うのですが、for文で完結させたいので、次のように考えます。まず、次のように各桁の数値にそれぞれ変数を割り振ります。

そして、num1~3は数値固定(0のまま)でnum4が0、1、2…9と変化していき、9まで代入されたら、次にnum4は0に変わり、num3が1に変わるようにします。そして、num4が再び0、1、…9と変化していき、num4が0に変わるタイミングでnum3が2に変わるようにします。
num2についても同様に、始めは0ですが、num3が9まで代入され、0に変わるタイミングでnum2が1に変わるようにします。num1についても同様に、num2が9まで代入され、0に変わるタイミングで、num1が1に変わるようにします。
こう考えるとfor文の入れ子の対応でできそうです。一番内側のループはnum4、次に内側のループはnum3、その次はnum2、一番外側はnum1となります(下図)。内側のループが9→0に変わるタイミングで、その外側のループは1つ番号が繰り上がるイメージです(わかりにくい?)。一番内側のループはかなりグルグル回る事になります。

Step2:変数num4に0~9の値を順に代入、9まで代入したら0に戻るようにする。
いきなり4つの変数を動かすコードを書くのは大変なので(間違える可能性もあるので)、まずは変数num4だけに着目します。num4の値を0、1、2…と変わっていくようにし、9まで終えたら0に戻るようにします。
0~9までの数値を出力
num4に0~9の値を代入します。基本的なfor文の使い方です。
for num4 in range(10):
print(num4)
'''
【実行結果】
0
1
2
3
4
5
6
7
8
99まで代入したら、0に戻るようにする
上記のコードで一度繰り返し(ループ)処理が終われば0に戻るので、大丈夫です。上記コードで9までの値が代入されれば繰り返し処理が終わるようになっているので、OKです。
Step3:num4のループが1回終了したら、num3の値を1つ繰り上げる。
num4が9まで代入されて、ループ処理が終わったらnum3の値を1つ繰り上げる(例:0→1)になるようにしたいと思います。
for num3 in range(10):
for num4 in range(10):
print(str(num3) + str(num4))
'''
【実行結果】
00
01
02
03
04
05
06
07
08
09
10
11
・
・
・
96
97
98
99Step4: num3のループが1回終了したら、num2の値を1つ繰り上げる。
ここは先ほどと同じ考え方でfor文の入れ子が1つ増えるだけです。そしてprint()関数の中にもstr(num2)を追加します。
for num2 in range(10):
for num3 in range(10):
for num4 in range(10):
print(str(num2) + str(num3) + str(num4))
'''
【実行結果】
000
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
・
・
・
996
997
998
999最終Step:num2のループが1回終了したら、num1の値を1つ繰り上げる。
ここも先程と同じ考え方です。入れ子が一つ増えます。そして、print()関数にもstr(num1)を追加します。
for num1 in range(10):
for num2 in range(10):
for num3 in range(10):
for num4 in range(10):
print(str(num1) + str(num2) + str(num3) + str(num4))
'''
【実行結果】
0000
0001
0002
0003
0004
0005
・
・
・
9996
9997
9998
99990000から始まり9999まで順番に出力する事ができました。実際のブルートフォース攻撃では、これに加えて、パスワードと一致しているかどうかなどのコードも追記されていくのかなと思います。

コメント