pythonで自動化

【パスワード総当たり】総当たりでパスワードが解かれるまでの時間を調べてみた【Python】

この記事では、総当たりで調べた時にパスワードがどのくらいの時間で解かれてしまうのかを調べるプログラムを作ったので紹介します。

パスワード総当たりプログラムについて

総当たりプログラムの考え方

今回は、とりあえず総当たりで調べるプログラムを作りたかったので、繰り返し処理を用いて各要素にa~zを追加しています。

例えば、[a,b,c]の配列があれば各要素の末尾に[a,b,c]を加えることで、[aa,ab,ac,ba,bb,bc,ca,cb,cc]というような配列を作っています。

ソースコード

以下が私の作ったコードです。

import time
import matplotlib.pyplot as plt


def sol_pass(password, preList):
    list = ['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']

    ans = []
    if(preList == ''):
        for j in(list):
            if(j == password):
                print('Success')
                print(j)
                return
            ans.append(j)
        sol_pass(password, ans)
    else:
        for i in(preList):
            for j in(list):
                if((i+j) == password):
                    print('Success')
                    print(i+j)
                    return
                ans.append(i+j)
        sol_pass(password, ans)


def main(password):
    startTime = time.time()
    sol_pass(password, '')
    endTime = time.time()
    print('実行時間:', endTime-startTime, '秒')
    return endTime-startTime


if __name__ == '__main__':
    num = []
    x = []
    num.append(main('p'))
    num.append(main('pa'))
    num.append(main('pas'))
    num.append(main('pass'))
    num.append(main('passw'))
    num.append(main('passwo'))
    # num.append(main('passwor'))
    # num.append(main('password'))
    for i in range(len(num)):
        x.append(i)
    plt.plot(x, num)
    plt.show()

 

実行結果

パスワードかかった時間
p0.001秒
pa0.0秒
pas0.006秒
pass0.11秒
passw2.645秒
passwo71.976秒

グラフ

今回は小文字英字のみで6文字までの結果を求めました。

7文字にした場合、現状ではメモリエラーが発生してしまうため6文字で止めています。

まとめ

今回やってみて分かったのは6文字程度の短いパスワードだとあっという間にパスワードがばれてしまうことと、文字数が増えればそれに応じてパスワードが判明するまでにかかる時間もかなり長くなるということです。

今回は小文字英字のみでやっていますが、ここに数字や大文字、記号を入れることでさらに安全性が高いパスワードになるものと考えられます。